Dies ist das dritte Webinar der Back to Basics-Serie, in dem Ihnen die Datenbank MongoDB genauer vorgestellt wird. In diesem Webinar erklären wir Ihnen die Architektur von Dokumentendatenbanken.
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten
1.
2. Back to Basics 2016 : Webinar 3
Denken in Dokumenten
Benjamin Lorenz
Senior Solutions Architect, MongoDB Frankfurt
@benjaminlorenz
V1.3
3. 3
Kursplan
Datum Uhrzeit Webinar
31. Mai 2016 14:00 Uhr MESZ Einführung in NoSQL
16. Juni 2016 14.00 Uhr MESZ Ihre erste MongoDB-Anwendung
1. Juli 2016 14:00 Uhr MESZ Schema-Design: Denken in Dokumenten
12. Juli 2016 14:00 Uhr MESZ Indizierung für Fortgeschrittene: Text- und Geoindizes
26. Juli 2016 14:00 Uhr MESZ Einführung in das Aggregation Framework
30. August 2016 14:00 Uhr MESZ Produktivsetzung einer Anwendung
4. 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. 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/
11. 11
Beispiele für Datenbankabfragen
# Findet das erste Dokument
db.demo.find( { "key1" : "value 1" } )
# Findet das 2. Dokument
db.demo.find( { "key1.key3.key4" : "value 3" } )
# Findet das 3. Dokument
db.demo.find( { "key1.key6" : "value 5" } )
12. 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. 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. 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. 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. 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” : []
}
18. 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
}
20. 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. 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