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

22

Upload: mongodb

Post on 14-Apr-2017

548 views

Category:

Data & Analytics


0 download

TRANSCRIPT

Page 1: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten
Page 2: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

Back to Basics 2016 : Webinar 3

Denken in DokumentenBenjamin Lorenz

Senior Solutions Architect, MongoDB Frankfurt@benjaminlorenz

V1.3

Page 3: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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

Page 4: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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()

Page 5: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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/

Page 6: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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

Page 7: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

7

Datenspeicherung: Key/Value-Speicher

Schlüssel 1 Wert 1

Schlüssel 1 Wert 2

Schlüssel 1 Wert 3

Page 8: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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

Page 9: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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

Page 10: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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” }}

Page 11: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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" } )

Page 12: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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)

Page 13: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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.

Page 14: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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.

Page 15: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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

Page 16: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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” : []}

Page 17: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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” : [...] }

Page 18: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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}

Page 19: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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 }, {...},{...},...]}

Page 20: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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

Page 21: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten

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

Page 22: Back to Basics – Webinar 3: Schema-Design: Denken in Dokumenten