Hervé Leclerc – Alter Way – SSL 2011



    Présentation
        de 2
  Bases de données
       NoSQL
Type de bases
 Document
 Graph
 Clé / Valeur
 Colonne
 Eventuellement Consistante
Document

                                             terrastore




                                                                                    thrudb
                    SisoDb
                      Simple Structure Oriented Db




Nom=“Leclerc", Addresse=“6 Rue Gambetta", Hobby=“moto".
Nom="Vollong", Addresse="15 Bld X", Enfants=[{Name:« Victor",Age:10}, {Name:« Leopold", Age:8}].
Graph

                                                       Vertexdb
                                  Dex




                   FlockDB



Nœuds (entités) , propriétés, liens (d’intéractions)
Clé / Valeur

                 Tokyo Tyrant




                  GT.M


                scalaris
                                                                                     RaptorDB
                 MemcacheDB



[client 1] get(1234) => {" nom":« leclerc", "email":« herve.leclerc@linkedin.com"}
Colonne




                          1,2,3;
 1,Smith,Joe,40000;
                          Smith,Jones,Johnson;
 2,Jones,Mary,50000;
                          Joe,Mary,Cathy;
 3,Johnson,Cathy,44000;
                          40000,50000,44000;
Eventuellement Consistante



   Dynamo

                  Dynomite (Framework)



            KAI
Focus sur 2 bases orientées Document


                          http://www.mongodb.org




http://www.orientechnologies.com
MongoDB
   Wikipedia : MongoDB permet de manipuler des
    objets structurés en BSON (JSON binaire), sans
    schéma prédéterminé mais en permettant d'indexer
    n'importe quel attribut.
   BSON : Spécifications : http://bsonspec.org/
   Les attributs peuvent être ajoutés, supprimés,
    modifiés et renommés à n'importe quel moment.
   Sharding (partition) automatique
   Réplication
   Haute disponibilité
   Map Reduce
   GidFS
   Support Commercial
Qui l’utilise ?




             etc
   D’origine Italienne
   Tout comme MongoDB elle est axée sur la
    scalabilité
   Annoncée pour encaisser des charges en
    entrée de 150 000 enreg/sec sur un
    notebook Dell XPS 1530
   Peu d’empreintes physiques
   Pas d’adhérence de librairies
   A la fois Document et Graph
   ++ les relations
Qui l’utilise ?




Hummmm…. ?
Comparaisons
Licence                   Open Source (AGPL)        Open Source License
                                                    Apache 2.0.
Langage                   C++                       Java

Type de schéma            Schema-less               Schema-less
                                                    Schema-full et Hybrid
Modèle de données         Document (BSON)           Document (JSON), Graph,
                                                    Key-Value et Objet
Méthode d’interrogation   JavaScript/ECMAScript,    API calls, HTTP, JSON,
                          API calls, JSON           JavaScript/ECMAScript,
                                                    REST, SQL, SparQL
Réplication               Master-Master Master-     Cluster
                          Slave
Interface                 Custom TCP/IP + RESTful   http RESTful

Transactions ACID         non                       Oui
Comparaisons
Map and reduce        Oui               Non

Unicode               Oui               Oui

Recherche full Text   Non               Oui

Intégrité             Base              Base, ACID, MVCC

Transactions          Non               Oui

Sharding              Oui               Non

OS                    X Platforme       X Plateforme

Site                  www.mongodb.org   www.orientechnologies.com
Comparaisons

Connexion à la base

           > connect remote:localhost/demo admin admin
           > connect local:${ORIENTDB_HOME}/databases/ssl2011 admin admin

            Connecting to database [remote:localhost/demo] with user 'admin'...OK




           > use ssl2011
            Switched to db ssl2011
Comparaisons

Créer une base

           > create database remote:localhost/ssl2011 admin admin local
            Creating database [remote:localhost/ssl2011] using the storage type
            [local]...
            Connecting to database [remote:localhost/ssl2011] with user
            'admin'...OK
            Database created successfully.

            Current database is: remote:localhost/ssl2011


           > use ssl2011
            Switched to db ssl2011
Comparaisons

Afficher les composants de la base

               > classes
   CLASSES:
   ----------------------------------------------+------+---------------------+-----------+
    NAME                                         | ID | CLUSTERS              | RECORDS   |
   ----------------------------------------------+------+---------------------+-----------+
    Whiz                                         |    5 | 11                  |      1000 |
    OUser                                        |    1 | 4                   |         3 |
    GraphMotocycle                               |   16 | 22                  |         2 |
   ----------------------------------------------+------+---------------------+-----------+
    TOTAL                                                                           12518 |
   ---------------------------------------------------------------------------------------+


              > show collections
                equipements
                system.indexes
                users
Comparaisons

Retrouver les éléments

            > select from OUser
            > select from OUser where name = 'admin';
            ---+--------+--------------------+--------------------+--------------------+--------------------
              #| REC ID |STATUS              |NAME                |ROLES               |PASSWORD
            ---+--------+--------------------+--------------------+--------------------+--------------------
              0|    #4:0|ACTIVE              |admin               |[1]
            |8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918
            ---+--------+--------------------+--------------------+--------------------+--------------------



           > db.users.find();
           > db.users.find({username:"user_1"});
            { "date" : ISODate("2011-04-10T13:55:10.378Z"), "_id" : ObjectId("4da3083ecf2e667e1b000001"),
            "username" : "user_1", "password" : "password1" }
Comparaisons

Retrouver les éléments

•   select from Account where address.city.country.name = ‘France'
•   select from Account where addresses contains (city.country.name = ‘France')
•   select from Profile where any() like '%herve%'
•   select from Tree where children contains ( married = true )
•   select from User where roles containsKey 'shutdown'
•   select from Vehicle where @class = 'Car'
•   select from Friend where @version > 100
Comparaisons

Retrouver les éléments


db.collector.find().count()
db.collector.find({"variables.var9" : {$ne:null}}).count()
db.collector.find({"sensor_id" : "4d768db2b456989f3e000000", "variables.var9" : /to/i})
db.collector.find({"sensor_id" : "4d768db2b456989f3e000000"}).count()
db.collector.find({"sensor_id" : "4d768db2b456989f3e000000", "variables.var9" :
/to/i}).count()
Comparaisons

Insérer des éléments
           > create class users_ssl2011
           > insert into users_ssl2011 (username,password) values
           ('hleclerc','test')
           > insert into users_ssl2011 (username,password,mail) values
           ('hme','test','herve.leclerc@gmail.com')
           ---+--------+--------------------+--------------------
             #| REC ID |USERNAME            |PASSWORD
           ---+--------+--------------------+--------------------
             0|    #6:0|hleclerc            |test
             1|    #6:1|hme                 |test                |herve.leclerc@gmail.com
           ---+--------+--------------------+--------------------+--------------------


           > db.users_ssl2011.save( { username:"hleclerc" } )
           > db.users_ssl2011.save( { username:"hl", email: "hl@gmail.com"} )
           > db.users_ssl2011.find()
            { "_id" : ObjectId("4dc45753e74668e001d54cd1"), "username" : "hleclerc" }
            { "_id" : ObjectId("4dc46c07cc2193af6e31fc43"), "username" : "hleclerc", "email" : "hl@gmail.com" }
Comparaisons

modifier des éléments
           update products set KCal = 0 where KCal is null

           Updated 2 record(s) in 0,008000 sec(s)

           update People add friends = [Herve @rid] where @rid =
           [Marie @rid]




           > db.mycollection.save(x); // updates Si ca existe insertion sinon
           > myColl.update( { _id: X }, { _id: X, name: "herve", age: 45 }, true );
Comparaisons

Supprimer des éléments
           delete from Profile where surname.toLowerCase() = 'unknown‘
           delete from Profile where surname = 'Gates'




           > db.things.remove({}); // Supprime tout
           > db.things.remove({n:1}); // removes all where n == 1

           t.update( {'comments.by':'joe'}, $unset : { age : 1} }}, false, true )
OrientDB : Transactions ACID
  db.begin();
try {
  // code
  db.commit();
} catch (error) {
  db.rollback();
}
MongoDB : Transactions ACID
 MongoDB ne supporte les transactions
  ACID que sur les documents unitaires
 C’est un des reproches fait à MongoDB
  comparé par exemple à couchDB
OrientDB : Type de données complexes
   Gère nativement
     Les collections
     Les maps (clé valeur)
     Les documents inclus
MongoDB : Type de données complexes
   Tout est géré dans les collections sous
    forme d’enregistrement json
OrientDB : Relations
   Sont des liens direct
   Pas de jointure relationnelles entre les tables
   select * from city




   select * from city where country.name = 'Italy'
MongoDB : Relations
> p = db.postings.findOne();
  {
   "_id" : ObjectId("4b866f08234ae01d21d89604"),
   "author" : "jim",
   "title" : "Brewing Methods"
   }

> // Plus d’info sur l’auteur
> db.users.findOne( { _id : p.author } )
   {
   "_id" : "jim",
   "email" : "jim@gmail.com"
   }
MongoDB vs OrientDB
SELECT SUM(price) as prices, SUM(cost) as costs, prices-costs, margin/pric
  FROM Balance
                                            VS
function (key, values) {
  var price = 0.0, cost = 0.0, margin = 0.0, marginPercent = 0.0;
  for (var i = 0; i < values.length; i++) {
     price += values[i].price;
     cost += values[i].cost;
  }
  margin = price - cost;
  marginPercent = margin / price;
  return {
     price:       price,
     cost:        cost,
     margin:        margin,
     marginPercent: marginPercent
  };
}
MongoDB vs OrientDB
MongoDB : Drivers
OrientDB : Drivers
   JAVA
     Java (native) API
   Javascript
     Javascript Driver HTTP protocol
   Scala
   C Language binding
     OrientDB-C
   PHP
     OrientDB-PHP binary protocol
     Orient-odino HTTP protocol
   Ruby
     OrientDB-JRuby au travers du driver Java
   .NET
     .NET HTTP protocol
   Python
     Python HTTP protocol
Démo
SSL 2011 : Présentation de 2 bases noSQL

SSL 2011 : Présentation de 2 bases noSQL

  • 1.
    Hervé Leclerc –Alter Way – SSL 2011 Présentation de 2 Bases de données NoSQL
  • 3.
    Type de bases Document  Graph  Clé / Valeur  Colonne  Eventuellement Consistante
  • 4.
    Document terrastore thrudb SisoDb Simple Structure Oriented Db Nom=“Leclerc", Addresse=“6 Rue Gambetta", Hobby=“moto". Nom="Vollong", Addresse="15 Bld X", Enfants=[{Name:« Victor",Age:10}, {Name:« Leopold", Age:8}].
  • 5.
    Graph Vertexdb Dex FlockDB Nœuds (entités) , propriétés, liens (d’intéractions)
  • 6.
    Clé / Valeur Tokyo Tyrant GT.M scalaris RaptorDB MemcacheDB [client 1] get(1234) => {" nom":« leclerc", "email":« herve.leclerc@linkedin.com"}
  • 7.
    Colonne 1,2,3; 1,Smith,Joe,40000; Smith,Jones,Johnson; 2,Jones,Mary,50000; Joe,Mary,Cathy; 3,Johnson,Cathy,44000; 40000,50000,44000;
  • 8.
    Eventuellement Consistante Dynamo Dynomite (Framework) KAI
  • 9.
    Focus sur 2bases orientées Document http://www.mongodb.org http://www.orientechnologies.com
  • 10.
    MongoDB  Wikipedia : MongoDB permet de manipuler des objets structurés en BSON (JSON binaire), sans schéma prédéterminé mais en permettant d'indexer n'importe quel attribut.  BSON : Spécifications : http://bsonspec.org/  Les attributs peuvent être ajoutés, supprimés, modifiés et renommés à n'importe quel moment.  Sharding (partition) automatique  Réplication  Haute disponibilité  Map Reduce  GidFS  Support Commercial
  • 11.
  • 12.
    D’origine Italienne  Tout comme MongoDB elle est axée sur la scalabilité  Annoncée pour encaisser des charges en entrée de 150 000 enreg/sec sur un notebook Dell XPS 1530  Peu d’empreintes physiques  Pas d’adhérence de librairies  A la fois Document et Graph  ++ les relations
  • 13.
  • 14.
    Comparaisons Licence Open Source (AGPL) Open Source License Apache 2.0. Langage C++ Java Type de schéma Schema-less Schema-less Schema-full et Hybrid Modèle de données Document (BSON) Document (JSON), Graph, Key-Value et Objet Méthode d’interrogation JavaScript/ECMAScript, API calls, HTTP, JSON, API calls, JSON JavaScript/ECMAScript, REST, SQL, SparQL Réplication Master-Master Master- Cluster Slave Interface Custom TCP/IP + RESTful http RESTful Transactions ACID non Oui
  • 15.
    Comparaisons Map and reduce Oui Non Unicode Oui Oui Recherche full Text Non Oui Intégrité Base Base, ACID, MVCC Transactions Non Oui Sharding Oui Non OS X Platforme X Plateforme Site www.mongodb.org www.orientechnologies.com
  • 16.
    Comparaisons Connexion à labase > connect remote:localhost/demo admin admin > connect local:${ORIENTDB_HOME}/databases/ssl2011 admin admin Connecting to database [remote:localhost/demo] with user 'admin'...OK > use ssl2011 Switched to db ssl2011
  • 17.
    Comparaisons Créer une base > create database remote:localhost/ssl2011 admin admin local Creating database [remote:localhost/ssl2011] using the storage type [local]... Connecting to database [remote:localhost/ssl2011] with user 'admin'...OK Database created successfully. Current database is: remote:localhost/ssl2011 > use ssl2011 Switched to db ssl2011
  • 18.
    Comparaisons Afficher les composantsde la base > classes CLASSES: ----------------------------------------------+------+---------------------+-----------+ NAME | ID | CLUSTERS | RECORDS | ----------------------------------------------+------+---------------------+-----------+ Whiz | 5 | 11 | 1000 | OUser | 1 | 4 | 3 | GraphMotocycle | 16 | 22 | 2 | ----------------------------------------------+------+---------------------+-----------+ TOTAL 12518 | ---------------------------------------------------------------------------------------+ > show collections equipements system.indexes users
  • 19.
    Comparaisons Retrouver les éléments > select from OUser > select from OUser where name = 'admin'; ---+--------+--------------------+--------------------+--------------------+-------------------- #| REC ID |STATUS |NAME |ROLES |PASSWORD ---+--------+--------------------+--------------------+--------------------+-------------------- 0| #4:0|ACTIVE |admin |[1] |8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918 ---+--------+--------------------+--------------------+--------------------+-------------------- > db.users.find(); > db.users.find({username:"user_1"}); { "date" : ISODate("2011-04-10T13:55:10.378Z"), "_id" : ObjectId("4da3083ecf2e667e1b000001"), "username" : "user_1", "password" : "password1" }
  • 20.
    Comparaisons Retrouver les éléments • select from Account where address.city.country.name = ‘France' • select from Account where addresses contains (city.country.name = ‘France') • select from Profile where any() like '%herve%' • select from Tree where children contains ( married = true ) • select from User where roles containsKey 'shutdown' • select from Vehicle where @class = 'Car' • select from Friend where @version > 100
  • 21.
    Comparaisons Retrouver les éléments db.collector.find().count() db.collector.find({"variables.var9": {$ne:null}}).count() db.collector.find({"sensor_id" : "4d768db2b456989f3e000000", "variables.var9" : /to/i}) db.collector.find({"sensor_id" : "4d768db2b456989f3e000000"}).count() db.collector.find({"sensor_id" : "4d768db2b456989f3e000000", "variables.var9" : /to/i}).count()
  • 22.
    Comparaisons Insérer des éléments > create class users_ssl2011 > insert into users_ssl2011 (username,password) values ('hleclerc','test') > insert into users_ssl2011 (username,password,mail) values ('hme','test','herve.leclerc@gmail.com') ---+--------+--------------------+-------------------- #| REC ID |USERNAME |PASSWORD ---+--------+--------------------+-------------------- 0| #6:0|hleclerc |test 1| #6:1|hme |test |herve.leclerc@gmail.com ---+--------+--------------------+--------------------+-------------------- > db.users_ssl2011.save( { username:"hleclerc" } ) > db.users_ssl2011.save( { username:"hl", email: "hl@gmail.com"} ) > db.users_ssl2011.find() { "_id" : ObjectId("4dc45753e74668e001d54cd1"), "username" : "hleclerc" } { "_id" : ObjectId("4dc46c07cc2193af6e31fc43"), "username" : "hleclerc", "email" : "hl@gmail.com" }
  • 23.
    Comparaisons modifier des éléments update products set KCal = 0 where KCal is null Updated 2 record(s) in 0,008000 sec(s) update People add friends = [Herve @rid] where @rid = [Marie @rid] > db.mycollection.save(x); // updates Si ca existe insertion sinon > myColl.update( { _id: X }, { _id: X, name: "herve", age: 45 }, true );
  • 24.
    Comparaisons Supprimer des éléments delete from Profile where surname.toLowerCase() = 'unknown‘ delete from Profile where surname = 'Gates' > db.things.remove({}); // Supprime tout > db.things.remove({n:1}); // removes all where n == 1 t.update( {'comments.by':'joe'}, $unset : { age : 1} }}, false, true )
  • 25.
    OrientDB : TransactionsACID  db.begin(); try { // code db.commit(); } catch (error) { db.rollback(); }
  • 26.
    MongoDB : TransactionsACID  MongoDB ne supporte les transactions ACID que sur les documents unitaires  C’est un des reproches fait à MongoDB comparé par exemple à couchDB
  • 27.
    OrientDB : Typede données complexes  Gère nativement  Les collections  Les maps (clé valeur)  Les documents inclus
  • 28.
    MongoDB : Typede données complexes  Tout est géré dans les collections sous forme d’enregistrement json
  • 29.
    OrientDB : Relations  Sont des liens direct  Pas de jointure relationnelles entre les tables  select * from city  select * from city where country.name = 'Italy'
  • 30.
    MongoDB : Relations >p = db.postings.findOne(); { "_id" : ObjectId("4b866f08234ae01d21d89604"), "author" : "jim", "title" : "Brewing Methods" } > // Plus d’info sur l’auteur > db.users.findOne( { _id : p.author } ) { "_id" : "jim", "email" : "jim@gmail.com" }
  • 31.
    MongoDB vs OrientDB SELECTSUM(price) as prices, SUM(cost) as costs, prices-costs, margin/pric FROM Balance VS function (key, values) { var price = 0.0, cost = 0.0, margin = 0.0, marginPercent = 0.0; for (var i = 0; i < values.length; i++) { price += values[i].price; cost += values[i].cost; } margin = price - cost; marginPercent = margin / price; return { price: price, cost: cost, margin: margin, marginPercent: marginPercent }; }
  • 32.
  • 33.
  • 34.
    OrientDB : Drivers  JAVA  Java (native) API  Javascript  Javascript Driver HTTP protocol  Scala  C Language binding  OrientDB-C  PHP  OrientDB-PHP binary protocol  Orient-odino HTTP protocol  Ruby  OrientDB-JRuby au travers du driver Java  .NET  .NET HTTP protocol  Python  Python HTTP protocol
  • 35.