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

Post on 14-Apr-2017

622 Views

Category:

Data & Analytics

2 Downloads

Preview:

Click to see full reader

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, EMEAmassimo@mongodb.com

@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” : “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

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

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

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.

top related