2016-04-09 17 views
1

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

1

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/

1

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.

2

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.

Verwandte Themen