【问题标题】:MongoDB - What Scales Better, An Array Property, A Nested Object Property or Putting That Data In A Separate Model?MongoDB - 什么可以更好地扩展,数组属性、嵌套对象属性或将数据放在单独的模型中?
【发布时间】:2014-08-27 19:57:04
【问题描述】:

这是一个带有 REST API 的应用程序的数据模型,它有望扩展到相当大(如果我幸运的话)。我读过difficulties that can arise with Arrays in MongoDB,所以我很犹豫要不要使用它们。以下是应用程序的具体要求:

  • 数组将包含对象
  • 数组对象会经常修改
  • 会有很多对数组中的对象执行的查询
  • 数组不会超过最多 30 个对象
  • 我希望 REST API 发送带有数组属性的数据,因为它们更易于使用。当然,我们将其保存在数据库中的方式可能会有所不同...

鉴于这些特定要求,以下哪些模型应该使用 MongoDB 更好地扩展?

Order.products 的数组

var OrderSchema = new Schema({
    customer_name: String,
    products: {
        type: Array, 
        default: []
    }
});

嵌套对象 Order.products

// Converting the array items to nested objects before saving, and performing the reverse before sending them back to the User.  
// For example, Order.products = { one: {}, two: {}, three: {} }

var OrderSchema = new Schema({
    customer_name: String,
    products: {
         type: Schema.Types.Mixed,
         default: {}
    }
});

或者将这些项目放在单独的数据模型中......

var OrderProductSchema = new Schema({
    order_id: { type: Schema.ObjectId },
    product_title: String,
    product_price: Number
});

【问题讨论】:

  • 产品是全球性的还是仅存在于特定订单中?那么,每个订单分配给多个订单的产品数量是有限的,还是订单之间不共享的产品数量是无限的?我现在陷入了网上商店的隐喻之中。
  • 产品数量不限,订单之间不共享。
  • 相应地编辑了答案

标签: node.js mongodb mongoose


【解决方案1】:

答案是:视情况而定。

例如关于您的访问模式:您会经常查询单个产品还是只想查看完整订单?

或数据一致性:您是否关心所有订单的产品信息是否始终不是最新的?

您说您希望经常查询数组项,这将有利于单独的 Product 集合。

您还说过每个订单永远不会超过 30 个产品,它们将作为数组发送。一组子文档很容易做到这一点。

所以基本上 1 和 3 效果最好:3 在检索单个产品时工作量会更少,但在查看订单和构建要发送的产品数组时意味着更多工作量。

另一方面,使用产品数组发送完整订单会更容易,但保持产品一致并检索单个产品会更费力。

对于此类问题,我总是发现 mongodb 博客上的架构设计帖子最有帮助:part1part2part3


编辑:

如果每个产品都是独一无二的,并且不需要保持一致,我会选择 1:将它们嵌入到数组中。

推理:

所以有了这个新信息:选项 1

【讨论】:

  • Trudbert,感谢您的及时和有益的回复。我只是稍微编辑了原始帖子,以包含数组中的对象将不断修改的事实。我倾向于选项 3,但我会阅读您包含的一些架构设计帖子。
猜你喜欢
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
相关资源
最近更新 更多