mardi 27 avril 2010

Cassandra - 5) Votre première base de données

Il est temps maintenant de créer sa première base de données soi même.
Que les choses soient claires de suite : la méthode que je vais expliquer est strictement personnel et n'engage que ma compréhension de Cassandra. Etant donné la nouveauté de Cassandra, il n'existe pas pour l'instant de "Best Practice" (meilleurs pratiques) dans l'organisation des données avec une base de données orientée ligne.

Comme nous l'avions vu avant, nous allons créer un "mini-Facebook" très basique.

1) Les démarches

Il faut commencer par réfléchir, longtemps si possible et se poser les questions suivantes :
_Quelles données dois-je enregistrer ?
_Quelles données devrai-je sortir souvent ? (et oui il n'y a pas vraiment de requêtes structurées comme dans SQL, ne l'oubliez pas !)
_Quelles sont les relations entre mes données ?

Si vous avez fait de l'UML, cela pourra vous être très utile pour formaliser ces simples questions. La solution par contre n'est pas aussi simple que l'ont pourrait le croire

2) Les résultats avec notre mini-Facebook

On a passé quelque temps à réfléchir sur les questions évoquées plus hauts et on s'est dit les choses suivantes :

On a besoin de gérer des gens (c'est très souvent le cas dans les bases de données), qui peuvent être reliés par des relations amicales.
Ces gens peuvent partager des photos et dire des trucs sur les "Walls" des autres.

On arrive donc avec les classes (cf UMLs) suivantes :
  • Personne
  • Wall
  • Relations Amicales
  • Photos
On a aussi les relations suivantes :
1 Personne = 1 Wall
1 Personne = (X Albums <=N Photos) (X albums et N photos dans les albums)
1 Personne = N Relations amicales

Cette approche n'est pas spécifique à Cassandra et peut être appliqué à peu près tout le temps quand vous souhaitez designer une base de données.

3) Penser ColumnFamily

Maintenant vient la partie entièrement axée sur Cassandra.
Dans la partie 2) Nous avons vu comment à partir d'un problème, en déduire des relations, maintenant il est temps de traduire ses relations par des structures de données.
Voici ce que je propose (Il faut insérer ce code dans storage-conf.xml à la suite de la balise fermante de Keyspace1 si vous ne l'avez pas supprimé) :
Ps : Blogger apparemment n'apprécie pas les balises XML, donc tant que j'ai pas trouvé de moyen pour qu'il ne fasse pas la substition, cliquez sur l'image ci dessous. Désolé pour la gène éventuelle.)





4) Explications :

Nous avons donc défini 4 ColumnFamilys qui transcrivent les relations que nous avons données dans le 2.
La première "Utilisateurs" contient les informations sur un utilisateur (nom, âge, identifiant, mot de passe). L'identifiant CompareWith="UTF8Type" signifique que les Column seront ordonnées par comparaison de leur nom. albert viendra avant bertrand qui viendra avant conrad.
La deuxième "Photos" est de type Super. Ceci permettra donc de définir dans les noms de SuperColumn les intitulés d'albums et dans les Columns, les photos en elles-même. Le CompareWith est TimeUUIDType qui est un identifiant basé sur un timestamp (en milliseconde), cf wikipedia + un nombre aléatoire. Ce TimeUUID assure une unicité du nom de la colonne.
La troisième "Wall" contient le wall d'une personne. Le compare With TimeUUID nous permet d'avoir les messages sur le Wall ordonnés temporellement.
Enfin "Relation" qui traduit pour une personne l'ensemble des gens qu'elle connait.

C'est est fini pour cette entrée de blog.
Comme d'habitude, n'hésitez pas à me corriger ou à poster vos commentaires.

Aucun commentaire:

Enregistrer un commentaire