back to basics, webinar 3: riflessioni sulla progettazione degli schemi nei documenti

22

Upload: mongodb

Post on 14-Apr-2017

622 views

Category:

Data & Analytics


2 download

TRANSCRIPT

Page 1: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti
Page 2: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

Code MassimoB gets you a 25% discount off the list price

Page 3: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

Back to Basics 2016 : Webinar 3

Pensare a DocumentiMassimo Brignoli

Principal Solution Architect, [email protected]

@massimobrignoli

Page 4: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

4

Review

• Webinar 1 : Introduzione a NoSQL– Tipi di Database NoSQL– MongoDB è un database a documenti– Replica Set e Shard

• Webinar 2– Costruire una semplice applicazione– Aggiungere gli indici– Usare Explain per misurare le operazioni

Page 5: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

5

Pensare a Documenti

• I Documenti in MongoDB sono Javascript Objects (JSON)• Sono codificati come BSON

– BSON è “Binary JSON”– BSON permette un encoding e decoding efficiente dei JSON

• Richiesto per una trasmissione dati e gestione dello spazio disco efficiente.

• Elimina la necessità di fare il aprsing del testo di tutti I sotto oggetti

• Le specifiche si trovano su http://bsonspec.org/

Page 6: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

6

Esempio di Documento

{ first_name: ‘Paul’, surname: ‘Miller’, cell: 447557505611, city: ‘London’, location: [45.123,47.232], Profession: [‘banking’, ‘finance’, ‘trader’], cars: [ { model: ‘Bentley’, year: 1973, value: 100000, … }, { model: ‘Rolls Royce’, year: 1965, value: 330000, … } ]}

Fields can contain an array of sub-documents

Fields

Typed field values

Fields can contain arrays

String

Number

Geo-Location

Page 7: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

7

Data Store – Key Value

Key 1 Value

Key 1 Value

Key 1 Value

Page 8: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

8

Data Store - Relazionale

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

Page 9: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

9

Data Store - Documenti

Key3

Key4

Key5

Value 3

Value 5

Value 4Key6

Value 5Key7

Value 2

Value 1Key1

Key1

Key1

Key2

Page 10: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

10

La Forma dei Sottodocumenti

{ “key1” : “value 1” }

{ “key1” : { “key2” : “value 1”, “key3” : { “key4” : “value 3”, “key5” : “value 4” }}

{ “key1” : { “key6” : “value 5”, “key7” : “value 6” }}

Page 11: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

11

Alcuni esempi di Query

# Will find the first two documentsdb.demo.find( { “key1” : “value” } )

# find the second document by nested valuedb.demo.find( { "key1.key3.key4" : "value 3" } )

# will find the third documentdb.demo.find( { "key1.key6" : "value 4" } )

Page 12: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

12

Modellazione e Cardinalità

• One to One–Titolo al blog post

• One to Many–Blog post ai commenti

• One to Millions–Blog post sulle visite al sito (e.g. Huffington Post)

Page 13: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

13

One To One

{ “Title” : “This is a blog post”, “Body” : “This is the body text of a very short blog post”, …}

Possiamo indicizzare sia “Title” che “Body”.

Page 14: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

14

One to Many

{ “Title” : “This is a blog post”, “Body” : “This is the body text”, “Comments” : [ { “name” : “Joe Drumgoole”, “email” : “[email protected]”, “comment” : “I love your writing style” }, { “name” : “John Smith”, “email” : “[email protected]”, “comment” : “I hate your writing style” }]}

Se ci aspettiamo un basso numero di commenti possiamo incapsularli all’interno del documento principale

Page 15: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

15

Criticità Principali

• Come scrivete sul DB?– I commenti sono inseriti più frequentemente dei post.– I Commenti possono avere immagini, tags, grandi pezzi

di testo• Come leggete dal DB?

– I commenti possono non essere visualizzati– Possono essere mostrati in una pagina dedicata– Gli utenti raramenti leggono tutti i commenti

Page 16: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

16

Approccio Alternativo: Collection Separata

• Mantenere tutti I commenti in una colleciton separata• Aggiungere le referenze ai commenti come un array di ID dei commenti• Richiede due query per visualizzare il blog post e i relativi commenti• Richiede due scritture per create un commento

{ _id : ObjectID( “AAAA” ), name : “Massimo Brignoli”, 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” : []}

Page 17: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

17

Approccio Migliore – Un Ibrido

{ “_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”,}{...},{...},{...},{...},{...},{...},{..},{...},{...},{...} ]

Page 18: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

18

E la Relazione One to Millions?

• Cosa succederebbe se tracciassimo la posizione del mouse per “heat tracking”?– Ogni utente genererebbe centinaia di data point per visita.– Migliaia di data points per post– Milioni di data point per sito

• Invertiamo ill modello:– Memorizziamo un blog ID per evento

{ “post_id” : ObjectID(“ZZZZ”), “timestamp” : ISODate("2005-01-02T00:00:00Z”), “location” : [24, 34] “click” : False,}

Page 19: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

19

Ma – C’e’ un numero finito di eventi al secondo

{ 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> }}}

Page 20: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

20

Linee Guida

• Icapsulare SEMPRE gli oggetti con relazioni one to one• Controllate gli accessi in lettura e scrittura per determinare quando spostare I

dati all’esterno• Non rimanete bloccati nel pensiero di “un record” per tutto• Abbracciate la gerarchia• Pensate alla cardinalità• Gestire la crescita aggiungendo documenti non aumentando la dimensione

dei documenti• Pensate bene agli indici

Page 21: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti

21

Prossimo Webinar : Indicizzazione Avanzata, Indici Testuali e Geografici

• Il support Full text permette ad un utente di indicizzare tutto il contenuto testuale del suo database abilitando ricerche del tipo google sulla loro base dati

• Gli indici geografici permettono ad un utente di memorizzare coordinate geografiche e di effettuare ricerche basate sulla prossimità tra due punti

05 Luglio 2016, 11:00 GMT.

Page 22: Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei documenti