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”: “[email protected]”}, “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” : “[email protected]”, “comment” : “Sie schreiben mit Stil!” }, { “name” : “Jan Schmidt”, “email” : “[email protected]”, “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” : “[email protected]”, “comment” : “Sie schreiben mit Stil!”,}{ “_id” : ObjectID( “AAAB” ), “name” : “Jan Schmidt”, “email” : “[email protected]”, “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” : “[email protected]”,
“comment” : “Sie schreiben mit Stil!”,}{ _id : ObjectID( “AAAB” ), name : “Jan Schmidt”, email : “[email protected]”, comment : “Ihr Schreibstil ist unterirdisch”,}]
}
{ “_id” : ObjectID( “CCCC” ), “_post_id” : ObjectID( “ZZZZ” ), “comments” : [{ “_id” : ObjectID( “AAAA” ) “name” : “Benjamin Lorenz”, “email” : “[email protected]”,
“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