back to basics – webinar 3: schema-design: denken in dokumenten

Post on 14-Apr-2017

548 Views

Category:

Data & Analytics

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Back to Basics 2016 : Webinar 3

Denken in DokumentenBenjamin Lorenz

Senior Solutions Architect, MongoDB Frankfurt@benjaminlorenz

V1.3

3

Kursplan

Datum Uhrzeit Webinar31. Mai 2016 14:00 Uhr MESZ Einführung in NoSQL16. Juni 2016 14.00 Uhr MESZ Ihre erste MongoDB-Anwendung1. Juli 2016 14:00 Uhr MESZ Schema-Design: Denken in Dokumenten12. Juli 2016 14:00 Uhr MESZ Indizierung für Fortgeschrittene: Text- und Geoindizes26. Juli 2016 14:00 Uhr MESZ Einführung in das Aggregation Framework30. August 2016 14:00 Uhr MESZ Produktivsetzung einer Anwendung

4

Rückblick

• Webinar 1: Einführung in NoSQL– Verschiedene Typen von NoSQL-Datenbanken– MongoDB ist eine Dokumentendatenbank– Replica Sets und Shards

• Webinar 2: Ihre erste MongoDB-Anwendung– Erstellen einer einfachen Anwendung– Hinzufügen von Indizes– Messung der Performance mit explain()

5

Denken in Dokumenten

• MongoDB-Dokumente sind Javascript-Objekte (JSON)• Sie sind in BSON codiert• BSON („Binary JSON“) unterstützt das effiziente Codieren

und Decodieren von JSON• Dies ist für die effiziente Datenübertragung und

Festplattenspeicherung erforderlich• Es macht das vollständige Parsen aller Unterobjekte

überflüssig• Dokumentation: http://bsonspec.org/

6

Ein Beispieldokument

{ first_name: ‘Benjamin’, surname: ‘Lorenz’, cell: 49691234567, city: ‘Frankfurt’, location: [53.34,-6.26], profession: [‘Banking’, ‘Finanzen’, ‘Trader’], cars: [ { model: ‘Audi’, year: 1973, value: 100000, … }, { model: ‘Mercedes’, year: 1965, value: 330000, … } ]}

Array aus Unterdokumenten

Felder

Jedes Feld verlangt einen bestimmten Datentyp.

Felder können Arrays enthalten.

String

Zahl

Geo-Location

7

Datenspeicherung: Key/Value-Speicher

Schlüssel 1 Wert 1

Schlüssel 1 Wert 2

Schlüssel 1 Wert 3

8

Datenspeicherung: relational

Schlüssel 1

Wert

Wert

Wert

Wert

Schlüssel 2

Wert

Wert

Wert

Wert

Schlüssel 3

Wert

Wert

Wert

Wert

Schlüssel 4

Wert

Wert

Wert

Wert

9

Datenspeicherung: dokumentenbasiert

Schlüssel 3

Schlüssel 4

Schlüssel 5

Wert 3

Wert 4

Wert 5Schlüssel 6

Wert 6Schlüssel 7

Wert 2

Wert 1Schlüssel 1

Schlüssel 1

Schlüssel 1

Schlüssel 2

10

Wie sieht das JSON-Dokument aus?

{ “key1” : “value 1” }

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

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

11

Beispiele für Datenbankabfragen

# Findet das erste Dokumentdb.demo.find( { "key1" : "value 1" } )

# Findet das 2. Dokumentdb.demo.find( { "key1.key3.key4" : "value 3" } )

# Findet das 3. Dokumentdb.demo.find( { "key1.key6" : "value 5" } )

12

Modellierung und Kardinalität

• 1:1– Ein Blogtitel / Autor pro Blogbeitrag

• 1:n– Ein Blogbeitrag mit vielen Kommentaren

• 1:Millionen– Ein Blogbeitrag mit sehr vielen Aufrufen

(z. B. bei blogs.faz.net)

13

1:1

{ “title” : “Dies ist ein Blogbeitrag”, “author”:{ “nick”: “ben”, “email”: “ben@blog.net”}, “body” : “Dies ist der gesamte Text eines sehr kurzen Blogbeitrags”, …}

Wir können Indizes für “title”, “author.nick” und/oder “body” hinzufügen.

14

1:n

{ “title” : “Dies ist ein Blogbeitrag”, “body” : “Dies ist der Text des Blogbeitrags”, “comments” : [ { “name” : “Benjamin Lorenz”, “email” : “benjamin.lorenz@mongodb.com”, “comment” : “Sie schreiben mit Stil!” }, { “name” : “Jan Schmidt”, “email” : “Jan.Schmidt@beispiel.de”, “comment” : “Ihr Schreibstil ist unterirdisch.” }]}

Wenn nur wenige Kommentare zu erwarten sind, können diese in das Dokument eingebettet werden.

15

Zu beachten

• Typische Schreibmuster– Neue Kommentare werden häufiger hinzugefügt als

neue Blogbeiträge– Kommentare können Bilder, Tags oder sehr viel Text

enthalten• Typische Lesemuster

– Kommentare werden nicht immer angezeigt– Sie können in einem separaten Fenster erscheinen– Sehr wenige Leser sehen sich alle Kommentare an

16

Alternativer Ansatz: getrennte Collections• Alle Kommentare werden in einer eigenen Collection gespeichert• Jedem Blogbeitrag wird ein Array mit den entsprechenden Kommentar-IDs hinzugefügt• Zwei Abfragen nötig, um einen Blogbeitrag und die dazugehörigen Kommentare anzuzeigen • Jeder neue Kommentar erfordert zwei Schreiboperationen

Comments Collection

{ “_id” : ObjectID( “AAAA” ), “name” : “Benjamin Lorenz”, “email” : “benjamin.lorenz@mongodb.com”, “comment” : “Sie schreiben mit Stil!”,}{ “_id” : ObjectID( “AAAB” ), “name” : “Jan Schmidt”, “email” : “Jan.Schmidt@beispiel.de”, “comment” : “Ihr Schreibstil ist unterirdisch”,}

Blogs Collection

{ “_id” : ObjectID( “ZZZZ” ), “title” : “Ein Blogtitel”, “body” : “Ein Blogbeitrag”, “comments” : [ ObjectID( “AAAA” ), ObjectID( “AAAB” )]}{ “_id” : ObjectID( “ZZZY” ), “title” : “Ein Blogtitel”, “body” : “Ein Blogbeitrag”, “comments” : []}

17

Dritte Variante: ein Hybridansatz

{ “_id” : ObjectID( “ZZZZ” ), “title” : “Ein Blogtitel”, “body” : “Ein Blogbeitrag”, “comments” : [{ “_id” : ObjectID( “AAAA” ) “name” : “Benjamin Lorenz”, “email” : “benjamin.lorenz@mongodb.com”,

“comment” : “Sie schreiben mit Stil!”,}{ _id : ObjectID( “AAAB” ), name : “Jan Schmidt”, email : “Jan.Schmidt@beispiel.de”, comment : “Ihr Schreibstil ist unterirdisch”,}]

}

{ “_id” : ObjectID( “CCCC” ), “_post_id” : ObjectID( “ZZZZ” ), “comments” : [{ “_id” : ObjectID( “AAAA” ) “name” : “Benjamin Lorenz”, “email” : “benjamin@mongodb.com”,

“comment” : “Sie schreiben mit Stil!”,},{...},{...},{...},{...},{...},{...},{..},{...},{...},{...} ]

}

{ “_id” : ObjectID( “CCCD” ), “_post_id” : ObjectID( “ZZZZ” ), “comments” : [...] }

18

1:n – Wenn n in die Millionen geht

• Beispiel: Wir erfassen Mauspositionen zur Erstellung einer Heatmap– Jeder Besucher erzeugt bei jedem Besuch Hunderte von Datensätzen– Für jeden Blogbeitrag gibt es Tausende von Mauspositionen – Millionen

für die ganze Blog-Webseite• Die naheliegende Option: den Ansatz umkehren

– Jede Mausposition kommt in ein separates Dokument mit Blog-ID

{ “post_id” : ObjectID(“ZZZZ”), “timestamp” : ISODate("2016-07-01T14:38:09Z”), “location” : [24, 34], “click” : False}

19

Zusammenfassen von Ereignissen pro Minute

{ post_id : ObjectID ( “ZZZZ” ), timeStamp: ISODate("2016-07-01T14:38:00Z”), events : [{ “location” : [24, 34], “click” : False }, { “location” : [12, 88], “click” : True }, {...},{...},...]}

20

Richtlinien

• Bilden Sie 1:1-Beziehungen durch eingebettete Objekte• Berücksichtigen Sie Lese- und Schreibmuster, wenn Sie entscheiden, wie

viele Collections und Indizes Sie benötigen• Lösen Sie sich von der Denkweise „ein Datensatz pro Objekt“• Nutzen Sie Hierarchien• Berücksichtigen Sie die Kardinalität• Behalten Sie Ihre Indizes im Auge • Aktualisierungen von Dokumenten sind Transaktionen

21

Im nächsten Webinar: Indizierung für Fortgeschrittene: Text- und Geoindizes

• MongoDB unterstützt die Volltextindexierung und ermöglicht damit die „Google-ähnliche“ Durchsuchung Ihrer gesamten Datenbank

• Mit Geoindizes können Sie nicht nur Geodaten speichern, sondern auch die Entfernung zwischen zwei Punkten in Ihre Suchvorgänge einbeziehen

12. Juli 2016, 14:00 Uhr MESZ

top related