by Marc-David Militz
Forum: MongoDB Theorie
- Artikel von Daniel Coupal und Ken W. Alger
- Beispiel Use Cases
- Das Dokument-Versionierungs-Pattern
- Das Preallocation-Pattern
- Das Tree-Pattern
- Das Annäherungs-Pattern
- Das Erweiterte-Referenz-Pattern
- Das Subset-Pattern
- Das Berechnungs-Pattern
- Das Bucket-Pattern
- Das Ausreißer-Pattern
- Das Attribute Pattern
- Das Polymorphie Pattern
- Das Schema Versionierungs Pattern
englischer Originalartikel
https://www.mongodb.com/blog/post/building-with-patterns-a-summary
Übersetzung mit freundlicher Genehmigung von MongoDB
Als Abschluss für die MongoDB Patterns Serie ist es eine gute Idee die einzelnen Probleme, die die Patterns adressieren, sowie die Vorteile aber auch Einschränkungen noch einmal hervorzuheben.
Die am häufigsten gestellte Frage, über Schema Design, lautet: "Ich entwerfe gerade eine Applikation die X tun soll, wie modelliere ich die Daten am besten?"
Wie hoffentlich jeder Leser der Serie festgestellt hat, muss man eine Reihe von Dingen berücksichtigen, um diese Frage beantworten zu können.
Um das etwas zu vereinfachen hat man bei MongoDB einen "Beispiel Use Case Chart" erstellt, um einen Einstieg zu haben in welche Richtung man sich bei bestimmten Use Cases bewegen sollte.
Der Chart ist eine Richtlinie, die aus Jahren der Erfahrung in Kundenprojekten entstanden ist, bei denen die unterschiedlichsten Design Pattern in einer ganzen Reihe von Applikationen zum Einsatz kamen.
Trotzdem ist nichts davon in Stein gemeißelt oder eine Feststehende Regel, dass für einen Use Case nur ein bestimmtes Pattern in Frage kommt.
Nur weil ein Design Pattern passend erscheint sollte man nicht sofort alle anderen ausschließen, diese könnten trotz allem passen.
In erster Linie legen Art und Häufigkeit der Datenzugriffe fest welches Pattern passend ist.
https://www.qualiero.com/community/mongodb/mongodb-theorie/mongodb-patterns-das-dokument-versionierungs-pattern.html
Wenn man vor der Herausforderung steht frühere Versionen von Dokumenten zu pflegen, dann kann das Dokument-Versionierungs-Pattern eine Möglichkeit sein.
Vorteile:
- einfach zu implementieren, auf bestehenden Systemen
- Keine Performancebeeinträchtigung auf der aktuellen Version
Nachteile:
- Verdoppelt die Schreiboperationen
- Abfragen müssen auf die richtige Collection gerichtet werden
https://www.qualiero.com/community/mongodb/mongodb-theorie/mongodb-patterns-das-preallocation-pattern.html
Wenn die Struktur der Dokumente bekannt ist und diese von der Applikation einfach nur mit Daten gefüllt werden muss, dann ist das Preallocation-Pattern die richtige Wahl.
Vorteile:
- Vereinfachung des Designs, wenn die Struktur der Dokumente bekannt ist.
Nachteile:
- Einfachheit vs. Performance
https://www.qualiero.com/community/mongodb/mongodb-theorie/mongodb-patterns-das-tree-pattern.html
Wenn Daten in hierarchischen Strukturen regelmäßig abgefragt werden, dann sollte das Tree-Pattern implementiert werden.
Vorteile:
- Bessere Abfrageperformance, weil mehrfache JOINS vermieden werden
Nachteile:
- Updates auf dem Graphen müssen von der Anwendung verwaltet werden
https://www.qualiero.com/community/mongodb/mongodb-theorie/mongodb-patterns-das-annaeherungs-pattern.html
Das Annäherungs-Pattern ist nützlich, wenn regelmäßig teure Berechnungen stattfinden und die Genauigkeit der Berechnungen nicht die höchste Priorität hat.
Vorteile:
- weniger Schreiboperationen auf der Datenbank
- liefert statistisch korrekte Zahlen
Nachteile:
- Die Zahlen sind nicht exakt
- Die Implementierung muss in der Applikation erfolgen
https://www.qualiero.com/community/mongodb/mongodb-theorie/mongodb-patterns-das-erweiterte-referenz-pattern.html
Das Erweiterte-Referenz-Pattern ist dann am nützlichsten, wenn regelmäßig sehr viele JOIN Operationen benötigt werden.
Vorteile:
- steigert die Performance bei vielen JOIN Operationen
- schnellere lesende Zugriffe durch weniger JOINS
Nachteile:
- Verdopplung der Daten
https://www.qualiero.com/community/mongodb/mongodb-theorie/mongodb-patterns-das-subset-pattern.html
Das Subset-Pattern löst das Problem, dass ein Working Set die Kapazitäten des RAM übersteigt, weil die Dokumente sehr groß sind, aber die meisten Felder nur selten verwendet werden.
Vorteile:
- Reduktion des Gesamtgröße des Working Set
- kürzere Festplatten Zugriffszeiten für die meisten häufig verwandten Datenbank
Nachteile:
- Die Subsets müssen verwaltet werden
- Das Laden der Zusatzdaten benötigt zusätzliche Datenbankzugriffe
https://www.qualiero.com/community/mongodb/mongodb-theorie/mongodb-patterns-das-berechnungs-pattern.html
Bei vielen leseintensiven Zugriffen, die auch Berechnungen enthalten ist das Berechnungs-Pattern eine großartige Option.
Vorteile:
- weniger CPU Last bei Berechnungen
- Abfragen werden einfacher und schneller
Nachteile:
- Der Bedarf für dieses Pattern ist nicht leicht zu erkennen
- Der Einsatz des Patterns wird schnell übertrieben, man sollte es nur bei Bedarf einsetzen
https://www.qualiero.com/community/mongodb/mongodb-theorie/mongodb-patterns-das-bucket-pattern.html
Das Bucket-Pattern eignet sich ganz hervorragend für Datenströme, z.B. Zeitserien, Echtzeit Analysen oder IoT Anwendungen.
Vorteile:
- verringert die Anzahl von Dokumenten in einer Collection
- steigert die Performance von Indexen
- kann den Datenzugriff vereinfachen indem eine Voraggregation genutzt wird
https://www.qualiero.com/community/mongodb/mongodb-theorie/mongodb-patterns-das-ausreisser-pattern.html
Gibt es eine Reihe von Abfragen in der Applikation, die anders als die regulären Datenzugriffe sind?
Orientiert sich das Design der Anwendung an diesen Ausnahmen?
Das könnte durch das Ausreißer-Pattern gelöst werden.
Vorteile:
- das Design der Anwendung hängt nicht an Ausnahmefällen
- Abfragen werden für typische Fälle angepasst, Ausnahmefälle sind weiter möglich
Nachteile:
- Oftmals für spezielle Abfragen angepasst, Ad hoc Abfragen könnten langsam sein
- wird größtenteils über Code in der Anwendung realisiert.
https://www.qualiero.com/community/mongodb/mongodb-theorie/mongodb-patterns-das-attribute-pattern.html
Das Attribute Pattern kümmert sich um Probleme, die rund um große Dokumente mit vielen gleichen Attributen auftreten.
Wenn eine kleine Anzahl an Dokumenten eine Reihe individueller Felder hat und anhand dieser Felder sortiert werden soll, dann greift dieses Pattern.
Vorteile:
- es werden weniger Indexe benötigt
- Abfragen werden einfacher und schneller
https://www.qualiero.com/community/mongodb/mongodb-theorie/mongodb-patterns-das-polymorphie-pattern.html
Das Polymorphie Pattern ist dann sinnvoll, wenn man unterschiedliche Dokumente hat, die mehr gleiche als unterschiedliche Felder aufweisen und trotzdem in einer Collection gehalten werden sollen.
Vorteile:
- Einfach zu implementieren
- Abfragen können nur auf einer Collection gemacht werden
https://www.qualiero.com/community/mongodb/mongodb-theorie/mongodb-patterns-das-schema-versionierungs-pattern.html
Beinahe jede Applikation kann vom Schema Versionierungs Pattern profitieren, da Änderungen im Datenschema im Lebenszyklus jeder Anwendung auftreten können.
Dieses Pattern erlaubt es früheren und aktuellen Versionen von Dokumenten nebeneinander, in einer Collection, zu existieren.
Vorteile:
- Keine Ausfallzeiten notwendig
- Kontrolle über die Schema Migration
- reduzierte technische Aufwände für künftige Änderungen
Nachteile:
- während der Migration können mehrere Indexe auf demselben Feld notwendig sein