2015-06-27 74 views
1

由於多種原因,目前我正在考慮轉移到NoSQL DB來存儲/管理一組「記分卡」。由於記分卡是一張簡單的表格,其中包含針對指標/指標的區域和列的行。至於一個月簡單的記分卡的文件看起來是這樣的:NoSQL數據庫中文檔之間的交叉鏈接/更新

{ 
    "month": 1, 
    "headers": ["Region", "# of page views", "# of unique visitors"], 
    "data": [ 
    ["Region 1", {"value": 1000, "previousValue": 800, "arrow": "up" }, {"value": 100, "previousValue": 110, "arrow": "down"}], 
    ["Region 2", {"value": 500, "previousValue": 600, "arrow": "down" }, {"value": 10, "previousValue": 11, "arrow": "down"}] 
    ] 
} 

造成這種渲染表:

| Region | # of page views | # of unique visitors | 
|----------|-----------------|----------------------| 
| Region 1 | 1000 (↑)  | 100 (↓)    | 
| Region 2 | 500 (↓)   | 10 (↓)    | 
每個月

,新的記分卡將被上傳,即一個新的文件被創建。該記分卡可能具有不同的結構,例如,

{ 
    "month": 2, 
    "headers": ["Region", "# of page views", "# of comments"], 
    "data": [ 
    ["Region 1", {"value": 1100, "previousValue": 1000, "arrow": "up"}, {"value": 5, "previousValue": null, "arrow": null}], 
    ["Region 3", {"value": 1500, "previousValue": null, "arrow": null},{"value": 1, "previousValue": null, "arrow": null}] 
    ] 
} 

導致

| Region | # of page views | # of comments | 
|----------|-----------------|---------------| 
| Region 1 | 1100 (↑)  | 5 (-)   | 
| Region 3 | 1500 (-)  | 1 (-)   | 

當我現在接收的更新月1記分卡,我也需要更新previousValue(以及arrow)在第2個月記分卡屬性。鑑於結構可能已經改變,我怎樣才能最有效地做這個更新?我怎樣才能「連接」細胞?

在RDBMS中,我將標準化另一個表中的值並鏈接valueIds。然而,因爲任何記分卡都可能有很多值,所以我認爲將valueIds存儲在記分卡文檔中並在第二步中檢索所有值實際上是效率低下的!

我還沒決定使用NoSQL DB提供程序。目前最喜歡的是CouchDb,但也可以是MongoDB或DocumentDB。後端在ASP.NET WebAPI中實現。

+1

我不能看到這一點對於具有'previousValue'。可以通過選擇前一個月並計算應用程序來完成數據庫。在連接的「細胞」,這可能是有益的:http://docs.ehealthafrica.org/couchdb-best-practices/#linked-documents總體思路可以使用被查詢之前「已知」 _id的,像'_id:「統計數據 - 每月的-2015-03''。 – h4cc

+0

@JuliusBeckmann:鏈接的單元格可能工作,謝謝!但我想沒有辦法在數據庫中進行「連接」,以便將值插入到文檔中,對嗎?即需要在客戶端應用程序中執行此操作... –

回答

2

大多數NoSQL數據庫不支持多個記錄之間的JOIN - 因此您只剩下幾種不同的方式來建模關係。

規範化

正如你所說,你可以離開軟鏈接到另一個文檔...然後解決與後續的查詢參考。

一般來說,你會標準化你想要優化寫入的數據。

注意:在DocumentDB中,您可以通過使用stored procedure在後續查詢的上下文中降低與多個網絡請求相關的成本。這使您可以執行一系列操作作爲單個網絡請求。

德正常化

或者,你可以嵌入相關的數據作爲JSON對象。這消除了通過後續查詢解決引用的需要;但是在變更數據時可能會引入複雜性(例如,扇出寫入多個記錄)。

通常,您會標準化想要爲讀取進行優化的數據。

爲什麼不能同時使用?混合方法

您也可以採用混合方法。取消規範一個相當靜態或頻繁閱讀的字段的子集;然後對經常寫入或不頻繁讀取的字段進行歸一化。

參考

對於更深入的信息,我建議你檢查出: