2015-06-27 35 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对象。这消除了通过后续查询解决引用的需要;但是在变更数据时可能会引入复杂性(例如,扇出写入多个记录)。

通常,您会标准化想要为读取进行优化的数据。

为什么不能同时使用?混合方法

您也可以采用混合方法。取消规范一个相当静态或频繁阅读的字段的子集;然后对经常写入或不频繁读取的字段进行归一化。

参考

对于更深入的信息,我建议你检查出: