ssl 2011 : présentation de 2 bases nosql

Post on 25-Jun-2015

1.080 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Présentation au Salon Solution Linux 2011 de 2 bases de données NoSQL

TRANSCRIPT

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":« herve.leclerc@linkedin.com"}

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" : "hl@gmail.com" }

> insert into users_ssl2011 (username,password) values

('hleclerc','test')

> insert into users_ssl2011 (username,password,mail) values

('hme','test','herve.leclerc@gmail.com')

> db.users_ssl2011.save( { username:"hl", email: "hl@gmail.com"} )

> db.users_ssl2011.find()

---+--------+--------------------+-------------------- #| REC ID |USERNAME |PASSWORD ---+--------+--------------------+-------------------- 0| #6:0|hleclerc |test 1| #6:1|hme |test |herve.leclerc@gmail.com ---+--------+--------------------+--------------------+--------------------

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" : "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

Démo

top related