back to basics, webinar 3: riflessioni sulla progettazione degli schemi nei documenti
TRANSCRIPT
Code MassimoB gets you a 25% discount off the list price
Back to Basics 2016 : Webinar 3
Pensare a DocumentiMassimo Brignoli
Principal Solution Architect, [email protected]
@massimobrignoli
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
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/
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
7
Data Store – Key Value
Key 1 Value
Key 1 Value
Key 1 Value
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
9
Data Store - Documenti
Key3
Key4
Key5
Value 3
Value 5
Value 4Key6
Value 5Key7
Value 2
Value 1Key1
Key1
Key1
Key2
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” }}
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" } )
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)
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”.
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
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
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” : []}
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”,}{...},{...},{...},{...},{...},{...},{..},{...},{...},{...} ]
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,}
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> }}}
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
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.