Questo è il terzo webinar della serie Back to Basics che ti offrirà un'introduzione al database MongoDB. Questo webinar ti spiegherà l'architettura dei database di documenti.
3. Back to Basics 2016 : Webinar 3
Pensare a Documenti
Massimo Brignoli
Principal Solution Architect, EMEA
massimo@mongodb.com
@massimobrignoli
4. 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. 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. 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
7. 7
Data Store – Key Value
Key 1 Value
Key 1 Value
Key 1 Value
8. 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. 9
Data Store - Documenti
Key3
Key4
Key5
Value 3
Value 5
Value 4Key6
Value 5Key7
Value 2
Value 1Key1
Key1
Key1
Key2
11. 11
Alcuni esempi di Query
# Will find the first two documents
db.demo.find( { “key1” : “value” } )
# find the second document by nested value
db.demo.find( { "key1.key3.key4" : "value 3" } )
# will find the third document
db.demo.find( { "key1.key6" : "value 4" } )
12. 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. 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. 14
One to Many
{
“Title” : “This is a blog post”,
“Body” : “This is the body text”,
“Comments” : [ { “name” : “Joe Drumgoole”,
“email” : “Joe.Drumgoole@mongodb.com”,
“comment” : “I love your writing style” },
{ “name” : “John Smith”,
“email” : “John.Smith@example.com”,
“comment” : “I hate your writing style” }]
}
Se ci aspettiamo un basso numero di commenti possiamo
incapsularli all’interno del documento principale
15. 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. 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 : “massimo@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” : []
}
17. 17
Approccio Migliore – Un Ibrido
{
“_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”,
}
{...},{...},{...},{...},{...},{...}
,{..},{...},{...},{...} ]
18. 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,
}
20. 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. 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.