MongoDB schema-design für mehrere auth-user-accounts
Ich bin über meinen node.js - /express - /Mungo /Pass Anwendung, und ich bin denken über das Recht "schema-design" für Benutzer und Konten.
Wird es Benutzer loging in von twitter und facebook sowie von einheimischen Konten. Zu einem späteren Zeitpunkt möchte ich einen Benutzer für die Verbindung der beiden twitter und facebook mit meiner Anwendung (und vielleicht noch weitere externe Konten).
Ich kann nicht denken Sie an eine gute Lösung für diese situation. Hier sind die Optionen die ich denke:
1.Mit einem Profil Modell-und Konto-Modelle. Profil-Dokumente darstellen, die unique user, während ein Konto entweder Benutzername und Passwort (internes Konto) oder die Authentifizierungs-Daten aus den auth-provider (externes Konto). Ein Profil muss mindestens einen verschachtelte Konto-Dokument.
var ExtAccountSchema = new Schema({
type: String, //eg. twitter, facebook, native
uid: String
});
var IntAccountSchema = new Schema({
username: String,
password: String
});
var ProfileSchema = new Schema({
firstname: String,
lastname: String,
email: String,
accounts: [Account] //Pushing all the accounts in there
});
Was ich nicht mag über es sind nicht so konsistent Konto-Dokumente, die aus verschiedenen account-Daten und der Tatsache, dass ich habe eine harte Zeit der Suche nach dem richtigen Konto, wenn meine Benutzer anmeldet (Suche nach uids und account-Typen, die in geschachtelten Dokumenten -.-)
2.Nachdem alle Daten in einem einzigen Modell
var ProfileSchema = new Schema({
firstname: String,
lastname: String,
email: String,
twitter-uid: String,
facebook-uid: String
password: String
});
Gut, das ist nur hässlich -.- Wäre es vielleicht einfacher/schneller zu finden, die richtigen Konto Daten, aber es ist nicht schön zu pflegen.
Gibt es eine bessere Lösung? Gibt es eine best practice?
- Im Gegensatz zu relationalen Datenbanken mit MongoDB die besten "schema-design" hängt weitgehend davon ab, wie Sie gehen, um auf die Daten zugreifen. Was werden Sie mit den Account-Daten, und wie werden Sie zugreifen?
- Ich werde die Konto-Daten für die Authentifizierung bei passport. Profil-Daten zugegriffen wird, die auf fast jeder Seite mehrere Zwecke. Ich werde auf Sie durch Mungo ODM
- So Account-Daten wird nur zugegriffen werden, wenn der Benutzer sich anmeldet, und Sie werden mit einer session-Mechanismus zum verfolgen von Anmeldungen, wenn das passiert? (Im Gegensatz zu dem brauchen die Account-Daten auf jede Seite zugreifen.)
- Ich muss user-Daten auf jeder Seite. Aber ich bin nicht sicher, wie Sie zu strukturieren. In meinem Beispiele habe ich unterteilt die Daten in Konten und profile. Also ich kann auf das Profil zugreifen, alle die Zeit und die Konten nur für die Anmeldung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
1) Es gibt drei Strategien, die Sie nehmen könnte, um die Struktur der Daten in MongoDB:
Strategie (a) ist der erste, der Sie beschreiben, wo das Profil-Dokument enthält ein array von Account-sub-Dokumente.
Strategie (b) ist ähnlich wie die Strategie (a), aber Sie würde verwenden Sie ein array von Referenzen auf andere Dokumente (typischerweise in einer Account-Sammelliste), anstatt die Einbettung der eigentlichen Dokumente.
Strategie (c) ist die, die Sie beschreiben, als "dass alle Daten in einem einzigen Modell".
2) Es ist allgemein als Best Practice gilt, um ein array verwenden von eingebetteten Dokumenten, vor allem, wenn die Informationen in Ihnen kann variieren. Wenn es Ihr Leben einfacher machen wird, können Sie einen Schlüssel zur Unterscheidung der Art des Kontos, etwa so:
3) MongoDB können Sie die Suche auf ein eingebettetes Dokument. So würden Sie die folgende Abfrage schreiben (JavaScript-syntax):
Mit entsprechenden Indizes, diese Abfrage Recht schnell.
ProfileSchema.index({accounts.kind, accounts.uid},{unique: true, sparse: true});
?