Ich habe eine Sammlung Benutzer, das heißt Name, Passwort, E-Mail usw.
Auch ich habe eine Sammlung Gruppen, jede Gruppe hat ihre Mitglieder - Array von Benutzern.
Wie soll ich meine Datenbank gestalten? Ich sehe deutlich 2 Möglichkeiten, dies zu tun:
Weg 1 (MySQL-like): Jeder Benutzer hat eine _id, also habe ich es einfach in die Mitglieder-Array und so sei es.
Weg 2: Kopieren Sie ein ganzes Benutzerdokument und fügen Sie einige Felder hinzu.
Auf der MongoDB-Site sagen sie, dass doppelte Daten nichts über den niedrigen Preis der Speicher zu kümmern sind. Sie sagen auch, dass wir JOINs beim Lesen von Daten vermeiden sollten.So entwerfen Sie meine Mongo-Datenbank
Antwort
Tatsächlich hängt die Antwort auf diese Frage davon ab, welche Art von Bildschirmen Sie entwerfen und welche Art von Abfragen Sie vornehmen werden, um Daten abzurufen. Lassen Sie Pro und Kontra jeder Option durchgehen, die Ihnen helfen wird, jede Option zu bewerten.
Way 1: - Putting Reihe von benutzerkennungen in Gruppe Sammlung
Pros
1) Wenn Sie einen Bildschirm, der Gruppe Details einer bestimmten Gruppe und die Liste aller Mitglieder zeigt (users_ids), die zu dieser Gruppe gehören, dann kann eine Abfrage alle für diesen Bildschirm erforderlichen Details abrufen, und sie wäre auch schneller.
Cons
1) Wenn in der Gruppe Detailbild Sie haben Details von Benutzern zu zeigen, zusammen mit Gruppendetails, dann seit mongodb bietet keinen beitritt, würden Sie Benutzerdaten in einer separaten Abfrage abgeholt werden und würde sowohl auf der Client-Seite beitreten. Dies kann sich auf die Leistung auswirken.
2) Wenn Sie einen Bildschirm haben, der Benutzerdetails und alle Gruppen anzeigt, in die er/sie gehört, dann suchen Sie user_id im Benutzer-Array in der Gruppensammlung. Wenn Sie erwarten, dass die Anzahl der Mitglieder in einer Gruppe sehr hoch ist (Millionen), kann die Suche innerhalb des Arrays zu einem enormen Leistungseinbruch führen.
Way 2: - Kopieren Benutzer Dokument innerhalb innen Gruppe Sammlung
Daten Duplizierung ist kein Problem in MongoDB, aber Sie sollten einen wirklich guten Grund dafür haben. Die Daumenregel sollte doppelte Daten sein, wenn die Beziehung 1: wenige und nicht 1: viele ist.
Pros
1) Dieser Ansatz wird Sie speichern Gruppe beitreten und Benutzer Sammlung an Client-Seite als eine Abfrage kann zusammen mit seinen Nutzern alle Details der Gruppe holen.
Cons
1) Angenommen, Sie haben eine Million Gruppen und user_id_1 gehört zu 100.000 Gruppen, dann, wenn Sie ein Update auf user_id_1 haben, werden Sie 100.000 Dokumente aktualisieren. Dies kann wiederum zu enormen Leistungseinbußen führen.
2) Auch wenn eine große Anzahl von Benutzern eine Gruppe abonniert, nimmt die Dokumentgröße dieser Gruppe weiter zu. In Mongodb bedeutet dies, dass Sie kein Dokument mit mehr als 16 MB haben können, sodass Sie Benutzer nicht unbegrenzt zu einer Gruppe hinzufügen können. Dies wird Ihre Funktionalität einschränken.
Way 3: - Embed Gruppendetails in Benutzer Sammlung
Pros
1) Eine Abfrage kann auf Benutzerdaten zusammen mit allen Details aller Gruppen dieser Benutzer gehört holen.
2) Wenn Sie nur wenige Benutzer in einer Gruppe erwarten, haben Sie nur wenige Gruppenarrays in einem Benutzerdokument. Dies wird 16 MB nicht überschreiten.
Cons
1) Wenn Sie erwarten, dass ein Benutzer zu viele viele Gruppen (in Millionen) abonnieren können, dann können Benutzer Dokument 16MB Grenze überschreiten.
2) Auch wenn Sie sehr häufige Aktualisierungen in Gruppendetails haben, müssen Sie dasselbe in vielen Benutzerdokumenten aktualisieren.
Sie können auch über den folgenden Link, um mehr Details über Datenmodell-Design zu bekommen: - https://docs.mongodb.org/manual/core/data-model-design/
Es hängt davon ab, wie Sie Daten in Ihrer Anwendung verwenden.
Wenn Sie mehr als 2 Gruppen haben und Sie einen Benutzer in allen Gruppen suchen müssen, betten Sie das Benutzerdokument innerhalb der Gruppe ein (Weg 2) ist keine gute Idee. Also in diesem Fall, dass ich die Art und Weise 1.
verwenden sugest Wenn Sie nur 2 Gruppen oder die Benutzergruppe haben, bevor Ihre Anwendung bekannt sein, wenn die Abfrage zu tun, verwenden Sie dann den Weg 2.
Ich denke, das Die Trennung der Daten ist der richtige Weg, da es besser ist, die Benutzerdaten direkt zu aktualisieren, abzurufen und zu löschen.
doppelte Daten ist nichts über
Diese ist etwas zu befürchten zu kümmern, wenn es um die Aktualisierung kommt. Angenommen, Sie haben Benutzerdetails in jedem Dokument verschachtelt und dupliziert. Was passiert, wenn ein Benutzer seinen Namen ändert? Sie müssen jede Instanz dieses Benutzers in jedem Dokument aktualisieren.
Achten Sie darauf, zwischen Daten und Entitäten zu unterscheiden. Ein Benutzer ist eine Entität, denken Sie sorgfältig nach, bevor Sie Entitäten vervielfältigen, da das spätere Korrigieren harte Arbeit sein kann.
Persönlich würde ich sie teilen, es sei denn, Sie befinden sich in einer Situation, in der Leistung zu langsam ist, um den Beitritt in Echtzeit zu tun. Dann, und nur dann, erwägen Sie das Zusammenführen.
- 1. So entwerfen Sie DynamoDB für Nachrichtenartikel Tabelle
- 2. So entwerfen Sie einen Client-Server-Architekt
- 3. So entwerfen Sie ein lineares GUI-Programm
- 4. So entwerfen Sie einen ungefähren Lösungsalgorithmus
- 5. So entwerfen Sie eine Empfehlung Seite
- 6. So entwerfen Sie einen verteilten node.js Webserver
- 7. Wenn Sie nicht in UML entwerfen, wofür entwerfen Sie dann?
- 8. Entwerfen Sie eine Mini-Skriptsprache
- 9. So teilen Sie meine Transaktionen
- 10. So entwerfen Sie eine Restful-API für Masseneinfügungen und -updates?
- 11. So entwerfen Sie einen zurückgegebenen Stream, der überspringen kann
- 12. So entwerfen Sie eine einfache CRUD-REST-API
- 13. So entwerfen Sie die Klassenstruktur anstelle einer großen Enum
- 14. So entwerfen Sie den Datenzugriffslayer im Entity Framework (Data First)
- 15. so verloren beim Entwerfen dieser Tabellen!
- 16. Wie würden Sie ein RESTful Abstimmungssystem entwerfen?
- 17. So leiten Sie meine gelöschten Links um
- 18. So ermitteln Sie meine Datenbank Benutzername/Passwort
- 19. So erstellen Sie meine Schaltfläche "Speichern"
- 20. So laden Sie meine Ansicht in iOS
- 21. So vereinfachen Sie meine SQL-Abfrage
- 22. So löschen Sie meine lokale Datei
- 23. So sichern Sie meine Anwendungskontakte wie Facebook
- 24. So listen Sie meine Wände auf [Screeps]
- 25. So speichern Sie meine Symfony 2-Sammlung?
- 26. So öffnen Sie meine Anwendung im Querformat
- 27. Wie kann ich meine asp.net-Oracle-Konfiguration entwerfen?
- 28. Entwerfen Sie ein besseres Layout für Android?
- 29. Entwerfen und speichern Sie eine Wechselkurs-Kreuztabelle
- 30. Entwerfen Sie eine feste Halbkugel in three.js