3

我正在为我的应用程序的 mongo 集合和 mongoose 模式的大型设计选择而苦苦挣扎。

我的应用程序需要两种帐户类型:学生教师

两种帐户类型之间唯一的相似之处在于它们都需要以下字段:名字、姓氏、电子邮件和密码。除此之外,它们是不同的(老师有“作业”、“测试”,学生有“家庭作业”等)

我已经广泛考虑了我的选择,并考虑了以下设计选择:

  1. 使用mongoose-schema-extend,并为所有帐户创建一个“抽象”模式。然后,扩展此模式以创建教师和学生模式。这意味着两个集合,因此有一些冗余字段。登录和帐户创建也存在问题(检查用于登录的电子邮件是学生电子邮件还是教师电子邮件等)

  2. 创建一个集合“accounts”,并添加一个类型字段以指示该帐户是“student”还是“teacher”。这意味着“帐户”集合中的条目将是不同的。这还要求我有两个用于单个集合的 mongoose 模式。

  3. 创建一个“accounts”集合,有一个“type”字段和一个“accountId”字段。除了“学生”集合和“教师”集合之外——“类型”字段将指示学生特定或教师特定字段驻留在哪个集合中,“帐户ID”字段将准确指示帐户的哪个条目与之相匹配。

我感谢所有的意见、批评或建议。

4

2 回答 2

3

我一直在走类似的道路,最终我选择了选项 1 和 2。

mongoose-schema-extendSchema只需使用一个方法修改原型,该#extend()方法在调用时执行传递的模式的深层副本。最有帮助。collections但是,您可以通过向Schema 添加属性来控制 mongoose 在 MongoDB 中保存到哪个集合:

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

请记住:Mongoose 了解 Schema 的概念,但 MongoDB 不了解。这意味着您可以存储不同的数据并使用您的自定义业务逻辑来控制混乱。话虽如此,您可以创建一个名为 的基本模型User,通过使用该选项强制 mongoose 使用相同的集合collection,然后扩展此基本模型以制作您的TeachersStudents模型。

确保type按照选项 2 中的建议在基本模型中添加标志。这不仅便于快速查找,而且在使用原始 MongoDB 数据的突击队工作时至关重要。

于 2013-10-14T13:00:43.473 回答
0

@jibsales有一个很好的解决方案。

要考虑的另一种解决方案是使用从用户集合到学生和教师集合的引用http://mongoosejs.com/docs/populate.html的人口。一些好处是:

  • 三个集合(用户、教师、学生)中的每个集合中的条目在存储上都是相似的。

  • 允许您独立于获取引用集合的字段来获取“用户”的字段。

这将要求在创建实例之前修改架构(并从架构创建模型),其中refType是所需的集合:

var userSchema = new Schema({
  _id     : Number,
  name    : String,
  age     : Number,
  stories : [{ type: Schema.Types.ObjectId, ref: refType}]
});
于 2013-12-24T23:18:40.380 回答