2013-04-05 78 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