【问题标题】:MongoDB Schema Design ordering serviceMongoDB Schema Design 排序服务
【发布时间】:2012-08-09 02:27:14
【问题描述】:

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

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

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

查询明智,我可能会主要查看公司订单,但我需要根据特定用户查找公司订单。

【问题讨论】:

    标签: mongodb schema-design


    【解决方案1】:

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

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

    2) 以下是您需要回答的关键问题,以便为 MongoDB 设计一个好的架构:

    • 您有多少数据?
    • 您最常见的操作是什么?您主要是插入新数据、更新现有数据还是进行查询?
    • 您最常见的查询是什么?
    • 您预计每秒有多少 I/O 操作?

    您在这里谈论的是建模多对一关系:

    • 公司 -> 用户
    • 用户 -> 订单
    • 订单 -> 订单行
    • 公司 -> 订单

    使用 SQL,您将创建一对具有主键/外键关系的主/从表。在 MongoDB 中,您有多种选择:可以嵌入数据,可以创建链接关系,可以复制和非规范化数据,或者可以使用混合方法。

    正确的方法取决于有关您的应用程序用例的大量详细信息,其中许多您没有提供。

    3) 这是我最好的猜测 - 这只是一个猜测 - 对你来说是一个好的架构。

    a) 为用户、公司和订单提供单独的集合

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

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

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

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

    e) 如果您的订单行引用单个产品,您可能希望有一个单独的产品集合,并在订单行子文档中包含对产品文档的引用

    4) 这里有一些关于 MongoDB 模式设计的一般参考资料。

    MongoDB 演示文稿:

    这里有几本关于 MongoDB 架构设计的书籍,我认为你会发现它们很有用:

    以下是一些示例架构设计:

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

    【讨论】:

      猜你喜欢
      • 2011-02-25
      • 2022-01-09
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 2018-09-05
      • 2011-12-31
      相关资源
      最近更新 更多