von Marc-David Militz
Forum: MongoDB Theorie
{
_id: ObjectId("507f1f77bcf86cd799439011"),
date: ISODate("2019-02-18"),
customer_id: 123,
order: [
{
product: "widget",
qty: 5,
cost: {
value: NumberDecimal("11.99"),
currency: "USD"
}
}
]
}
{
_id: 123,
name: "Katarina Pope",
street: "123 Main St.",
city: "Somewhere",
country: "Someplace",
...
}
Vom Performance-Standpunkt betrachtet kann das zu einem Problem werden, wenn wir die einzelnen Informationen zusammenfügen und in einer speziellen Reihenfolge anzeigen sollen. Ein Kunde kann N Bestellungen haben, was eine 1-N Beziehung erzeugt. Wenn wir das von der anderen Seite, der Bestellung, betrachten dann gibt es eine N-1 Beziehung zum Kunden. Wenn wir nun die Kundeninformationen in jede Bestellung schreiben, nur um die Anzahl der JOINS zu reduzieren, dann erzeugen wir eine ganze Menge redundanter Informationen. Dazu kommt noch, dass wir evtl. gar nicht alle Informationen, über einen Kunden, in einer Bestellung brauchen.
Das "Erweiterte Referenz Pattern" bietet eine großartige Möglichkeit, um diese Konstellationen zu behandeln. Anstatt alle Informationen des Kunden zu duplizieren, kopieren wir nur diejenigen, die regelmäßig benötigt werden. Es werden als nicht alle Felder oder eine Referenz gespeichert, sondern die Felder mit der höchsten Priorität, die auch regelmäßig verwendet werden. z.B. Name und Adresse.
{
_id: ObjectId("507f1f77bcf86cd799439011"),
date: ISODate("2019-02-18"),
customer_id: 123,
shipping_adress: {
name: "Katarina Pope",
street: "123 Main St.",
city: "Somewhere",
country: "Someplace"
},
order: [
{
product: "widget",
qty: 5,
cost: {
value: NumberDecimal("11.99"),
currency: "USD"
}
}
]
}
Was man sich dabei bewusst machen muss, ist dass die daten dupliziert werden. Aus diesem Grund funktioniert das am besten mit Feldern, das Hauptdokuments, die sich nicht regelmäßig ändern. Die "user_id" oder der "name" sind deshalb Felder, die sich normalerweise gut eignen.
Wir kopieren also nur die Felder, die wir für den jeweiligen Anwendungsfall benötigen. Wenn wir z.B. an eine Rechnung denken, brauchen wir dort eine zweite Telefonnummer oder eine Adresse, die nichts mit der Bestellung zu tun hat? Höchstwahrscheinlich nicht, deshalb können wir diese im Kundendatensatz belassen und bei Bedarf auf diesen referenzieren.
Wenn Daten geupdated werden, dann müssen wir das natürlich vorsehen. Welche erweiterten Referenzen haben sich geändert? Wann müssen diese geupdated werden? Wenn es sich z.B. um die Rechnungsadresse handelt, macht es dann Sinn diese für historische Datensätze zu ändern oder können wir diese einfach so belassen? In diesen Fällen macht eine Vervielfältigung der Daten durchaus Sinn, denn der historische Kontext geht nicht verloren, die Rechnung wurde ja damals an diese Adresse geschickt.