2016-07-28 13 views
1

Ich entwickle meine erste Datenbank in Mongo. Ich verwende Mongoose, um die Modelle zu erstellen. Ich möchte eine Mehrfachbeziehung eins zu vielen implementieren. Es gibt drei Modelle: Benutzer, Gruppe und Rollenmodell. Ein Benutzer kann mehreren Gruppen angehören und mehrere Rollen in derselben Gruppe haben. Zum Beispiel gehört John zu Gruppe 1 und 2. Juan in Gruppe 1 ist Administrator und die Gruppe 2 ist Administrator und Superuser. Im Folgenden werde ich das relationale Schema zeigen:Nodejs: Mehrere Eins zu viele in MongoDB

Schema relational

habe ich die Nachfolgemodelle erstellen:

UserModel

const userSchema = new Schema({ 
     username: {type: String, unique: true}, 
     first_name: String, 
     middle_name: String, 
     first_surname: String, 
     second_surname: String, 
     email: String, 
     password: String 
    }, { 
     timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'} 
    }); 
    const UserModel = mongoose.model('user', userSchema); 

Rolemodel

const roleSchema = new Schema({ 
     name: {type: String, unique: true}, 
     code: {type: String, unique: true}, 
     description: String 
    }, { 
     timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'} 
    }); 
    const RoleModel=mongoose.model('role', roleSchema); 

GroupModel

const groupSchema = new Schema({ 
     name: {type: String, unique: true} 
    }, { 
     timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'} 
    }); 
const GroupSchema = mongoose.model('group', groupSchema); 

GroupUserRoleModel

const groupuserroleSchema = new Schema({ 
    role: {type: Schema.Types.ObjectID, ref: 'role'}, 
    user: {type: Schema.Types.ObjectID, ref: 'user'}, 
    group: {type: Schema.Types.ObjectID, ref: 'group'} 
}); 
const GroupUserRoleModel = mongoose.model('group_user_role', groupuserroleSchema); 

Meine Fragen sind:

  1. Das OK die Implementierungen?
  2. Wenn ich ein GroupUserRole-Dokument erstellen möchte, wie geht das?

Ich habe Informationen über die Methode gesehen bevölkern in Mungo (Populate), aber nur gibt es eine Beziehung Schiff zwischen zwei Modellen Dank für Ihre Hilfe.

Antwort

1

Modelization

Ok, hier die Frage, sind Sie -ähnlichen mit mongodb eine „relationale Datenbank“ erstellen möchten, oder haben eine „NoSQL“ -ähnlichen Datenbank modelize wollen?

Ich sehe, was Sie versuchen, die relationalen Schemas zu reproduzieren. Dies ist ein häufiger Fehler und hier ist eine Erklärung, warum Sie dies vermeiden sollten. Mit mongodb gibt es einige neue Konzepte, die Sie beachten sollten wie eine neue Beziehung (eins zu einigen, viele zu einigen) wobei some eine Gruppe/Liste einer kleinen Anzahl von Dokumenten darstellt (wir können dieses Unterdokument aufrufen). Der Hauptvorteil von mongodb ist es, weniger Sammlung zu machen, wenn es möglich ist.

Wenn Sie eine Erklärung, wie Subdokument Arbeit in Mungo wollen, hier ist der Link http://mongoosejs.com/docs/subdocs.html

Ihr Problem zu lösen, ich denke, (wenn man nicht so viele Gruppen und Rollen hat, die nehme ich an), dann sollten Sie tun dass:

UserModel

const roleSchema = new Schema({ 
     name: {type: String, unique: true}, 
     code: {type: String, unique: true}, 
     description: String 
}, { 
     timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'} 
}); 

const groupSchema = new Schema({ 
    name: {type: String, unique: true} 
}, { 
    timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'} 
}); 

const userSchema = new Schema({ 
    username: {type: String, unique: true}, 
    first_name: String, 
    middle_name: String, 
    first_surname: String, 
    second_surname: String, 
    email: String, 
    password: String, 
    roles: [roleSchema], 
    groups: [groupSchema] 
}, { 
    timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'} 
}); 
const UserModel = mongoose.model('user', userSchema); 

und jetzt haben Sie eine Sammlung ‚User‘, wo Sie Ihre Benutzer verwalten können, ihre Gruppen und ihre Rollen.

Nutzungs

var user = new UserModel({ name: "Odonno", groups: [{ name: 'Admin' }, { name: 'User' }] }) 
user.save(callback); 

Sobald Sie Ihr Modell haben, können Sie Gruppen und Rollen leicht einstellen und dann in der Datenbank speichern.

+0

Zuerst danke für Ihre Antwort. Aber ich habe die nächsten Fragen: Stellen Sie sich vor, dass Odonno und 1000 Benutzer mehr Gruppe 1 und Gruppe 2 gehören. In der Gruppe 1 haben alle diese Benutzer die Rolle von Admin und Benutzer, und Gruppe 2 nur Admin-Rolle. Wenn ich die Rollen in Gruppe 1 aktualisieren möchte, zum Beispiel die Benutzerrolle löschen, müssten alle Benutzer gehen und prüfen, ob sie zur Gruppe 1 gehören und ob Sie die Benutzerrolle haben. Nach diesem Beitrag http://stackoverflow.com/questions/5373198/mongodb-relationships-embed-or-reference), ich denke, ich sollte Referenzen eher als einbetten, da alle meine Beziehungen von anderen abhängig sind. – arisolarpower

+0

Offensichtlich hängt es von Ihren Bedürfnissen ab. Wenn Sie eine Abhängigkeit zwischen Gruppe und Rolle haben, ist es viel interessanter, eine Sammlung für die Gruppe zu erstellen und die Objekt-ID von Gruppendokumenten zu verwenden, wie Sie sagten, Referenzen. Sie haben ein gutes Beispiel hier: http://mongoosejs.com/docs/2.7.x/docs/populate.html – Odonno

+0

danke für Ihre Zeit, Sie haben mir sehr geholfen – arisolarpower