Was ist die empfohlene äquivalent kaskadierendes löschen in MongoDB für N:M Beziehungen?
Vorausgesetzt, die folgenden "schema/Beziehung" design, was ist die empfohlene Praxis für den Umgang löschen mit cascade löschen wie operation?
Relationale Schema:
+---------+ +--------+ | Student|-*--------1-[Einschreibung]-1--------*-| Kurs | +---------+ +--------+
MongoDB:
+---------+ +--------+ | Student|-*----------------*-| Kurs | +---------+ +--------+
Gegeben, das klassische design der Immatrikulation der Studenten auf die Kurse, mit einer Sammlung von Kursen, die Studenten und Umgekehrt scheint zu sein, eine entsprechende Daten-Modell bei der Verwendung von MongoDB (das ist nichts für die Beziehung/Einschreibung Tabelle). Aber aus einer relationalen Welt, wie sollte ich damit umgehen, wie die Semantik der Sie einen Kurs löschen? Das ist, wenn ein Kurs gelöscht wird, werden alle der "Einschreibung" Datensätze gelöscht werden sollen, zu. Das heißt, ich sollte den Kurs zu löschen aus der Auflistung der einzelnen Schüler aufnehmen. Es sieht aus wie feuere ich 2 Abfragen: eine für die Löschung der Kurs und dann löschen Sie es von jedem student ' s Sammlung. Gibt es eine Möglichkeit eine einzelne Abfrage zum ausführen dieses "cascade delete", wie semantic-ohne zusätzliche Abfrage? Tut das Datenmodell ändern zu müssen?
HINWEIS: Für alle anderen Anwendungsfälle der oben genannten Daten Modell funktioniert Prima:
- Löschen student
=>
einfach löschen, der student und der damit verbundenen Sammlung von Kursen gelöscht, zusammen mit ihm. - Schüler bereit, fallen einem natürlich
=>
löschen Sie ihn aus der Studenten-Kollektion von Kursen - Hinzufügen, Schüler/Kurs
=>
fügen Sie es einfach auf die entsprechenden 'Tabelle' im wesentlichen.
Die einzige heikle Sache ist der Umgang mit der Löschung eines Kurses. Wie sollte ich mit diesem Szenario in MongoDB, da ich stammen aus einer relationalen hintergrund und bin nicht in der Lage zu diese Figur ein.
- Es gibt keine Löschweitergabe. Es muss ausgeführt werden, wie zwei Schritte.
- Aufgrund der Natur von MongoDB ich mir kaum vorstellen, du bist Entwurf der Datenbank richtig angezeigt, wenn Sie zu tun haben, so etwas wie "cascade delete" in diesem Fall. Es gibt zwei Ansätze, um das gleiche schema, ist die Einbettung von Kursen in der Schüler oder die Verwendung von arrays mit Zeigern auf die Kurse. In irgendeiner Weise gibt es nicht Löschweitergabe zur Verfügung, Mongo Operationen werden isoliert Dokument-updates-löscht-Einsätze, auch wenn Sie aktualisieren mehrerer Dokumente mit der richtigen Klausel, es ist immer noch verarbeitet ein Dokument zu einem Zeitpunkt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie tun, ist die beste und optimalste Weg, es zu tun in Mongo. Ich bin in einer ähnlichen situation und nach gehen alle möglichen Implementierungen der N:M-design-pattern, auch kam auf diese Lösung.
Offenbar ist Dies nicht ein mongodb-Ding, sondern mehr ein Konzept der NoSQL, wobei die weniger wechselnden Daten (Kurse) können getrennt gehalten werden. Und seit Sie einen Kurs löschen, ist nicht eine sehr häufige operation, Ihre machbar genug, um durch alle gehen, die Datensätze zu entfernen.
Auf der anderen Seite, Sie könnte es sein lassen wie es ist.
In Ihrer Anwendung Logik, ignorieren Sie einfach die Werte von Kursen in der Studenten-Dokument, die nicht reference_id im Laufe Dokument überhaupt. Aber in diesem Fall, müssen Sie sicherstellen, dass alte gelöscht Course_id ' s nicht wiederverwendet werden.
ODER nutzen Sie einfach die gelöschten flags auf den Verlauf dokumentieren und verarbeiten alles in Ihrer Anwendungslogik.
Ich werde die Antwort auf der Grundlage von Mongo-team Empfehlungen. Ich kam auch aus der relationalen Datenbank und ich hatte einige Probleme am Anfang, das Verständnis der Konzepte. Mongo-team empfiehlt, den Entwurf mit der Vorstellung von "Application-Driven" - schema, so dass Sie haben, um herauszufinden, was Teile der Daten gemeinsam gehen. Denken Sie daran, es gibt nicht solch eine Transaktion Konzept auf jede mögliche Art und Weise, in Mongo, selbst wenn wir erfinden einen Treiber, der wickelt Transaktionen, die wir umsetzen sollten, unsere eigene Lösung für dieses. Es bedeutet, wenn ich zwei business-Objekte, die benötigt werden zur gleichen Zeit aktualisiert immer und ich kann nicht dulden, daß ein Versagen in diesem Betrieb, ich Stimme Ihnen in einem einzigen Dokument (atomaren).
In Ihrem Fall haben Sie zwei Dokumente, Schüler und Kurse, und einen Bezug zwischen damals (Ein student immatrikuliert zu N-Kurse). Ich nehme an, die Kurse sind nicht erforderlich, um geändert werden, alle die Zeit, so dass Sie gespeichert werden, in eine andere Sammlung.
Aber der Punkt ist die Beziehung zwischen Ihnen, in diesem Fall müssen Sie atomar löschen Student und alle Kurse, die er eingeschrieben sind.
Also ist die beste Lösung für dieses einbetten, das Verhältnis zu Studenten, und halten eine getrennte Sammlung Natürlich. Wenn Sie löschen Sie die Schüler, ist das Verhältnis sank in der gleichen Zeit:
Student Json:
Kurse kann eine getrennte Sammlung zwischen Ihnen.
Dies ist die Art und Weise zu handhaben es in Mongo. Atomare Operationen muss eingebettet werden in ein einziges Dokument. Ich nahm an Kursen ist eine Liste der Kurse, die ändern Sie nicht so viel, in der Fall Sie sollen durch die Studenten könnten wir ändern ein bisschen die Lösung.