Wie Beziehungen in Azure Cosmos DB zu strukturieren?

stimmen
0

Ich habe zwei Sätze von Daten in der gleichen Sammlung im Kosmos, sind eins ‚Stellen‘ und die anderen sind ‚Nutzer‘, werden sie von den Pfosten verbunden sind Benutzer erstellen.

Derzeit meine Struktur ist wie folgt;

// user document
{
id: 123,
postIds: ['id1','id2']
}

// post document
{
id: 'id1',
ownerId: 123
}
{
id: 'id2',
ownerId: 123
}

Mein Hauptproblem mit dieser Einstellung ist die fungiblen Natur davon, Code den Link zu erzwingen hat und wenn es einen Fehler Daten ist wird sehr leicht ohne klare Art und Weise verloren werden, sich zu erholen.

Ich bin auch besorgt über die Leistung, wenn ein Benutzer 10.000 Beiträge hat die 10.000-Lookups sind Ich werde tun müssen, um alle Inhalte manuell zu lösen ..

Ist dies die richtige Methode für Entitätsbeziehungen Modellierung?

Veröffentlicht am 19/12/2018 um 14:09
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
2

Wie von David sagte, ist es eine lange Diskussion, aber es ist ein sehr häufig eine so, da ich auf Stunde oder so von „freien“ Zeit, ich bin mehr als froh, zu versuchen, sie zu beantworten, ein für alle Mal, hoffentlich.

WARUM NORMALIZE?

Das erste , was ich in Ihrem Beitrag bemerken: Sie ein gewisses Maß an referentielle Integrität suchen ( https://en.wikipedia.org/wiki/Referential_integrity ) , das etwas ist , das benötigt wird , wenn Sie ein größeres Objekt in seine Bestandteile Stücke zerlegen. Auch Normalisierung bezeichnet.

Während dies in der Regel in einer relationalen Datenbank erfolgt ist, wird es nun auch immer beliebter in nicht-relationaler Datenbank, da es hilft viele Daten Doppelarbeit zu vermeiden, die in der Regel mehr Probleme schaffen als das, was sie löst.

https://docs.mongodb.com/manual/core/data-model-design/#normalized-data-models

Aber brauchen Sie wirklich? Da Sie gewählt haben, JSON Dokument-Datenbank zu verwenden, sollten Sie die Tatsache nutzen, dass es in der Lage ist, das gesamte Dokument zu speichern und speichern Sie dann einfach das Dokument zusammen mit dem alle Eigentümer Daten: Name, Vorname, oder alle anderen Daten, die Sie über den Benutzer haben die erstellt das Dokument. Ja, ich sage, dass Sie sollten bewerten nicht Post und Benutzer zu haben, aber nur Beiträge, mit Benutzer info innen it.This korrekt eigentlich sehr sein kann, wie Sie die genauen Daten für den Benutzer erhalten werden sicher sein, bestehenden im Moment der Post Schöpfung. Nehmen wir zum Beispiel ich einen Beitrag erstellen, und ich habe Biographie „X“. Ich meine Biographie aktualisieren Sie dann auf „Y“ und einen neuen Beitrag erstellen. Die beiden Posten werden verschiedene Autor Biographien haben und das ist genau das Richtige, da sie genau die Wirklichkeit erfasst haben.

Natürlich können Sie auch eine Biografie in einer Autorenseite angezeigt werden soll. In diesem Fall werden Sie ein Problem haben. Welche Sie verwenden werden? Wahrscheinlich die letzte.

Wenn alle Autoren, um in Ihrem System vorhanden ist, muß Blog-Post veröffentlicht hat, das gut genug sein kann. Aber vielleicht möchten Sie ein Autor haben seine Biographie schreiben und in Ihrem System aufgelistet werden, noch bevor er einen Blogeintrag schreibt.

In einem solchen Fall müssen Sie das Modell normalisieren und einen neuen Dokumenttyp, nur für Autoren erstellen. Wenn dies der Fall ist, dann müssen Sie auch herausfinden, wie die Situation vor beschriebenen Handler. Wenn der Autor seine eigene Biografie aktualisieren, werden Sie nur den Autor Dokument aktualisieren oder einen neuen erstellen? Wenn Sie einen neuen erstellen, so dass Sie den Überblick über alle Änderungen halten, werden Sie auch alles vorherige Post aktualisieren, damit sie das neue Dokument verweisen werden, oder nicht?

Wie Sie die Antwort ist komplex sehen können, und hängt davon ab, welche Art von Informationen, die Sie aus der realen Welt erfassen möchten.

Also, zunächst, herauszufinden, ob Sie wirklich Beiträge und Benutzer getrennt halten müssen.

KONSISTENZ

Nehmen wir an , dass Sie wirklich in separaten Dokumenten gehalten Beiträge und Benutzer haben wollen, und damit normalisieren Sie Ihr Modell. In diesem Fall bedenken Sie, dass Cosmos DB (aber NoSQL im Allgemeinen) Datenbanken DO jede Art von nativer Unterstützung nicht bieten referenzielle Integrität zu erzwingen, so sind Sie ziemlich viel auf eigene Faust. Indizes kann natürlich helfen, so können Sie die ownerId Eigenschaft indizieren mögen, so dass vor einem Autor, zum Beispiel zu löschen, können Sie effizient überprüfen , ob es eine Blog - Post ist von ihm getan / ihr , die Waisen sonst bleiben. Eine weitere Möglichkeit ist es , manuell zu erstellen und hält ein anderes Dokument aktualisiert , die für jeden Autor, den Überblick über die Blog - Posts hält er / sie geschrieben hat. Mit diesem Ansatz können Sie in diesem Dokument anschauen zu verstehen , welche Blog - Posts zu einem Autor gehören. Sie können versuchen , dieses Dokument automatisch Trigger aktuellen Stand zu halten, oder tun es in Ihrer Anwendung. Denken Sie daran, dass , wenn Sie normalisieren, in einer NoSQL - Datenbank, halten Daten konsistent ist Ihre Verantwortung. Das ist genau das Gegenteil von einer relationalen Datenbank, wo Ihre Aufgabe ist es Daten konsistent zu halten , wenn Sie es de-normalisiert.

PERFORMANCE

Leistung könnte ein Problem sein, aber Sie müssen nicht in der Regel, um modellieren Leistungen in erster Linie zu unterstützen. Sie modellieren, um sicher, dass Ihr Modell machen kann die Informationen, die Sie aus der realen Welt müssen darstellen und speichern und Sie es dann optimieren, um mit der Datenbank, die Sie ordentliche Leistung haben müssen, verwenden gewählt haben. Da verschiedene Datenbank unterschiedliche Beschränkungen haben wird, wird das Modell dann mit, dass Einschränkungen umgehen angepasst werden. Das ist nicht mehr und nicht weniger, dass die gute alte „logische“ vs „physische“ Modellierung Diskussion.

In Cosmos DB Fall sollten Sie nicht Abfragen, die Cross-Partition gehen, wie sie teurer sind.

Leider ist Partitionierung etwas, das Sie einmal gewählt und für alle, so brauchen Sie wirklich klar im Kopf haben, was der häufigste Anwendungsfall sind Sie im besten Fall zu unterstützen. Wenn die Mehrheit der Ihre Anfragen auf pro Autor Basis durchgeführt wird, würde ich pro Autor partitionieren.

Jetzt, während dies kann eine kluge Wahl scheint, wird es nur, wenn Sie eine Menge Autoren haben. Wenn Sie nur ein, zum Beispiel, werden alle Daten und Abfragen in nur eine Partition gehen, viel Ihre Leistung zu begrenzen. Denken Sie daran, in der Tat, dass Cosmos DB RU sind unter allen verfügbaren Partitionen aufgeteilt: mit 10.000 RU, Sie zum Beispiel in der Regel 5 Partitionen erhalten, was bedeutet, dass alle Werte auf 5 Partitionen verteilt werden. Jede Partition wird eine obere Grenze von 2000 RU hat. Wenn alle Ihre Anfragen nur eine Partition verwenden, um Ihre tatsächliche maximale Leistung ist, dass 2000 und nicht 10000 EVUs.

Ich hoffe wirklich, diese Hilfe Sie die Antwort, um herauszufinden, zu starten. Und ich hoffe, diese Hilfe wirklich zu fördern und zu wachsen, um eine Diskussion (wie für ein Dokument Datenbank zu modellieren), dass ich denke, es ist wirklich fällig ist und jetzt reife.

Beantwortet am 03/01/2019 um 02:37
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more