NoSQL-Datenbanken verfolgen einen nichtrelationalen Ansatz. Sie brechen damit mit der langen Geschichte relationaler Datenbanken. Sie benötigen keine festgelegten Tabellenschemata, sondern haben eine ganz eigene Herangehensweise. In dieser Session zeigt der MongoDB-Experte Gregor Biswanger, wie ein NoSQL-Schema für dokumentenorientierte Datenbanken entworfen wird. Dazu werden einige bekannte Entwurfsmuster aus der Praxis vorgestellt.
MongoDB: Entwurfsmuster für das NoSQL-Schema-Design
1. MongoDB Entwurfsmuster
Für das NoSQL-Schema-Design
Gregor Biswanger | Freier Berater, Trainer, Autor und Sprecher
about.me/gregor.biswanger
2. Über mich
▪ Freier Berater, Trainer und Autor
▪ Schwerpunkte: Softwarearchitektur, Web und
Cross-Plattform Entwicklung mit C# und JavaScript
▪ Papa von Electron.NET
▪ Technologieberater für die Intel Developer Zone
▪ Internationaler Sprecher auf Konferenzen und
User Groups
▪ Freier Autor für heise.de, dotnetpro,
WindowsDeveloper und viele weitere
Fachmagazine
▪ Video-Trainer bei video2brain und Microsoft
Gregor Biswanger
Microsoft MVP, Intel Black Belt &
Intel Software Innovator
cross-platform-blog.de
about.me/gregor.biswanger
3. Unser Reiseplan
▪ Crashkurs aus Teil 1
▪ Dokumentenorientierte Datenbank
▪ Dokumentenorientiert modellieren
▪ Gemeinsam ein Beispiel modellieren
▪ 11 Entwurfsmuster zum Schema-Design
▪ Quelle: http://bit.ly/3c7IIvd
▪ Fazit
28. Weniger als 100 Mehr als 100 Tausend
X
Wie groß ist der Datensatz?
Immer Manchmal Selten
X
Wie oft werden die Daten zusammen benutzt?
Nie / Selten Gelegentlich Konstant
X
Wie oft ändern sich die Daten?
Analyse vom Datentyp: Tag
29. Vergleich mit dem Dokumenten-Schema Kompass
Immer Manchmal Selten
Integriert x x x
Referenziert x x
Wie oft werden die Daten zusammen benutzt?
Weniger als 100 Mehr als 100 Tausend
Integriert x x
Referenziert x x
Wie groß ist der Datensatz?
Nie / Selten Gelegentlich Konstant
Integriert x x
Referenziert x x
Wie oft ändern sich die Daten?
31. Weniger als 100 Mehr als 100 Tausend
X
Wie groß ist der Datensatz?
Immer Manchmal Selten
X
Wie oft werden die Daten zusammen benutzt?
Nie / Selten Gelegentlich Konstant
X
Wie oft ändern sich die Daten?
Analyse vom Datentyp: Zutat
32. Vergleich mit dem Dokumenten-Schema Kompass
Immer Manchmal Selten
Integriert x x x
Referenziert x x
Wie oft werden die Daten zusammen benutzt?
Weniger als 100 Mehr als 100 Tausend
Integriert x x
Referenziert x x
Wie groß ist der Datensatz?
Nie / Selten Gelegentlich Konstant
Integriert x x
Referenziert x x
Wie oft ändern sich die Daten?
34. Weniger als 100 Mehr als 100 Tausend
X
Wie groß ist der Datensatz?
Immer Manchmal Selten
X
Wie oft werden die Daten zusammen benutzt?
Nie / Selten Gelegentlich Konstant
X
Wie oft ändern sich die Daten?
Analyse vom Datentyp: Quelle
35. Vergleich mit dem Dokumenten-Schema Kompass
Immer Manchmal Selten
Integriert x x x
Referenziert x x
Wie oft werden die Daten zusammen benutzt?
Weniger als 100 Mehr als 100 Tausend
Integriert x x
Referenziert x x
Wie groß ist der Datensatz?
Nie / Selten Gelegentlich Konstant
Integriert x x
Referenziert x x
Wie oft ändern sich die Daten?
64. Das Bucket Pattern ist eine hervorragende
Lösung für die Verwaltung von Streaming-Daten.
65. Zum Beispiel für Zeiten, Echtzeitanalysen oder
Internet-of-Things-Anwendungen (IoT).
66. Wenn Daten über einen bestimmten Zeitraum als
Datenstrom eingehen, können wir dazu neigen, jede
Messung in einem eigenen Dokument zu
speichern.
67. {
sensor_id: 12345,
timestamp: ISODate("2019-01-31T10:00:00.000Z"),
temperature: 40
}
{
sensor_id: 12345,
timestamp: ISODate("2019-01-31T10:01:00.000Z"),
temperature: 40
}
{
sensor_id: 12345,
timestamp: ISODate("2019-01-31T10:02:00.000Z"),
temperature: 41
}
Wenn ein Sensor jede Minute die Temperatur misst
und in einem eigenen Dokument speichert
69. Dies kann einige Probleme aufwerfen,
da unsere Anwendung in Bezug auf Daten und
Indexgröße skaliert.
70. Mithilfe des Bucket-Musters, können wir diese
Daten nach Zeit in Dokumente "gruppieren",
die die Messungen aus einer bestimmten
Zeitspanne enthalten.
72. Wir können auch programmgesteuert
zusätzliche Informationen zu jedem dieser
"Buckets" hinzufügen.
73. Wenn weitere Daten zum Measurearray
hinzugefügt werden, wird die Transaktionszahl
erhöht und die Summentemperatur ebenfalls
aktualisiert.
74. Mit dem voraggregierten Wert für sum_temperature kann
dann auf einfache Weise die Durchschnittstemperatur
(sum_temperature / transaction_count) für diesen Bucket
ermittelt werden.
75. Wir erhalten einige Vorteile in Bezug auf die Reduzierung der
Indexgröße, potenzielle Vereinfachung von Abfragen und die
Möglichkeit, diese voraggregierten Daten in unseren
Dokumenten zu verwenden.
76. Pro
▪ Reduziert die Gesamtzahl der Dokumente in einer Sammlung.
▪ Verbessert die Indexleistung.
▪ Kann den Datenzugriff durch Nutzung der Voraggregation
vereinfachen.
79. Wenn es sehr leseintensive Zugriffe gibt und diese
Daten von der Anwendung wiederholt berechnet
werden müssen, ist das Computed Pattern eine
großartige Option.
87. Die Auswahl der Update-Strategie ist am besten
dem Anwendungsentwickler überlassen.
88. Pro
▪ Reduzierung der CPU-Auslastung für häufige Berechnungen.
▪ Abfragen sind einfacher zu schreiben und in der Regel schneller.
89. Contra
▪ Es kann schwierig sein, den Bedarf für dieses Muster zu identifizieren.
▪ Das Anwenden oder Überbeanspruchen des Musters sollte
vermieden werden, sofern dies nicht erforderlich ist.
91. Wenn wir mit der Notwendigkeit konfrontiert sind,
frühere Versionen von Dokumenten in MongoDB
zu verwalten, ist das Document Versioning Pattern
eine mögliche Lösung.
101. Das Extended Reference Pattern ist am nützlichsten,
wenn in unserer Anwendung viele JOIN-Vorgänge
ausgeführt werden, um häufig aufgerufene Daten
zusammenzuführen.
103. Ein Kunde kann N Bestellungen haben,
wodurch eine 1-N-Beziehung entsteht.
104. Aus der Sicht der Bestellung, ist es eine
N-1-Beziehung zu einem Kunden.
105. Das Einbetten aller Informationen zu einem Kunden für
jede Bestellung, nur um die JOIN-Operation zu reduzieren,
führt zu einer Menge doppelter Informationen.
106. Darüber hinaus werden möglicherweise
nicht alle Kundeninformationen für eine
Bestellung benötigt.
107. Das Extended Reference Pattern bietet
eine hervorragende Möglichkeit, mit
diesen Situationen umzugehen.
108. Anstatt alle Informationen über den Kunden zu
duplizieren, kopieren wir nur die Felder, auf die
wir häufig zugreifen.
117. Das mag zwar in 99,99% der Fälle funktionieren,
aber was passiert, wenn JK Rowling ein neues Harry-
Potter-Buch veröffentlicht und die Verkaufszahlen in
die Millionen steigen?
118. Die Neugestaltung unserer gesamten Anwendung für diese
Ausreißersituation kann zu einer Leistungsminderung
für das typische Buch führen, die wir jedoch
berücksichtigen müssen.
119. Wenn über das von uns festgelegte Limit von 1.000
Artikeln hinausgeht, wird ein neues Feld hinzugefügt,
um das Buch als Ausreißer zu kennzeichnen.
121. Wir würden dann die Überlaufinformationen
in ein separates Dokument verschieben, das
mit der id des Buches verknüpft ist.
122. Innerhalb der Anwendung können wir
feststellen, ob ein Dokument ein Feld
has_extras mit dem Wert true hat.
123. In diesem Fall würde die Anwendung die
zusätzlichen Informationen abrufen.
124. Pro
▪ Verhindert, dass einige Dokumente oder Abfragen die Lösung
einer Anwendung bestimmen.
▪ Abfragen sind auf „typische“ Anwendungsfälle zugeschnitten,
Ausreißer werden jedoch weiterhin angesprochen.
125. Contra
▪ Oftmals zugeschnitten auf bestimmte Abfragen,
daher sind Ad-hoc-Abfragen möglicherweise nicht richtig.
▪ Ein Großteil dieses Musters wird mit Anwendungscode ausgeführt.
127. Das Polymorphic Pattern ist die Lösung, wenn es eine
Vielzahl von Dokumenten gibt, die mehr Ähnlichkeiten
als Unterschiede aufweisen und die Dokumente in einer
einzigen Sammlung aufbewahrt werden müssen.
128. Stellen wir uns vor, unsere Anwendung
verfolgt professionelle Sportler über
alle Sportarten hinweg.
131. Wenn wir nicht das Polymorphic Pattern verwenden,
haben wir möglicherweise eine Sammlung für Bowling-
Athleten und eine Sammlung für Tennis-Athleten.
132. Wenn wir alle Athleten abfragen wollten, mussten wir
eine zeitaufwändige und möglicherweise komplexe
Verbindung herstellen.
137. Nahezu jede Anwendung kann von dem Schema
Versioning Pattern profitieren, da Änderungen am
Datenschema im Laufe der Lebensdauer einer
Anwendung häufig vorkommen.
138. Dieses Muster ermöglicht, dass frühere und aktuelle
Versionen von Dokumenten nebeneinander in einer
Sammlung vorhanden sind.
168. employee_id employee_name position reports_to
1 David Wallace CEO
2 Jan Levinson VP, NE Sales 1
3 Michael Scott Regional Manager 2
4 Dwight Schrute Sales Rep 3
5 Jim Halpert Sales Rep 3
6 Pam Beesly Receptionist 3
employee_id employee_name position direct_reports
1 David Wallace CEO 2
2 Jan Levinson VP, NE Sales 3
3 Michael Scott Regional Manager 4
3 Michael Scott Regional Manager 5
3 Michael Scott Regional Manager 6
4 Dwight Schrute Sales Rep
5 Jim Halpert Sales Rep
6 Pam Beesly Receptionist
169. MongoDB bietet den Operator $graphLookup
zum Navigieren in den Daten als Diagramme.
171. Wenn Sie jedoch viele Abfragen dieser
hierarchischen Datenstruktur durchführen müssen,
möchten Sie möglicherweise dieselbe Regel zum
gemeinsamen Speichern von Daten anwenden, auf
die gemeinsam zugegriffen wird.
172. Alternativ können wir den vollständigen
Pfad von einem Knoten zum Anfang der
Hierarchie speichern.