Back to Basics 2016 : Webinar 3
Thinking in DocumentsEmmanuel DELETANG
Senior solutions architecte france [email protected]
V1.2
3
Review
• Webinar 1 : introduction au NOSQL– Types de bases NoSQL – MongoDB la base orientée document – Replica Sets et Shards
• Webinar 2– Fabriquer une application – Ajout d’indexes– Utilisation de la fonction “Explain”
4
Pensez en mode document
• Les documents MongoDB sont des objets JavaScript (JSON)
• Ils sont codés comme BSON • BSON = " Binary JSON " • BSON permet un encodage/décodage de JSON • Plus efficace lors de la transmission et le stockage sur
disque des données• Élimine le besoin de "text analyser " tous les sous-objets• Spécification publique sur http://bsonspec.org/
5
Exemple Document
{ first_name: ‘emmanuel’, surname: ‘DELETANG’, cell: +33617940786, city: ‘PARIS’, location: [45.123,47.232], Profession: [‘SA’, ‘mongo’, ‘python’], cars: [ { model: ‘RENAULT’, year: 2013, value: 1000, … }, { model: ‘UP’, year: 2015, value: 3300, … } ]}
Sous documents
Champs
Type
tableau
String
Number
Geo-Location
6
Data Stores – Key Value
Key 1 Value
Key 1 Value
Key 1 Value
7
Data Stores - Relational
Key 1
Value 1
Value 1
Value 1
Value 1
Key 2
Value 1
Value 1
Value 1
Value 1
Key 3
Value 1
Value 1
Value 1
Value 1
Key 4
Value 1
Value 1
Value 1
Value 1
8
Data Stores - Document
Key3
Key4
Key5
Value 3
Value 5
Value 4Key6
Value 5Key7
Value 2
Value 1Key1
Key1
Key1
Key2
9
In Document Form
{ “key1” : “value 1” }
{ “key1” : { “key2” : “value 1”, “key3” : { “key4” : “value 3”, “key5” : “value 4” }}
{ “key1” : { “key6” : “value 5”, “key7” : “value 6” }}
10
Some Example Queries
# trouver les 2 premiers documents db.demo.find( { “key1” : “value 1” } )
# trouver le second document par valeur intégrée (embedded)db.demo.find( { "key1.key3.key4" : "value 3" } )
# trouver le 3 eme documentdb.demo.find( { "key1.key6" : "value 4" } )
11
Modèle et Cardinalité
• 1 à 1 –Titre et post de blog
• Un à N– Blog après des commentaires
• Un à Millions –Blog post avec des vues de site (par exemple
Huffington Post )
12
Un a un
{ “Title” : “Ceci est un blog ”, “Body” : “Ceci est le corps du texte d'un blog très court”, …}
Nous pouvons indexer “Title” et “Body”.
13
Un a N
{ “Title” : “This is a blog post”, “Body” : “This is the body text”, “Comments” : [ { “name” : “emmanuel deletang”, “email” : “[email protected]”, “comment” : “J'aime ta façon d'écrire” }, { “name” : “John Smith”, “email” : “[email protected]”, “comment” : “Je déteste ta façon d'écrire” }]}
Lorsque nous nous attendons à un petit nombre de commentaires que nous pouvons intégrer dans le document principal
14
Points clés
• Quels sont les modèles d'écriture ?– Les commentaires sont ajoutés plus fréquemment que les
messages– Les commentaires peuvent avoir des images , des balises ,
des grands corps de texte• Quels sont les modèles de lecture ?
– Les commentaires ne peuvent pas être affichés – Les commentaires sont peut-être montrés dans leur propre
fenêtre– Les gens regardent rarement tous les commentaires
15
Approche 2 – collections séparées
• Gardez tous les commentaires dans une collection de commentaires séparés• Ajoutez des références à des commentaires comme un tableau de commentaire ID • Nécessite deux requêtes pour afficher blog et commentaires associés • Nécessite deux écritures pour créer un commentaire
{ _id : ObjectID( “AAAA” ), name : “Joe Drumgoole”, email : “[email protected]”, comment :“I love your writing style”,}{ _id : ObjectID( “AAAB” ), name : “John Smith”, email : “[email protected]”, comment :“I hate your writing style”,}
{ “_id” : ObjectID( “ZZZZ” ), “Title” : “A Blog Title”, “Body” : “A blog post”, “comments” : [ ObjectID( “AAAA” ), ObjectID( “AAAB” )]}{ “_id” : ObjectID( “ZZZZ” ), “Title” : “A Blog Title”, “Body” : “A blog post”, “comments” : []}
16
Approche 3 – une solution Hybride
{ “_id” : ObjectID( “ZZZZ” ), “Title” : “A Blog Title”, “Body” : “A blog post”, “comments” : [{ “_id” : ObjectID( “AAAA” ) “name” : “Joe Drumgoole”, “email” : “[email protected]”,
comment :“I love your writing style”,}{ _id : ObjectID( “AAAB” ), name : “John Smith”, email : “[email protected]”, comment :“I hate your writing style”,}]
}
{ “_post_jd” : ObjectID( “ZZZZ” ), “comments” : [{ “_id” : ObjectID( “AAAA” ) “name” : “Joe Drumgoole”, “email” : “[email protected]”,
“comment” :“I love your writing style”,}{...},{...},{...},{...},{...},{...},{..},{...},{...},{...} ]
17
Et si on a « un vers Million »
• Par exemple si on souhaite suivre chaque click de Souris ?– Chaque utilisateur va générer des tonnes d’information– Milliers de données par post– Millions de données pour un blog ?
• Inverser le model– Sauvegarder un blog ID per event ?
{ “post_id” : ObjectID(“ZZZZ”), “timestamp” : ISODate("2005-01-02T00:00:00Z”), “location” : [24, 34] “click” : False,}
18
Mais – un nombre fini d'événements par seconde
{ post_id : ObjectID ( “ZZZZ” ), timeStamp: ISODate("2005-01-02T00:00:00Z”), events : { 0 : { 0 : { <Info> }, 1 : { <Info> }, … 99: { <Info> }}, 1 : { 0 : { <Info> }, 1 : { <Info> }, … 99: { <Info> }}, 2 : { 0 : { <Info> }, 1 : { <Info> }, … 99: { <Info> }}, 3 : { 0 : { <Info> }, 1 : { <Info> }, … 99: { <Info> }}, ... 59 :{ 0 : { <Info> }, 1 : { <Info> }, … 99: { <Info> }}}
19
Lignes directrices• Imbriquer les objets pour le one to one• Regarder la notions de lecture écriture pour déterminer la rupture de
données• Ne restez pas coincés dans " un enregistrement " par article• Pensez a la hiérarchie• Pensez à la cardinalité• Cultivez vos données en ajoutant des documents sans augmenter la taille
du document • Pensez à vos index • Une mises à jour de documents est une transaction
20
Webinar suivant: Indexation avancée , texte et index géospatial
• Prise en charge complète de texte permettant à un utilisateur d’indexer tout le contenu textuel dans leur base de données «comme Google» pour de la recherche sur un ensemble de données
• Indexes géospatiaux qui permettent à un utilisateur de stocker des coordonnées géospatiales et d’effectuer des recherches sur la base de la proximité d'un point à un autre .
Mercredi 13 Juillet, 14:00 CET.
Recommended