Ich möchte Mongo lernen und habe beschlossen, eine komplexere Todo-Anwendung für Lernzwecke zu erstellen.
Die Grundidee ist eine Aufgabenliste, in der Aufgaben in Ordnern gruppiert sind. Benutzer haben möglicherweise einen anderen Zugriff auf diese Ordner (Lesen, Schreiben) und Aufgaben können in andere Ordner verschoben werden. In der Regel (vor allem zum Synchronisieren) werden Aufgaben nach Ordner und nicht alleine abgefragt.
Grundsätzlich habe ich über drei Ansätze nachgedacht und würde gerne Ihre Meinung dazu hören. Vielleicht habe ich einige Punkte verpasst oder habe einfach die falsche Art zu denken.
User
, Folder
, Task
Folders
enthalten Verweise auf Users
Folders
enthalten Verweise auf Tasks
Problem
Task
wird ein Verweis auf Folder
benötigt. Entweder wird diese Referenz in der Task gespeichert (Redundanz) oder sie muss mit jedem API-Aufruf übergeben werden. User
, Folder
Folders
enthalten Verweise auf Users
Tasks
sind Filialdokumente innerhalb von Folders
Problem
Task
zu aktualisieren, ohne das Folder
zu kennen. Beide müssen ebenfalls übertragen werden, aber es gibt keine Redundanz im Vergleich zu A. User
, Folder
, Task
Folders
enthält Verweise auf Users
Tasks
behalten einen Verweis auf ihre Folders
Problem
Wenn Sie für den Ordner keine Metadaten benötigen, außer dem Namen, mit dem Sie auch fortfahren könnten:
User
, Task
Task
hat Feld folder
User
hat die Arrays read_access
und write_access
Dann
Sie können eine Liste aller Ordner mit
abrufendb.task.distinct ("Ordner")
Der Ordner, auf den ein bestimmter Benutzer zugreifen kann, wird automatisch beim Abrufen des Benutzerdokuments abgerufen, sodass diese beim Anmelden grundsätzlich bekannt sind.
Sie können alle Aufgaben abrufen, die ein Benutzer mit
lesen kanndb.task.find ({Ordner: {$ in: read_access}})
mit read_access
als das entsprechende Array, das Sie aus Ihrem Benutzerdokument erhalten haben. Dasselbe mit write_access
.
Sie können alle Aufgaben in einem Ordner mit einer einfachen Suchabfrage für den Ordnernamen finden.
Das Umbenennen eines Ordners kann mit einer Aktualisierungsabfrage für jede Sammlung erreicht werden.
Das Erstellen eines Ordners oder das Verschieben einer Aufgabe in einen anderen Ordner kann ebenfalls auf einfache Weise erreicht werden.
Also ohne Metadaten für Ordner würde ich das machen. Wenn Sie Metadaten für Ordner benötigen, kann es etwas komplizierter werden, aber im Grunde können Sie diese unabhängig von den Aufgaben und Benutzern verwalten, indem Sie eine Ordnersammlung mit den Metadaten mit _id
als Ordnernamen in user
und task
verwenden. .
Bearbeiten:
Gestolpert über diesen Link , der für Sie von Interesse sein könnte . Es gibt eine Diskussion über den Übergang von einem relationalen Datenbankmodell zu Mongo. Der Unterschied liegt darin, dass man in einer relationalen Datenbank normalerweise versucht, das dritte Normalformular zu verwenden, wobei eines der Ziele darin besteht, Verzerrungen zu vermeiden Zu jeder Form von Zugriffsmustern können Sie in mongodb versuchen, Ihre Daten so zu modellieren, dass sie am besten zu Ihren Zugriffsmustern passen (ohne dabei mögliche Datenanomalien durch Redundanz einzuführen).
Also vor diesem Hintergrund:
Probleme, die bei den Schemas auftreten können: Da A und C grundsätzlich relational sind, können Sie ein Problem mit Fremdschlüsseln bekommen, da mongodb keine Fremdschlüsselzwänge durchsetzt ( ZB könnten Sie einen Ordner löschen, während noch Aufgaben auf C verweisen, oder eine Aufgabe, ohne ihre Referenz im Ordner A zu löschen. Sie können dieses Problem umgehen, indem Sie es aus der Anwendung erzwingen. Für B kann das 16 MB-Dokumentlimit zu einem Problem werden, das dadurch vermieden werden kann, dass Ordner in mehrere Dokumente aufgeteilt werden, wenn sie eine bestimmte Aufgabenanzahl erreichen.
Also neue Schlussfolgerung: Ich denke, dass A und C Ihnen möglicherweise nicht die Vorteile von mongodb (und vielleicht sogar mehr Arbeit in mongodb als in sql) zeigen Sie sind das, was Sie in einer traditionellen relationalen Datenbank tun würden, für die mongodb nicht vorgesehen ist (zB die fehlende Join-Anweisung, keine Fremdschlüsselbeschränkungen). Zusammengefasst entspricht B am ehesten Ihrem Zugriff. "Normalerweise (vor allem für die Synchronisierung) werden Aufgaben nach Ordner angefordert, während Sie nach dem Öffnen des Ordners die Aufgaben einfach bearbeiten und verschieben können.