Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas : penser en termes...

Post on 14-Apr-2017

536 views 1 download

Transcript of Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas : penser en termes...

Back to Basics 2016 : Webinar 3

Thinking in DocumentsEmmanuel DELETANG

Senior solutions architecte france Emmanuel.deletang@mongodb.com

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” : “Emmanuel.deletang@mongodb.com”, “comment” : “J'aime ta façon d'écrire” }, { “name” : “John Smith”, “email” : “John.Smith@example.com”, “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 : “Joe.Drumgoole@mongodb.com”, comment :“I love your writing style”,}{ _id : ObjectID( “AAAB” ), name : “John Smith”, email : “Joe.Drumgoole@mongodb.com”, 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” : “Joe.D@mongodb.com”,

comment :“I love your writing style”,}{ _id : ObjectID( “AAAB” ), name : “John Smith”, email : “Joe.Drumgoole@mongodb.com”, comment :“I hate your writing style”,}]

}

{ “_post_jd” : ObjectID( “ZZZZ” ), “comments” : [{ “_id” : ObjectID( “AAAA” ) “name” : “Joe Drumgoole”, “email” : “Joe.D@mongodb.com”,

“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.