MongoDB模式设计订购服务

MongoDB模式设计订购服务,mongodb,schema-design,Mongodb,Schema Design,我有以下对象公司、用户和订单(包含订单行)。用户通过一个或多个订单行下订单,这些订单行与公司相关。这家公司的订货期限只有一周 我不确定的是订单数组应该放在哪里,它应该是一个自己的集合,包含指向用户和公司的链接,还是应该放在公司下,或者最终应该放在用户下 数字方面,我需要计划订单中的50k+数量 查询方面,我可能主要是按公司查看订单,但我需要根据特定用户的公司查找订单。1)对于来自SQL世界的人(如我自己)来说,关于MongoDB最难了解的一点是新的模式设计风格。在SQL世界中,一切都进入第三范式

我有以下对象公司、用户和订单(包含订单行)。用户通过一个或多个订单行下订单,这些订单行与公司相关。这家公司的订货期限只有一周

我不确定的是订单数组应该放在哪里,它应该是一个自己的集合,包含指向用户和公司的链接,还是应该放在公司下,或者最终应该放在用户下

数字方面,我需要计划订单中的50k+数量

查询方面,我可能主要是按公司查看订单,但我需要根据特定用户的公司查找订单。

1)对于来自SQL世界的人(如我自己)来说,关于MongoDB最难了解的一点是新的模式设计风格。在SQL世界中,一切都进入第三范式。人们开始认为设计他们的模式只有一种正确的方法,因为通常只有一种

在MongoDB世界中,没有最好的模式设计。更准确地说,在MongoDB中,模式设计取决于应用程序如何访问数据

2) 以下是为MongoDB设计良好模式所需回答的关键问题:

  • 你有多少数据
  • 您最常见的操作是什么?您主要是插入新数据、更新现有数据还是执行查询
  • 您最常见的问题是什么
  • 您希望每秒执行多少I/O操作
您在这里讨论的是建模多对一关系:

  • 公司->用户
  • 用户->订单
  • 订单->订单行
  • 公司->订单
使用SQL,您将创建一对具有主键/外键关系的主/明细表。在MongoDB中,您有很多选择:可以嵌入数据,可以创建链接关系,可以复制和反规范化数据,也可以使用混合方法

正确的方法将取决于有关应用程序用例的许多细节,其中许多细节您尚未提供

3) 这是我最好的猜测——这只是一个猜测——对于你来说是一个好的模式

a) 为用户、公司和订单创建单独的集合

如果您查看的是超过50k的订单,那么在单个文档中嵌入的订单太多了。将它们作为单独的集合将允许您从公司和用户文档中引用它们

b) 在公司文档和用户文档中都有对订单文档的一系列引用。这使得查询“查找此公司的所有订单”成为单个文档查询

c) 如果您的查询模式支持它,那么还可能有一个从订单返回到所属公司和/或用户的重复链接

d) 假设订单行对于单个订单是唯一的,则可以将订单行嵌入订单文档中的数组中

e) 如果订单行引用的是单个产品,则可能需要单独的产品集合,并在订单行子文档中包含对产品文档的引用

4) 下面是一些关于MongoDB模式设计的很好的通用参考资料

MongoDB演示:

以下是关于MongoDB模式设计的几本书,我认为您会发现它们很有用:

  • (MongoDB正在运行)
以下是一些模式设计示例:

请注意,“MongoDB in Action”一书包含了一个电子商务应用程序的示例模式,它与您尝试构建的模式非常相似——我建议您查看一下