(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 \ <retour à la ligne
(14:52:02) nacer.saidou-adamou: pour la continuation de la commande
(14:52:29) nacer.saidou-adamou: nous avons normalement créer l'utilisateur ari dans la base utilisateurs
(14:52:50) nacer.saidou-adamou: maintenant, interrogeons le serveur pour avoir les informations sur ari
(14:53:11) nacer.saidou-adamou: $ curl -X GET http://localhost:5984/utilisateurs/ari
(14:54:49) nacer.saidou-adamou: bon, ma machine me fait des misère, elle prend trop de temps pour me retourner le résultat de la commande
(14:54:57) nacer.saidou-adamou: mais vous devez avoir quelque chose du genre
(14:55:28) nacer.saidou-adamou: {"_id":"ari", "_rev":"xxx", "nom":"ARI", ...}
(14:56:33) nacer.saidou-adamou: faisons une petit expérience
(14:57:06) nacer.saidou-adamou: pour la question, de giotta: oui
(14:57:15) willy:
/me rappelle la question
(14:57:17) willy:
giotta: QUESTION : le mapreduce travaille avec "la dernière version" du document? l'équivalent du HEAD de git?
(14:57:53) nacer.saidou-adamou: mais il existe une interface web (http://localhost:5984/_utils
(14:58:30) nacer.saidou-adamou: qui permet d'appliquer le mapreduce sur une version particulière du document
(14:58:43) nacer.saidou-adamou: pour l'expérience:
(14:58:58) nacer.saidou-adamou: je crois qu'on la fera sur tech@
(14:59:18) nacer.saidou-adamou: il y a vraiment plein de truc à voir
(14:59:39) nacer.saidou-adamou: mais sachez que le mapreduce se fait avec javascript
(14:59:56) nacer.saidou-adamou: amusez vous bien, je dois malheureusement arrêter
(15:00:17) nacer.saidou-adamou: ==== FIN ATELIER ===
Projet/SemaineTech/2011/Ateliers/SQLetNOSQL/Conversation (dernière édition le 2012-04-02 15:13:06 par VictorBruneau)