MongoDB架构设计(嵌套数组与单独集合)

时间:2013-04-05 21:57:41

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

我正在编写客户端管理Web应用程序。我正试图找出管理客户支付关系的正确方法。每天一次应用程序向另一个API发送请求并同步我存储在数据库中的每个客户端的付款金额。我经常需要根据客户类型(contract_type,sale_date等)运行付款(付款金额)报表。我已经有一个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)与两个不同的查询进行聚合吗?

1 个答案:

答案 0 :(得分:0)

由于听起来您实际上需要查询客户端上下文之外的付款数据(即汇总报告),我不希望将每个单独的付款项目添加到客户端集合对象。

我当然会创建一个付款对象集合,然后在每个付款的客户端对象中引用一个付款密钥,在付款对象中引用客户端密钥,这样你就可以通过一种明确的方式在一个方向上将一个与另一个相关联,或者有第三个集合将客户映射到付款。

这里最好的选择可能取决于您的访问模式。例如,如果在需要建立关系的情况下查找始终在一个方向上,您甚至可能在这两组对象上都不需要这样的“外键”。