NoSQL et MongoDB ne vous dise probablement pas grand chose, mais cela va changer !

Si le mot NoSQL ne vous dit rien pour le moment, la tendance devrait bientôt changer dans peu de temps. NoSQL ou "Not only SQL" est un mouvement très récent (2009), qui vous l'aurez compris, concerne les bases de données.
L'idée du mouvement est simple: Proposer des alternatives aux bases de données relationnelles pour coller aux nouvelles tendances et architectures du moment, notamment le Cloud Computing.
Les axes principaux du NoSQL: haute disponibilité et partitionnement des données, au détriment de la consistance.
Alors que les bases de données relationnelles actuelles sont basées sur le concept ACID (Atomicité, Consistance, Isolation, Durabilité), le NoSQL prône l'abandon de ces contraintes.
Le NoSQL s'annonce donc comme une réponse aux limites du relationnel et du monde ACID. Et les géants du web l'ont bien compris, tous abandonnent petit à petit leur BDD relationnelle au profit des principes du NoSQL:
Aujourd'hui, nous allons nous intéresser à une base de données NoSQL qui commence à gagner en maturité: MongoDB.
MongoDB est une base de données "orientée document". Totalement open-source, cette dernière est développée en C++.
Contrairement à MySQL par exemple, MongoDB va stocker des données sous forme de JSON.
Comme toutes bases de données, il sera possible d'effectuer des requêtes dynamiques pour récupérer vos données, définir des index pour améliorer les performances, insérer des données et les mettre à jour etc. La grande différence avec MySQL, c'est sans doute l'absence de tables.
En effet, vous n'aurez pas à créer un schéma de BDD à respecter. Tout est dynamique, vous pourrez à tout moment créer de nouvelles propriétés, sans pour autant perdre en performances ! Pour comprendre, rien de mieux qu'un exemple pratique.
Comparons MongoDB et MySQL sur un exemple simple: Des articles liés à des commentaires. Avec MySQL, nous aurions été obligé dans un premier temps de créer deux tables:
article
commentaire
Puis nous aurions inséré les données avec une requêtes INSERT INTO. Avec MongoDB, la stracture est créée automatiquement à la première insertion et peut changer à tout moment, exemple:
var article = { titre: 'MongoDB exemple',
texte: "Ceci est un test d'article pour tester MongoDB",
date: new Date('03-03-2010'),
auteur: 'DJo',
comments : [ { text: 'Super article !!', date: new Date('03-04-2010'), auteur: 'Toto' },
{ text: 'Je confirme, le NoSQL ça déchire !', date: new Date('03-04-2010'), auteur: 'Novaway' }]
}
db.articles.insert(article);
Et voilà, nous avons stocké nos données article et commentaire dans MongoDB. Pratique non ?
Vous aurez remarqué qu'on ne spécifie pas d'id aux éléments. Cette tâche est automatiquement effectuée par MongoDB.
Un champ "_id" est présent pour chaque donnée afin de conserver l'identification et l'unicité des données.
MongoDB n'utilise pas des tables, mais des collections. En faisant db.articles.insert, nous avons inséré les données dans la collection "articles".
Maintenant, comment récupérer notre article ?
Avec MySQL nous aurions fait un simple SELECT sur la table article, avec MongoDB voilà comment faire:
db.articles.find( { titre: 'MongoDB exemple' }, { comments: 0 } );
Ici, nous allons chercher les articles dont le titre est "MongoDB exemple". Nous voudrons récupérer tous les champs, sauf les commentaires, d'où le comments: 0.
Vous pouvez essayer de manipuler les données sur le shell MongoDB de démo.
Pour en savoir plus sur le fonctionnement de la BDD, allez consuter le manuel, il est bien documenté et facile à comprendre.
La question qui doit vous venir à présent est: Mais comment utiliser MongoDB avec mon site PHP ?
La réponse est simple: En utilisant le driver MongoDB de PHP.
En effet, PHP intègre directement une classe Mongo permettant d'intéragir avec la base de données.
Se connecter à la base MongoDB en PHP
Première étape, la connexion à votre BDD locale:
$con = new Mongo(); // Connexion sur localhost:27017
Choisir la bases de données sur laquelle travailler
Comme pour MySQL, nous devons spécifier quelle base utiliser:
$db = $con->nombasededonnees;
Insérer des données dans une collection MongoDB en PHP
Reprenons notre exemple et insérons dans la base notre article et ses commentaires:
$article = array("titre" => 'MongoDB exemple',
"texte" => 'Ceci est un test d'article pour tester MongoDB',
"date" => '2009-03-03',
"auteur" => 'DJo',
"comments" => array(
array("texte" => 'Super article !!',
"date" => '2009-03-04',
"auteur" => 'Toto'),
array("texte" => 'Je confirme, le NoSQL ça déchire !',
"date" => '2009-03-04',
"auteur" => 'Novaway')
)
);
$db->articles->insert($article);
Sélectionner une collection en PHP
Nous souhaitons à présent récupérer la collection de nos articles:
$collectionArticles = $db->articles;
Sélectionner une valeur d'une collection MongoDB
Maintenant, nous allons récupérer l'article que l'on souhaite afficher:
$query = array( "titre" => "MongoDB exemple");
$champs = array('comments' => 0);
$article = $collectionArticles->findOne($query, $champs);
En retour, vous obtiendrez un tableau associatif de votre article.
Créer un index sur un champ MongoDB
Pour optimiser les performances de sélection de vos données, il faudra ajouter un index sur le titre des articles, voici comment le faire:
$collectionArticles->ensureIndex( array( "titre" => 1 ) );
Les index sont indispensables pour les requêtes en lecture, mais peuvent ralentir les insertions. Il faut donc les utiliser à bon escient.
Voici quelques exemples d'utilisation, retrouvez toutes les méthodes sur la documentation officielle de PHP.
Alors que pensez-vous de MongoDB ?
Prochainement, nous verrons plus en détail la BDD Cassandra récemment adoptée par Facebook.
Comme MySQL et phpMyAdmin, il existe des plateformes PHP pour gérer votre base de données MongoDB visuellement:
Opricot: Outil permettant de faire les commandes basiques pour gérer votre MongoDB

PHPMoAdmin: L'alternative à phpMyAdmin pour MongoDB

A voir aussi sur le même sujet:
Pour poster un commentaire, vous devez être identifié. Vous pouvez choisir parmi ces trois méthodes d'identification:
Compte la Ferme du WebIdentifiez-vousInscrivez-vous |
Compte Facebook
|
Compte Twitter
|