【问题标题】:MongoDB Schema Design (nested array vs separate collection)MongoDB Schema Design(嵌套数组 vs 单独集合)
【发布时间】:2013-03-28 11:32:23
【问题描述】:

我正在编写客户端管理 Web 应用程序。我试图找出管理我的客户付款关系的正确方法。每天一次,应用程序向另一个 API 发送请求,并为我存储在数据库中的每个客户同步付款金额。我经常需要根据客户类型(合同类型、销售日期等)运行付款报告(付款金额)。我已经有一个clients 集合。我试图在两种模式之间进行选择:

{
      "client_id": "asdf123",
      "client_last_name": "BB",
      "address": "123 Main St",
      "city": "ATLANTA",
      "payments_history": [
        {
          "contract_number": "asdf123",
          "payment_date": ISODate("2012-09-02T07:00:00.0Z"),
          "amount": 103.33,
          "payment_number": NumberInt(1)
        },
        {
          "contract_number": "asdf123",
          "payment_date": ISODate("2012-09-30T07:00:00.0Z"),
          "amount": 103.33,
          "payment_number": NumberInt(2)
        },
        {
          "contract_number": "asdf123",
          "payment_date": ISODate("2012-11-04T07:00:00.0Z"),
          "amount": 103.33,
          "payment_number": NumberInt(3)
        }
      ]
  }

相对于创建单独的集合“payments”,其中每个文档都是一个 payment。我觉得最好将这些数据分开,因为每个查询都会将每个client 文档增长为大量数据(如果我选择特定字段,这仍然会占用大量内存)。但另一方面,我将无法运行聚合报告(因为它基于来自两个不同集合的数据)。最好的方法是什么?我应该将它们分开并在服务器端 (php) 上使用两个不同的查询进行聚合吗?

【问题讨论】:

  • 老实说,我在这里看不到使用 MongoDB 或 NoSQL 的令人信服的案例,因为这看起来像是一个非常简单的关系用例。
  • 存在诸如未知字段之类的复杂性,可能会在此期间发生变化。使用 NoSQL 的正确方法是什么?
  • 听起来您已经遇到了无 SQL 的一些限制。但是如果像你说的个别记录没有固定的模式,它仍然可能是你最好的解决方案。我会在下面写下答案。

标签: mongodb database-schema mongodb-php schema-design


【解决方案1】:

因为听起来您实际上需要在客户端上下文之外查询支付数据(即,用于汇总报告),所以我不想将每个单独的支付项目添加到客户端集合对象中。

我当然会创建一个支付对象集合,然后在每个支付的客户端对象中引用一个支付密钥,并在支付对象中引用客户端密钥,这样您就有一种确定的方式将一个方向与另一个方向关联起来,或者有第三个集合将客户映射到付款。

这里的可取之处可能真的取决于您的访问模式。例如,如果在需要建立关系的情况下查找总是在一个方向上,那么您甚至可能不需要在两组对象上都使用这样的“外键”。

【讨论】:

  • 如果我在聚合期间无法访问,那么用“外键”(DBRef)链接两个集合文档的目的是什么?
猜你喜欢
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2018-03-06
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
相关资源
最近更新 更多