MongoDB Schema Design 订购服务

标签 mongodb schema-design

我有以下对象公司、用户和订单(包含订单行)。用户使用 1 个或多个订单行下订单,这些订单与公司有关。可以为该公司下订单的时间段只有一周。

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

从数字上看,我需要计划 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 in Action”一书包含一个电子商务应用程序的示例架构,它与您尝试构建的应用程序非常相似——我建议您查看一下。

关于MongoDB Schema Design 订购服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11853368/

相关文章:

javascript - Mongo JavaScript 验证

filter - 基于嵌入文档计数的MongoDB查询

mongodb - 带有 MongoDB 的重复事件模式

solr - 是否可以在不从原始源重新索引的情况下更改 Solr 中模式中指定的分析器?

node.js - Mongoose 复杂(异步)虚拟

mongodb - 如何在一个数组中嵌套多个数组

python - pymongo [SSL : CERTIFICATE_VERIFY_FAILED]: certificate has expired on Mongo Atlas

mysql - 架构设计: Order and Address

c# - XML Schema 验证 - 字段内验证

php - 隐私设置的数据库模式设计