ssl 2011 : présentation de 2 bases nosql
DESCRIPTION
Présentation au Salon Solution Linux 2011 de 2 bases de données NoSQLTRANSCRIPT
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
FlockDB
Dex
Nœuds (entités) , propriétés, liens (d’intéractions)
Clé / Valeur
Tokyo Tyrant
GT.M
RaptorDB MemcacheDB
scalaris
[client 1] get(1234) => {" nom":« leclerc", "email":« [email protected]"}
Colonne
1,Smith,Joe,40000;
2,Jones,Mary,50000;
3,Johnson,Cathy,44000;
1,2,3;
Smith,Jones,Johnson;
Joe,Mary,Cathy;
40000,50000,44000;
Eventuellement Consistante
KAI
Dynamo
Dynomite (Framework)
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…. ?
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, JSON
API calls, HTTP, JSON,
JavaScript/ECMAScript,
REST, SQL, SparQL
Réplication Master-Master Master-
Slave
Cluster
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
Comparaisons
> connect remote:localhost/demo admin admin
> connect local:${ORIENTDB_HOME}/databases/ssl2011 admin admin
Connexion à la base
Connecting to database [remote:localhost/demo] with user 'admin'...OK
> use ssl2011
Switched to db ssl2011
Comparaisons
> create database remote:localhost/ssl2011 admin admin local
Créer une base
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
> classes
Afficher les composants de la base
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
> select from OUser
Retrouver les éléments
> db.users.find();
{ "date" : ISODate("2011-04-10T13:55:10.378Z"), "_id" : ObjectId("4da3083ecf2e667e1b000001"),
"username" : "user_1", "password" : "password1" }
> select from OUser where name = 'admin'; ---+--------+--------------------+--------------------+--------------------+-------------------- #| REC ID |STATUS |NAME |ROLES |PASSWORD ---+--------+--------------------+--------------------+--------------------+-------------------- 0| #4:0|ACTIVE |admin |[1] |8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918 ---+--------+--------------------+--------------------+--------------------+--------------------
> db.users.find({username:"user_1"});
Comparaisons
• 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
Retrouver les éléments
Comparaisons
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()
Retrouver les éléments
Comparaisons
> create class users_ssl2011
Insérer des éléments
> db.users_ssl2011.save( { username:"hleclerc" } )
{ "_id" : ObjectId("4dc45753e74668e001d54cd1"), "username" : "hleclerc" }
{ "_id" : ObjectId("4dc46c07cc2193af6e31fc43"), "username" : "hleclerc", "email" : "[email protected]" }
> insert into users_ssl2011 (username,password) values
('hleclerc','test')
> insert into users_ssl2011 (username,password,mail) values
('hme','test','[email protected]')
> db.users_ssl2011.save( { username:"hl", email: "[email protected]"} )
> db.users_ssl2011.find()
---+--------+--------------------+-------------------- #| REC ID |USERNAME |PASSWORD ---+--------+--------------------+-------------------- 0| #6:0|hleclerc |test 1| #6:1|hme |test |[email protected] ---+--------+--------------------+--------------------+--------------------
Comparaisons
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]
modifier des éléments
> db.mycollection.save(x); // updates Si ca existe insertion sinon
> myColl.update( { _id: X }, { _id: X, name: "herve", age: 45 }, true );
Comparaisons
delete from Profile where surname.toLowerCase() = 'unknown‘
delete from Profile where surname = 'Gates'
Supprimer des éléments
> 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" : "[email protected]"
}
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