« retourner à la page principale du blog

MongoDB et autres bases de données NoSQL, le début d’une nouvelle ère

Depuis le printemps dernier, on entend parler de plus en plus du mouvement NoSQL. Pour ceux qui auraient eu la tête dans le sable pendant les derniers mois, il s’agit d’un mouvement qui cherche à trouver d’autres solutions pour la gestion des données que les RDBMS (bases de données relationnelles, à la MySQL / SQL Server). C’est donc le retour en force des bases de donnée key/value pair et autres formes de bases de données sans schéma.

Les problèmes des RDBMS

Les bases de données relationnelles ont comme caractéristique principale d’être très structurées. C’est sans doute la raison derrière leur grande popularité. Par contre, ce ne sont pas tous les problèmes qui tombent dans le moule de ce type d’architecture.

Aussi, il devient plutôt difficile, dépassé un certain point, de continuer à scaler horizontalement avec ce type de bases de données. On met la base de donnée sur un autre serveur, ensuite on ajoute des réplications pour avoir des master/slaves, on optimise nos requêtes… ça peut nous mener très loin, mais pas assez loin pour les gros joueurs. Le problème des performances était donc aussi une des motivations pour chercher une autre solution.

The new kids on the block

Alors voilà qu’apparait toutes les nouvelles bases de données et que le sujet se met à bouillonner. Tokyo, CouchDB, MongoDB, HBase (du projet Hadoop), Redis, Cassandra, etc.

Ces projets sont pour la plupart orienté sur la distributivité de la base de donnée. Elles ont été conçues à la base pour scaler horizontalement.

Essai de MongoDB avec PHP

J’ai donc décidé d’essayer un de ces systèmes: MongoDB. Il s’agit d’une base de donnée sans schéma: on y stock les données à peu près comme on veut et chaque entrées peut avoir des champs différents. L’installation est plutôt simple (du moins sous Linux), les fichiers binaires ou le code source sont disponible sur le site web. Lorsque le serveur est installé, il faut installer les drivers pour chaque langage que l’on compte utiliser (PHP, Python, Ruby, Java, etc. C++, lui, est inclu). J’ai donc installé le driver pour PHP à partir du code source sur le site web. Seulement ensuite je me suis rendu compte que j’aurais pu me sauver un peu de compilation en faisant simplement sudo pecl install mongo (sous Ubuntu).

Voici un exemple de code tiré à peu près du site de MongoDB pour insérer des données:

$m = new Mongo();
$collection = $m->selectDB( "foo" )->selectCollection( "bar" );

$doc = array( "name" => "MongoDB",
   "type" => "database",
   "count" => 1,
   "info" => (object)array( "x" => 203,
       "y" => 102),
   "versions" => array("0.9.7", "0.9.8", "0.9.9")
);

$collection->insert( $doc );

On les récupère ensuite:

$m = new Mongo();
$collection = $m->selectDB( "foo" )->selectCollection( "bar" );

$obj = $collection->findOne();

Ou on peut faire une requête pour plusieurs résultats:

$m = new Mongo();
$collection = $m->selectDB( "foo" )->selectCollection( "bar" );

$cursor = $collection->find( array('name' => 'MongoDB') );

while( $cursor->hasNext() ) {
    var_dump( $cursor->getNext() );
}

Simple, trop simple?

Avec les bases de données relationnelles, le simple apprentissage du SQL permettait de bien comprendre le paradigme des RDBMS et de bien s’en servir. Maintenant, avec les nouvelles bases de données qui apparaissent, nous avons beaucoup plus de flexibilité: on y met à peu près ce qu’on veut. Le prochain objet qu’on y insère n’a pas besoin de ressembler au précédent. Cette flexibilité est bienvenue et très puissante (par exemple, on peut faire rouler plusieurs version de la même application en même temps, selon le client, avec la même base de donnée, comme Google le fait avec Gmail).

Cette flexibilité et simplicité vient par contre au prix d’être complètement laissés à nous-même. Les RDBMS sont vieilles et son fonctionnement bien connu de tous. Des tonnes de livres ont été écrites sur MySQL, SQLite, SQL Server et l’architecture avec les RDBMS. Les fonctionnalités des nouvelles bases de données sont généralement bien documentées. C’est très simple (beaucoup plus simple qu’avec du SQL) d’y insérer et récupérer des entrées. Par contre, la façon de penser l’architecture d’applications qui utilisent ces bases de données est plutôt nébuleuse. Je n’ai pas encore vu de livre qui traitent de l’utilisation de ces systèmes et les blogs qui en glissent un mot parlent plutôt de l’architecture matérielle utilisée, des raisons qui ont poussés la migration et des raisons de leur choix particulier parmi les nouvelles bases de données.

On va continuer d’en entendre parler

Ceci dit, tout ce que j’ai lu à date sur le sujet est très positif. Est-ce révolutionnaire ou bien avait-on simplement besoin d’air frais? Une chose est sûr c’est que les bases de données « non-relationnelles » sont là pour rester. Par contre, elles n’écraseront pas les RDBMS pour toutes les situations de si tôt: elles ne sont pas (et ne tentent pas d’être) ACID. On continuera donc sans doute à utiliser les RDBMS pour les utilisations comme les transactions financières, où l’intégrité des données et l’utilisation de transactions (dans le sens SQL du terme) sont importantes.

Encore faut-il que nos universités abordent le sujet. Parions qu’ils n’en parleront pas avant un bon 10 ans!

Si vous connaissez une source (livre, blog, wiki, etc.) où on peut en apprendre sur la conception d’application et d’architecture avec ces nouvelles bases de données, laissez-moi savoir!

Un commentaire

  1. Paul Poulet dit :
    29 octobre 2009 à 15:36

    Salut,

    Un bon article. Pour ma part, j’ai essayé MongoDB avec Python. Les bases de données clef/valeur me semblent promises à un grand avenir non seulement en raison de leur souplesse, mais aussi de leur performances et de leurs capacités à être aisément scalables. Bref, je suis convaincu pour certains usages (notamment les applications web de gestion de contenus).
    Mais, pour avoir été formé à la méthode MERISE, je suis tout à fait d’accord pour dire que les « NoSQL » ne remplaceront pas les bases de données relationnelles en tout domaine…

    Bien le bonjour à nos amis Canadien :-)
    Paul Poulet, Paris.

Laisser un commentaire

« retourner à la page principale du blog