2013-10-12 4 views
2

Je suis aux prises avec un grand choix de conception pour les collections mongo et les schémas mongo de mes applications.Node, MongoDB, Mongoose Design Choix - Créer deux collections ou une collection

Mes applications appelle pour deux types de compte: Étudiants et Enseignants. La seule similarité entre les deux types de compte est qu'ils nécessitent tous les deux les champs: prénom, nom, adresse e-mail et mot de passe. En dehors de cela, ils sont différents (les enseignants ont « missions », « tests », les étudiants ont des « devoirs », etc.)

J'ai médité mes options largement, et examiné les choix de conception suivants:

  1. Utilisez mongoose-schema-extend et créez un schéma "abstrait" pour tous les comptes. Ensuite, étendez ce schéma pour créer les schémas Student et Student. Cela implique deux collections, et donc quelques champs redondants. Il y a aussi des problèmes avec l'exploitation forestière et la création de compte (vérifier si l'e-mail utilisé pour se connecter est un e-mail e-mail étudiant ou enseignant, etc.)

  2. Créer une collection « comptes », et ajouter un type le champ à indique si le compte est un "étudiant" ou un "enseignant". Cela implique que les entrées dans la collection "accounts" seront dissemblables. Ce nécessite également que j'ai deux schémas mangouste pour une seule collection .

  3. Créer une collection "accounts", avoir un champ "type" et un champ "accountId". En plus d'une collection «étudiant» et d'une collection «enseignant» - le champ «type» indiquera la collection dans laquelle se trouvent les champs spécifiques à l'étudiant ou à l'enseignant, et le champ «accountId» indiquera exactement quelle entrée le compte est apparié avec.

J'apprécie toute entrée, critique ou suggestion.

Répondre

2

Je suis sur une route similaire et je fini par atterrir sur un mélange de l'option 1 et 2.

mongoose-schema-extend modifie simplement le prototype de Schema avec une méthode #extend() qui lorsqu'elle est appelée effectue une copie profonde du passé schéma. Le plus utile. Cependant, vous pouvez contrôler la collecte mangouste enregistre dans MongoDB en ajoutant un collections propriété au schéma:

var schema = new Schema({ 
    foo: String, 
    bar: Boolean 
}, { collection: "FooBarBaz" }); 

Rappelez-vous: mangouste comprend le concept d'un schéma, mais MongoDB ne fonctionne pas. Cela signifie que vous pouvez stocker des données différentes et utiliser votre logique métier personnalisée pour contrôler le désordre. Cela dit, vous pouvez créer un modèle de base appelé User, forcer mongoose à utiliser la même collection en utilisant l'option collection, puis étendre ce modèle de base pour faire vos modèles Teachers et Students. Assurez-vous d'ajouter un drapeau type dans le modèle de base comme vous l'avez suggéré dans l'option 2. Cette option est non seulement pratique pour les recherches rapides, mais elle sera également essentielle lorsque vous utiliserez commando avec des données MongoDB brutes.

0

@jibsales a une excellente solution.

Une autre solution à prendre en compte est l'utilisation Population avec les références http://mongoosejs.com/docs/populate.html de la collection Users aux collections Student et Teacher. Certains avantages sont les suivants:

  • entrées dans chacune des trois collections (utilisateurs, enseignants, étudiants) sont similaires dans le stockage.

  • Vous permet d'obtenir les champs pour le "User" indépendamment de en obtenant les champs pour la collection référencée.

Il faudrait pour cela que le schéma est modifié avant une instance est créée (et un modèle est créé à partir du schéma), où refType est la collection désirée:

var userSchema = new Schema({ 
    _id  : Number, 
    name : String, 
    age  : Number, 
    stories : [{ type: Schema.Types.ObjectId, ref: refType}] 
}); 
Questions connexes