## page was renamed from Projet/SemaineTech2011/Ateliers/SQLetNOSQL/Conversation ## page was renamed from Projet/SemaineTech/Ateliers/SQLetNOSQL/Conversation {{{#! highlight irc (14:01:06) willy: ------------------------- DEBUT ATELIER : SQL et NoSQL ---------------------------------- (14:02:11) nacer.saidou-adamou: bonjour à tous (14:03:00) nacer.saidou-adamou: nous allons discuter d'un sujet très en vogue: les bases de données NoSQL (en fait, je vais pas parler de la partie SQL) (14:03:35) nacer.saidou-adamou: mais avant, comme d'accoutumé, on fait l'appel ;-) (14:03:49) nacer.saidou-adamou: un "." dans la liste tech pour dire qu'on est là (14:04:53) nacer.saidou-adamou: bon je vais continuer (14:05:12) nacer.saidou-adamou: voici l'agenda de notre discussion: (14:05:53) nacer.saidou-adamou: 1- Premiers pas avec les BDD NoSQL (14:06:04) nacer.saidou-adamou: 2- Les familles de BDD NoSQL (14:06:20) nacer.saidou-adamou: 3- Expérimentons avec CouchDB (14:06:36) nacer.saidou-adamou: 4- L'état d'adoption des solutions NoSQL (14:07:04) nacer.saidou-adamou: NoSQL = Not Only SQL (et non NOt SQL ;-) ) (14:07:31) nacer.saidou-adamou: il s'agit d'un ensemble de solutions de bases de données qui partagent au moins les deux caractéristiques suivantes: (14:08:13) nacer.saidou-adamou: - les données ne sont pas stockées suivant une logique relationnelle (table, clé étrangère, troisième forme normale et consort) (14:08:49) nacer.saidou-adamou: - elles ne proposent pas une interface de requêtage (passez moi l'expression) basée sur SQL (14:09:15) nacer.saidou-adamou: en dehors de ces deux caractéristiques de base (14:09:48) nacer.saidou-adamou: elles présentent EN GENERAL (mais pas toujours) (14:09:55) nacer.saidou-adamou: les propriétés suivantes: (14:10:36) nacer.saidou-adamou: elle ne supporte pas ou partiellement les propriétés ACID caractéristiques des bases de données transactionnelles (14:11:12) nacer.saidou-adamou: elles ne supportent en général pas aussi des opérations de jointure, (14:11:46) nacer.saidou-adamou: les données ne sont pas stockés suivant un schéma de tables (comme pour les SGBDR) (14:11:58) nacer.saidou-adamou: etc (14:13:42) nacer.saidou-adamou: comme on le verra (si on a le temps) avec couchdb, ces propriétés (et celle particulière d'être schema-less) leur permettent d'être bien adaptées à la gestion de grande quantité de données (l'implication inverse n'est pas vrai, attention) (14:13:51) nacer.saidou-adamou: Questions please (14:13:55) willy: livier.larcheveque: QUESTION : ca siginfie quoi ACID ? (14:14:32) nacer.saidou-adamou: ben ACID est un sigle désignant les propriétés d'une transaction (14:14:37) nacer.saidou-adamou: A = atomicité (14:14:52) nacer.saidou-adamou: la transaction s'effectue entièrement ou pas du tout (14:15:00) nacer.saidou-adamou: C = Cohérence (14:15:17) nacer.saidou-adamou: la cohérence des données doit être assurée dans tous les cas (14:15:34) nacer.saidou-adamou: même si une erreur survient et que la transaction ne va pas jusqu'au bout (14:15:48) nacer.saidou-adamou: I= isolation (14:16:06) nacer.saidou-adamou: la transaction travaille en monde clos (ie elle seule voit les données qu'elle manipule) (14:16:18) nacer.saidou-adamou: D = Durabilité (14:16:55) nacer.saidou-adamou: la BD est dans un état stable durable après l'application de la transaction (14:16:56) nacer.saidou-adamou: voilà (14:16:59) nacer.saidou-adamou: suite? (14:17:15) ***nacer.saidou-adamou remercie Darko (14:17:26) nacer.saidou-adamou: bon je continue (14:17:58) nacer.saidou-adamou: les solutions de bases de données NoSQL ne partagent en réalité que les deux propriétés de base que j'ai présenté ci-dessus (14:18:17) nacer.saidou-adamou: elles sont très différentes les unes des autres (14:19:22) nacer.saidou-adamou: cependant, en se basant sur le mode de représentation des données stockées, et d'accès à ces données, on peut identifier 4 familles de bases de données NoSQL (14:19:36) nacer.saidou-adamou: 1- les BDD de type 'clé-valeur' (14:20:01) nacer.saidou-adamou: elles fonctionnent un peut comme des tableaux associatifs (14:20:21) nacer.saidou-adamou: on a une clé qui donne directement accès à une donnée simple (14:20:41) nacer.saidou-adamou: elles sont de type cache (14:21:04) nacer.saidou-adamou: et par conséquent partagent une des propriétés des caches: des performances excellentes (14:21:15) nacer.saidou-adamou: Comme exemple: (14:21:31) nacer.saidou-adamou: Riak (http://riak.basho.com) (14:21:43) nacer.saidou-adamou: Redis (http://code.google.com/p/redis) (14:22:15) nacer.saidou-adamou: VolDeMort (;-) c'est pas moi qui lui ai donné ce nom :-D ) http://project-voldemort.com/ (14:22:17) nacer.saidou-adamou: etc (14:22:41) nacer.saidou-adamou: 2- Bases de données orientée colonnes (ou "clé - multivaleur") (14:23:13) nacer.saidou-adamou: normalement dans les SGBDR, les données sont organisées dans des tables statiques (14:23:52) nacer.saidou-adamou: (ie fixe: on connait les différentes colonnes qui constituent la table et toutes les lignes (ou enregistrements) de la tables partagent les mêmes colonnes) (14:24:46) nacer.saidou-adamou: dans cette approche, la clé (pensé à un rowid ou clé primaire ) va donnée accès à une liste de colonnes ayant chacune une valeur (14:25:06) nacer.saidou-adamou: ainsi, deux enregistrement (row - ligne) n'ont pas forcément les mêmes colonnes (14:26:10) nacer.saidou-adamou: exemple: HBase http://hadoop.apache.org/hbase (14:26:24) nacer.saidou-adamou: cassandra: http://cassandra.apache.org (14:26:49) nacer.saidou-adamou: 3- Bases de données orientée document (14:27:14) nacer.saidou-adamou: Ce type de représentation est particulièrement adaptée au monde du web (14:27:26) nacer.saidou-adamou: c'est une extension du modèle clé - valeur (14:27:42) nacer.saidou-adamou: sauf que la valeur ici n'est plus de type simple (14:27:49) nacer.saidou-adamou: mais plutôt un document (14:28:19) nacer.saidou-adamou: ici par document, j'entends un ensemble de données organisées de manière hiérarchique à la xml ou json (14:28:38) nacer.saidou-adamou: Résultat: (14:29:02) nacer.saidou-adamou: - possibilité d'indexation du document via différents champs (14:29:03) nacer.saidou-adamou: de ce document (14:29:19) nacer.saidou-adamou: - possibilité de réaliser des requêtes élaborées (14:29:33) nacer.saidou-adamou: Exemple: couchdb http://couchdb.apache.org/ (14:29:51) nacer.saidou-adamou: mongodb http://www.mongodb.org/ (14:30:04) nacer.saidou-adamou: enfin la dernière famille (14:30:16) nacer.saidou-adamou: Bases de données orientée graphe (14:31:09) nacer.saidou-adamou: Ce type de base de données est adaptée pour la représentation, le stockage et la manipulation de données complexes liées par des relations non triviales ou variable (14:31:12) nacer.saidou-adamou: variables (14:31:44) nacer.saidou-adamou: exemple de type d'information stockée sous forme de graphe: les liens dans les réseaux sociaux (14:32:05) nacer.saidou-adamou: Exemples: neo4j http://neo4j.org/ (14:32:24) nacer.saidou-adamou: hypergraphdb: http://www.kobrix.com (14:32:30) nacer.saidou-adamou: etc (14:32:43) nacer.saidou-adamou: voilà (14:32:44) nacer.saidou-adamou: questions? (14:33:09) nacer.saidou-adamou: bon on continue (14:33:53) nacer.saidou-adamou: Nous passons à la partie pratique de la présentation (14:34:35) nacer.saidou-adamou: j'espère que vous avez tous couch-bin installé ;-) (14:35:34) nacer.saidou-adamou: il semble que c'est couchdb-bin (14:35:37) nacer.saidou-adamou: autant pour moi (14:36:54) nacer.saidou-adamou: couchdb comme nous l'avons vu appartient à la classe des bdd orienté document (14:37:13) nacer.saidou-adamou: il est ecrit en erlang (tout comme ejabberd par exemple) (14:37:35) nacer.saidou-adamou: erlang est un langage particulièrement adapté pour le distribué (14:38:10) nacer.saidou-adamou: ce qui prédit bien la bonne aptitude de couchdb à fonctionner en mode distribué (14:38:30) nacer.saidou-adamou: et même en mode déconnecté (14:38:54) nacer.saidou-adamou: par exemple, vous écrivez une petite application pour téléphone (14:39:11) nacer.saidou-adamou: hébergeant les données sur une instance local couchdb (14:39:38) nacer.saidou-adamou: qui se synchronise avec une autre instance hébergé sur un serveur à mtl par exemple (14:40:01) nacer.saidou-adamou: chaque fois que vous êtes hors connexion, vous travaillez en mode déconnecté avec votre instance local (14:40:11) nacer.saidou-adamou: qui se synchronise automatiquement une fois en ligne (14:40:33) nacer.saidou-adamou: votre application n'aura pas à gérer cette synchro, ni même à en avoir connaissance (14:40:35) nacer.saidou-adamou: à méditer (14:40:44) nacer.saidou-adamou: revenons à couchdb et ouvrez un terminal (14:41:02) nacer.saidou-adamou: ah oui, une autre précision avant de commencer (14:41:34) nacer.saidou-adamou: les documents sont stockés sur le serveur au format json (14:41:53) nacer.saidou-adamou: et couchdb propose une ap http restful (on retrouve le fameux REST ...) (14:42:33) nacer.saidou-adamou: couchdb utilise mapreduce pour calculer les views (voyez ca un peu comme les vues sql pour le moment) (14:42:54) nacer.saidou-adamou: et supporte les propriétés acid au niveau document (14:43:09) nacer.saidou-adamou: ceci dit, allons y (14:43:27) nacer.saidou-adamou: créons une base de données que nous allons appelé utilisateurs (14:43:48) nacer.saidou-adamou: $ curl -X PUT http://localhost:5984/utilisateurs (14:44:35) nacer.saidou-adamou: vous devez recevoir en retour un document en json (14:44:43) nacer.saidou-adamou: {"ok":true} (14:44:52) nacer.saidou-adamou: c'est bon chez tous? (14:45:20) nacer.saidou-adamou: nous allons créer dans la bd utilisateurs le document ari (14:45:49) nacer.saidou-adamou: $ curl -X PUT http://localhost:5984/utilisateurs/ari -d @- (14:46:29) nacer.saidou-adamou: { "nom" : "ARI", "prenom":"semainetech", "login":"ari"} (14:46:42) nacer.saidou-adamou: petit pause (14:46:55) nacer.saidou-adamou: le serveur couchdb écoute par defaut sur le port 5984 (14:47:18) nacer.saidou-adamou: l'interaction se fait via les méthodes http comme vous l'avez vu (14:47:22) nacer.saidou-adamou: PUT pour créer (14:47:25) nacer.saidou-adamou: GET pour lire (14:47:38) nacer.saidou-adamou: DELETE pour effacer et UPDATE pour mettre à jour (14:48:03) nacer.saidou-adamou: la commande précédente doit retourner (14:48:08) nacer.saidou-adamou: quelque chose du genre (14:48:32) nacer.saidou-adamou: {"ok":true, "id":"ari", "rev":"xxxx"} (14:48:47) nacer.saidou-adamou: encore une petit pause pour parler du champ "rev" (14:49:41) nacer.saidou-adamou: couchdb n'assure pas la protection des données de la bd via les verroux comme les solutions SGBDR (14:49:53) nacer.saidou-adamou: mais plutot en versionnalisant celle-ci (14:50:22) nacer.saidou-adamou: chaque modification des données est associé à un numéro de révision (un peu comme les commit pour git) (14:50:55) nacer.saidou-adamou: si nous modifier le meme document, nos modifications, si elle ne sont pas en conflit aurons des "rev" différents (14:51:06) nacer.saidou-adamou: bon, on continue (14:51:15) nacer.saidou-adamou: on n' a plus de temps (14:51:33) nacer.saidou-adamou: Attention (14:51:47) nacer.saidou-adamou: pour la commande curl précédent, n'allez pas à la ligne (14:51:57) nacer.saidou-adamou: ou faites \