2013-04-05 89 views
0

我正在编写客户端管理Web应用程序。我试图找出正确的方式来管理我的客户 - 支付关系。一旦一天的应用程序发送请求到另一个API并同步我存储在我的数据库中的每个客户端的支付金额。我经常需要根据客户类型(contract_type,sale_date等)运行付款报告(付款金额)。我已经有一个clients集合。我想选择2种模式之间:MongoDB模式设计(嵌套数组与单独集合)

{ 
     "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)使用两种不同的查询进行聚合?

+0

老实说,我看不到在这里使用MongoDB或NoSQL的强大案例,因为这看起来像一个非常简单的关系用例。 – 2013-04-05 22:02:34

+0

在这段时间内,像未知领域这样的复杂性可能会发生变化。使用NoSQL的正确方法是什么? – castt 2013-04-05 22:07:18

+0

这听起来像你已经遇到了一些没有SQL的限制。但如果像你说的那样,个人记录没有固定的模式,它仍然可能是你最好的解决方案。我会在下面写出答案。 – 2013-04-05 22:29:04

回答

0

因为它听起来像你实际上需要对查询支付数据的客户端的上下文之外(即对汇总报告),我不希望每个人支付的项目添加到客户端集合对象。

我肯定会创建一个支付对象集合,然后在每个支付的客户端对象中引用一个支付密钥,并在支付对象中引用客户端密钥,因此您有一种明确的方式可以将一个支付对象与另一个方向,或者有第三个集合将客户映射到付款。

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

+0

如果在聚合期间无法访问它,将两个集合文档与“外键”(DBRef)链接的目的是什么? – castt 2013-04-05 22:55:35