A l'occasion de l'apéro Ruby du mois de novembre 2012 de Compiegne.rb, Vincent Tabary de Notso.fr et Aymeric Brisse de Perfect Memory ont fait une présentation du serveur NoSQL mongoDB et de la gem MongoId.
3. compiegne.rb 15 nov. 2012
1. NoSQL
SGBD relationnels limités :
* pour load balancing
* pour une logique de « Big Data »
SGBD démocratisé depuis 2009
Systèmes destinés à Internet
Pourquoi NoSQL ?
Ne supporte pas langage SQL
4. compiegne.rb 15 nov. 2012
1. NoSQL
Basé sur le principe des tableaux associatifs
Intégre des technologies :
● clustering
● réplication
Retire certaines logiques :
● langage SQL
● stockage sous forme de matrice
Meilleures performances sur requêtes simples
6. compiegne.rb 15 nov. 2012
2. MongoDB
Serveur NoSQL open source
Réplication
Sharding : répartition sur des clusters
Requêtes
Implémentation de Map/Reduce (JS)
Peut stocker des fichiers
7. compiegne.rb 15 nov. 2012
2. MongoDB
Drivers disponibles pour plusieurs langages :
● Python
● Ruby
● Java
● Javascript (Node.js)
● C++
● PHP
● ...
8. compiegne.rb 15 nov. 2012
2. MongoDB - Présentation
MongoDB ("humongous" / “énorme”) est une
BDD open source NoSQL écrite en C++
distribuée sous license AGPL.
9. compiegne.rb 15 nov. 2012
2. MongoDB - Présentation
Caractéristiques :
- BDD orienté Document : objects structurés de type
JSON sans schéma
- Indexes sur n’importe quel attribut
- Replication & High Availability, Auto-Sharding
(horizontal scale)
- Requêtes orientés document
- Updates rapides : Atomic modifiers
- Map/Reduce : Process des données et agrégations
13. compiegne.rb 15 nov. 2012
2. MongoDB - Queries
- Récupérer les personnes ayant pour login “james”
> db.users.find( { login : "james" } )
- Récupérer les personnes vivant à Londres
> db.users.find( { adress.city : "Londres" } )
- Récupérer les groupes d’une personne
> var user = db.users.findOne( { _id:
ObjectId("50a4f7264efbbe201a000001") });
> db.groups.find( { _id : { $in : user.groups } });
14. compiegne.rb 15 nov. 2012
2. MongoDB - Atomic Modifiers
- Pas de support de transactions (sharding, dead locks, etc.)
- Mais Atomic Modifiers
$set - set a particular value
$unset - delete a particular field
$inc - increment a particular value by a certain amount
$push - append a value to an array
$pushAll - append several values to an array
$pull - remove a value(s) from an existing array
$pullAll - remove several value(s) from an existing array
$bit - bitwise operations
15. compiegne.rb 15 nov. 2012
2. MongoDB - Atomic Modifiers
- Augmenter le nombre de votes d’un media
> db.medias.update( { _id :
ObjectId("4efa8d2b7d284dad101e4bc7") } , { $inc :
{ votes_count : 1 } }
16. compiegne.rb 15 nov. 2012
2. MongoDB - Designer sa BDD (Schéma)
- Base de données relationnelles : schéma orienté
“normalisation” (3NF) - Théorique
- MongoDB : schéma orienté “usage” et “performance” -
Pratique
- Les questions à se poser :
● Embed VS Linked ?
● Combien de collections ?
● Quelles opérations atomiques sont nécessaires ?
● Quels indexes créer ?
● Comment partitionner ?
17. compiegne.rb 15 nov. 2012
2. MongoDB
A savoir sur MongoDB :
● Pas d'authentification par défaut
● Version 32 bits limitée à 2GO de données
● 1 document est limité à 16mo (vs 4 avt)
● Verrouillage global des données partagées
● Jusque version 2.0
● Meilleures performances en 2.2+
19. compiegne.rb 15 nov. 2012
3. MongoId
Communauté active
Basé sur ActiveSupport
Validations
Requêtes grâce à Origin
Polymorphisme
Proche de ActiveRecord :
● has_many, belongs_to
20. compiegne.rb 15 nov. 2012
3. MongoId
Pris en charge pour de nombreuses gems :
● Carrierwave-mongoid
● ActiveAdmin (patch)
● mongoid-rspec
● delayed_job_mongoid
● mongoid_session_store
21. compiegne.rb 15 nov. 2012
3. MongoId
Pris en charge pour de nombreuses gems :
● Carrierwave-mongoid
● ActiveAdmin (patch)
● mongoid-rspec
● delayed_job_mongoid
● mongoid_session_store
22. compiegne.rb 15 nov. 2012
3. MongoId
Gestion des documents
Gestion des documents « embedded »
Gestion des « extras »
● Caching
● Versionning
● Paranoia
Gestion de Map/Reduce
23. compiegne.rb 15 nov. 2012
3. MongoId
Création d'une classe :
class User
include Mongoid::Document
include Mongoid::Timestamps
field :firstname, :type => String, :default => ""
field :lastname, :type => String, :default => ""
validates :lastname, :presence => true
has_and_belongs_to_many :projects, :inverse_of =>
:members
embeds_many :tasks, :inverse_of => :user
end
24. compiegne.rb 15 nov. 2012
3. MongoId
Polymorphisme :
class User
include Mongoid::Document
include Mongoid::Timestamps
embeds_many :tasks, :as => :owner
end
class Task
include Mongoid::Document
include Mongoid::Timestamps
embedded_in :owner, :polymorphic => true
end
27. compiegne.rb 15 nov. 2012
3. MongoId
Extras :
class User
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::Paranoia
include Mongoid::Caching
include Mongoid::Versionning
End