用户个人资料的Mongoose Schema,具有一对多属性

时间:2017-03-31 15:28:49

标签: mongodb mongoose mongoose-schema

我曾经使用MySQL,现在是Mongodb的新手。在学习阶段,我正在尝试创建像LinkedIn这样的用户个人资料。我很困惑,选择在mongodb模式中创建一对多关系的正确方法。

上下文:用户可以拥有多种教育资格,并且具有相同的经验。以下是两种方法,我尝试将模式创建为:

示例1

var userSchema = new mongoose.Schema({
  name: {
    first: String,
    middle: String,
    last: String,
  },
  gender: { type: Number, max: 3, min: 0, default: GENDERS.Unspecified },
  age: Number,
  education: [{type: Schema.Types.ObjectId, ref:'Education'}],
  experience: [{type: Schema.Types.ObjectId, ref:'Experience'}],
  email: String
});

示例2

var userSchema = new mongoose.Schema({
  name: {
    first: String,
    middle: String,
    last: String,
  },
  gender: { type: Number, max: 3, min: 0, default: GENDERS.Unspecified },
  age: Number,
  education: [{type: String, detail: {
    major: String,
    degree: String,
    grade: String,
    startdate: Date,
    enddate: Date,
    remarks: String
  }}],
  experience: [{type: String, detail: {
    position: String,
    company: String,
    dateofjoin: String,
    dateofretire: String,
    location: String,
    responsibilities: [{type:String}],
    description: String,
  }}],
  email: String
});

我没有测试过第二个选项。

在编写查询以获取或添加数据时,哪一个更好更容易?是否有更好的方法为这样的场景编写模式?

1 个答案:

答案 0 :(得分:1)

对于这个特定的例子,我建议将文档嵌入存储作为参考,这就是原因。

通常我在mongodb架构设计中的第一步是考虑如何查询数据?

我是否想知道用户的教育背景,或者我想知道具有特定教育背景的所有用户?获得这些类型问题的答案将决定您希望如何设置数据库。

如果您已经了解您的用户,则可以快速轻松地访问该文档中的嵌入式教育背景。不需要单独的查询,并且模式仍然过于复杂且难以理解。这就是我希望你想要访问数据的方式。

现在,如果要查找具有特定教育背景的所有用户,嵌入式文档架构显然存在很大缺陷。在这种情况下,您需要首先查看每个用户,然后遍历教育数组以查看所有各种教育。

所以答案将取决于您将对数据进行的预期查询,但在这种情况下(除非您正在对所有用户进行报告),​​那么嵌入式可能是最佳选择。

您可能还会发现此讨论很有用:

this answer