MongoDB

MongoDB ist die führende Open-Source, Document Datenbank die für einfache Entwicklung und Skalierung aber auch für Big Data Szenarien entwickelt wurde.

MongoDB Patterns: das Attribute Pattern

Marc-David Militz
Expert
Dieses Mal werfen wir einen Blick auf das "Attribute Pattern", dieses eigent sich besonders für die folgenden Fälle
  • Wenn wir große Dokumente mit ähnlichen Feldern haben, aber ein Subset von Feldern gemeinsame Charakteristiken aufweist und wir auf dieses Subset abfragen oder sortieren möchten.
  • Wenn die Felder, auf denen wir sortieren müchten nur in einem kleinen Subset der Dokumente enthalten sind.
  • Wenn beide Bedingungen in den gleichen Dokumenten erfüllt sind.


    • Aus Performence Gründen und um die Suche zu optimieren müssten wir eigentlich eine Ganze Menge von Indexen für all die möglichen Subsets anlegen. Das kann sich negativ auf die Performence auswirken. Das "Attribute Pattern" bietet eine gute Lösung für diese Fälle.

      • Das Attribute Pattern

        • Denken wir uns eine Collection in der Filme eingetragen werden. Die Dokumente werden wohl eine einige ähnliche Felder haben. Dazu werden wahrscheinlich der Titel, der Regiseur, der Produzent, die Besetzung usw. gehören. Nehmen wir nun mal an wir wollen anhand des Veröffentlichungsdatums nach Filmen suchen. Eine Herausforderung dabei ist herauszufinden, welchens Veröffentlichungsdatum? Filme werden in der Regel in unterschiedlichen Ländern an unterschiedlichen Tagen veröffentlicht.
          {
          title: "Star Wars",
          director: "George Lucas",
          ...
          release_US: ISODate("1977-05-20T01:00:00+01:00"),
          release_France: ISODate("1977-10-19T01:00:00+01:00"),
          release_Italy: ISODate("1977-10-20T01:00:00+01:00"),
          release_UK: ISODate("1977-12-27T01:00:00+01:00"),
          ...
          }

          Eine Suche nach dem Veröffentlichungsdatum würde es also notwendig machen eine ganze Reihe von Feldern zu durchsuchen. Damit diese Suche auch noch performant bleibt müßten wir auch eine ganze Reihe von Indexen auf die Film Collection setzen.
          {release_US: 1}
          {release_France: 1}
          {release_Italy: 1}
          ...

          Indem wir das "Attribute Pattern" anwenden, schieben wir das Subset von Informationen einfach in ein Array und reduzieren damit die Menge an benötigten Indexen. Wir nutzen einfach ein Array mit Schlüssel-Wert-Paaren (Key-Value-Pairs).
          {
          title: "Star Wars",
          director: "George Lucas",

          releases: [
          {
          location: "USA",
          date: ISODate("1977-05-20T01:00:00+01:00")
          },
          {
          location: "France",
          date: ISODate("1977-10-19T01:00:00+01:00")
          },
          {
          location: "Italy",
          date: ISODate("1977-10-20T01:00:00+01:00")
          },
          {
          location: "UK",
          date: ISODate("1977-12-27T01:00:00+01:00")
          },

          ],

          }

          Die Indexe werden so auch viel besser verwaltbar, weil ja nur noch ein einziger Index auf die Elemente des Arrays gesetzt wird.
          {
          "releases.location": 1,
          "releases.date": 1
          }

          Durch das "Attribute Pattern" organisieren wir unsere Dokumente automatisch besser anhand häufig auftretender Charakteristiken und berücksichtigen dabei sogar selten auftretende und unvorhersehbare Fälle, z.B. wenn der Film auf einem kleinen, unbekannten Filmfestival vorgestellt wird. Die Daten nach einer Schlüssel-Wert-Konvention zu sortieren erlaubt zudem die Verwendung nicht deterministischer Namen und das einfache hinzufügen einer Qualifizierung. Wenn wir z.B. eine Collection mit Wasserflaschen haben könnten die Attribute folgendermaßen aussehen.
          "specs": [
          { k: "volume", v: "500", u: "ml" },
          { k: "volume", v: "12", u: "ounces" }
          ]

          Auch hier brechen wir die Informationen in Schlüssel (Keys - k) und Werte (Values - v) herunter. Dann fügen wir noch ein drittes Feld hinzu (Unit - u) welches es uns ermöglicht die Einheit separat zu speichern.

          • Beispiel Use Cases

            • Das "Attribute Pattern" eignet sich sehr gut für Schemata, die mehrere Felder des gleichen Datentyps haben, z.B. Listen von Datumswerten. Es eignet sich sehr gut um z.B. die Ausprägungen eines Produktes darzustellen. Kleidung kommt z.B. immer in bestimmten Größen wie "small", "medium" oder "large". Andere Produkte der Collection könnten in Mengen, physikalischen Dimensionen oder Gewicht angegeben sein.

              Es gibt Anwendungsbeispiele aus dem Asset Management wo das "Attribute Pattern" erfolgreich angewendet wurde. Man speicherte damit einfach alle Attribute eines Assets. Die Charakteristiken sind selten gleich bei unterschiedlichen Assets oder zum Zeitpunkt des Designs der Applikation einfach nicht vorhersehbar. Typische Assets wären Immobilien, Firmenanteile, Aktien, Fondsanteile oder Tagesgeldkonten. Wenn jetzt aber auch noch teurer Whisky oder Oldtimer hinzukommen, dann haben diese Güter plötzlich ganz andere Attribute. In einem relationalen Modell gibt es in der Regel einen komplizierten Design Prozeß um diese Fälle als "Benutzerdefinierte Felder" umzusetzen.

              Viele Felder in einem Produktkatalog sind ähnlich: Name, Zulieferer, Hersteller, Herstellungsland usw. die Spezifikationen oder die Attribute eines einzelnen Produktes können aber sehr individuell sein. Wenn die Anwendung darauf angewiesen ist, über viele dieser verschiedenen Felder zu suchen, dann bietet das "Attribute Pattern" dafür eine gute Datenstruktur.

              • Zusammenfassung

                • Das "Attribute Pattern" bietet die die Möglichkeit einer einfachen Indexierung von Dokumenten, bei der eine Vielzahl ähnlicher Felder pro Dokument berücksichtigt werden. Indem man diese Felder in ein Schlüssel-Wert (Key-Value) Unterdokument verschiebt und dabei nicht deterministische Feldnamen verwendet und optionale Felder für eine Qualifizierung hinzufügt definiert man die Beziehung zwischen dem Originalen Feld und dem Wert wesentlich klarer. Durch das "Attribute Pattern" benötigen wir weniger Indexe, unsere Abfragen werden einfacher zu schreiben und sind auch noch schneller in der Ausführung.

                  Wer mehr über das Schema Design in MongoDB erfahren möchte, dem sei der Qualiero Kurs für Datenbank Entwickler empfohlen https://www.qualiero.com/lerninhalte/classroom-trainings/mongodb-datenbank-entwickler-kurs.html

Latest member activities

Recommend this community post