MongoDB和Mongoose正确的架构

时间:2018-05-08 23:23:30

标签: mongodb mongoose mongoose-schema

我正在撰写一款每天都会收集用户体重信息的应用。我是NoSQL数据库世界的新手。所以我想在一开始就选择正确的架构。

展示案例看起来如此: 用户只说一次关键数据,例如身高或年龄以及用户可以测量体重

现在我这样写了:

var userSchema = new Schema({
    randomId: {type: Number, required: false, unique: true },
    name: String,
    userId:  {type: String, required: true},
    hight: Number,
    gender: String,
    waist: Number,
    age: Number,
    updated: { type: Date, default: Date.now }
});

如何每天存储体重信息?

我是否应该根据重量值和日期创建一个新的重量模型?

var weightSchema = new Schema({
    name: String,
    userId:  {type: String, required: true},
    weightValue:{
       value: Number,
       updated: { type: Date, default: Date.now }
     }
});

或者我应该每次都更新文档userSchema?

1 个答案:

答案 0 :(得分:1)

实际上,数据模型设计取决于该软件的要求(如何使用数据)。

据我所知,用户 - >权重关系是一对多映射。如果您只想存储用户信息及其权重而没有其他额外要求,那么您的架构就可以了。

因此,您将用户数据存储在用户集合中,一个用户存储一个文档。并且您有另一个集合来存储用户的体重数据,此集合中的多个文档属于一个用户。当您想要获取一个用户及其体重数据时,您必须查询2次:一次在用户集合中,另一次在体重集合中。

但IMO在设计数据模型时应考虑其他方面:

性能

  • 数据量?小块数据还是大量数据?
  • 读/写百分比?
  • 是否有热门数据用户经常访问?
  • ...

    易于使用

  • 我可以轻松更新/删除数据吗?

  • .......

我将在下面的不同场景中提出一些建议:

1。您考虑了读取性能,并且不会为一个用户存储太多的重量记录

您可以合并用户架构& 权重模式到一个模式中,用户模式包含一个数组来存储所有用户的权重记录。这被称为Mongodb以常见方式建议的非规范化模型。您的架构如下所示:

(我的PC中没有JS编程环境,所以不确认这可以编译而没有错误。只需将其作为参考。)

var weightSchema = new Schema({
    value: Number,
    updated: { type: Date, default: Date.now }
});
var userSchema = new Schema({
    randomId: {type: Number, required: false, unique: true },
    name: String,
    userId:  {type: String, required: true},
    hight: Number,
    gender: String,
    waist: Number,
    age: Number,
    weights: [weightSchema],  // Here are the weight records.
    updated: { type: Date, default: Date.now }
});
mongoose.model('user', userSchema);

现在,您只有一个用于存储用户和收藏的集合。他们的体重数据。一个用户的一个文档。您可以获得一些好处

  • 更容易让人理解的数据模型
  • 读取性能更高,因为mongodb现在只需要查询一个集合。您可以通过获取一个文档来获取一个用户的所有数据。用户添加新的重量记录时,您可以使用$push。您可以按$slice获取最早的N个或最新的N个重量记录。

但与此同时,您可能会遇到一些问题:

  • 如果用户以非常高的频率添加他们的体重记录。用户集合中的文档大小将变得非常大且快速。当原始预留空间不足时,这将导致文件在mongodb存储中的位置移动。这样做不会很好。
  • 如何计算所有用户的平均值/最高/ ...重量?由于权重数据在每个用户中是分开的,因此很难做到这一点。

2。您的用户拥有大量的重量数据并且增长速度非常快。而且你需要计算平均/顶部/ ......用户。

请遵循您的原产地设计。将数据存储在两个单独的集合中。

结论

有很多不同的建模方法,都取决于您的要求。您可以查看Mongodb建模指南:https://docs.mongodb.com/manual/core/data-modeling-introduction/