it-swarm.com.de

MongoDB-Normalisierung, Fremdschlüssel und Beitritt

Bevor ich tagelang wirklich tief in MongoDB eintauche, dachte ich, ich würde eine ziemlich grundlegende Frage stellen, ob ich überhaupt darauf eingehen soll oder nicht. Ich habe im Grunde keine Erfahrung mit nosql.

Ich habe ein wenig über die Vorteile von Dokumentendatenbanken gelesen und denke, dass sie für diese neue Anwendung wirklich großartig sein werden. Es ist immer mühsam, Favoriten, Kommentare usw. für viele Arten von Objekten (viele M-zu-M-Beziehungen) und Unterklassen zu erstellen.

Ich habe auch eine Struktur, die in SQL nur schwer zu definieren ist, da sie extrem verschachtelt ist und viel besser in ein Dokument übersetzt wird als 15 verschiedene Tabellen.

Aber ich bin über ein paar Dinge verwirrt.

  1. Ist es wünschenswert, Ihre Datenbank weiterhin normalisiert zu halten? Ich möchte wirklich nicht mehrere Datensätze aktualisieren. Gehen die Leute immer noch so mit dem Design der Datenbank in MongoDB um?

  2. Was passiert, wenn ein Benutzer ein Buch favorisiert und diese Auswahl noch in einem Benutzerdokument gespeichert ist, das Buch dann jedoch gelöscht wird? Wie wird die Beziehung ohne Fremdschlüssel getrennt? Bin ich manuell dafür verantwortlich, alle Links selbst zu löschen?

  3. Was passiert, wenn ein Benutzer ein Buch bevorzugt, das es nicht mehr gibt, und ich es abfrage (irgendeine Art von Verknüpfung)? Muss ich hier eine Fehlertoleranz machen?

64
egervari

MongoDB unterstützt keine serverseitigen Fremdschlüsselbeziehungen, auch von einer Normalisierung wird abgeraten. Wenn möglich, sollten Sie Ihr untergeordnetes Objekt in übergeordnete Objekte einbetten. Dies erhöht die Leistung und macht Fremdschlüssel völlig unnötig. Da dies nicht immer möglich ist, gibt es ein spezielles Konstrukt namens DBRef, mit dem Objekte in einer anderen Auflistung referenziert werden können. Dies kann dann nicht so schnell sein, da DB zusätzliche Abfragen zum Lesen von Objekten durchführen muss, aber eine Art Fremdschlüsselreferenz zulässt.

Trotzdem müssen Sie Ihre Referenzen manuell bearbeiten. Nur wenn Sie Ihr DBRef nachschlagen, werden Sie feststellen, ob es existiert. Die DB durchsucht nicht alle Dokumente, um nach Referenzen zu suchen und diese zu entfernen, wenn das Ziel der Referenz nicht mehr existiert. Ich denke jedoch, dass das Entfernen aller Verweise nach dem Löschen des Buches eine einzige Abfrage pro Sammlung erfordern würde, nicht mehr, also nicht wirklich so schwierig.

Wenn Ihr Schema komplexer ist, sollten Sie wahrscheinlich eine relationale Datenbank und nicht nosql wählen.

Es gibt auch ein Buch zum Entwerfen von MongoDB-Datenbanken: Document Design for MongoDB

[~ # ~] update [~ # ~] Das obige Buch ist nicht mehr erhältlich, aber aufgrund der Popularität von MongoDB gibt es eine ganze Reihe anderer . Ich werde sie nicht alle verlinken, da sich solche Links wahrscheinlich ändern werden. Eine einfache Suche bei Amazon zeigt mehrere Seiten an, so dass es kein Problem sein sollte, einige zu finden.

Weitere Einzelheiten und Beispiele finden Sie auf der MongoDB-Handbuchseite für 'Manual references' und DBRefs

63
Tomasz Stanczak

Oben heißt es in @TomaaszStanczak

MongoDB unterstützt keine serverseitigen Fremdschlüsselbeziehungen, auch von einer Normalisierung wird abgeraten. Wenn möglich, sollten Sie Ihr untergeordnetes Objekt in übergeordnete Objekte einbetten. Dies erhöht die Leistung und macht Fremdschlüssel völlig unnötig. Das heißt, es ist nicht immer möglich ...

Die Normalisierung wird von Mongo nicht entmutigt. Um es klar auszudrücken, es handelt sich um zwei grundlegend unterschiedliche Arten von Beziehungen, die zwei Dateneinheiten haben können. In einem Fall gehört eine untergeordnete Entität ausschließlich einem übergeordneten Objekt . In diese Art von Beziehung soll der Mongo-Weg eingebettet werden.

In der anderen Beziehungsklasse existieren zwei Entitäten unabhängig voneinander - sie haben unabhängige Lebensdauern und Beziehungen. Mongo wünscht sich, dass diese Art von Beziehung nicht existiert, und schweigt frustrierend darüber, wie man genau damit umgeht. Einbetten ist einfach keine Lösung. Normalisierung wird nicht entmutigt oder gefördert. Mongo bietet Ihnen nur zwei Mechanismen, um damit umzugehen. Manuelle Verweise (analog zu einem Schlüssel mit der Fremdschlüsseleinschränkung, die zwei Tabellen bindet) und DBRef (eine andere, etwas strukturiertere Methode, um dasselbe zu tun). In diesem Anwendungsfall gewinnen SQL-Datenbanken.

20