【问题标题】:Cross-links/updates between documents in NoSQL databaseNoSQL 数据库中文档之间的交叉链接/更新
【发布时间】:2015-07-01 06:40:41
【问题描述】:

出于多种原因,我目前正在考虑迁移到 NoSQL DB 来存储/管理一组“记分卡”。由于记分卡是一个简单的表格,其中包含区域的行和度量/指标的列。一个月的简单记分卡文档可能如下所示:

{
  "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 个月记分卡的更新时,我还需要更新第 2 个月记分卡中的 previousValue(和 arrow)属性。鉴于结构可能已经改变,我怎样才能最有效地进行此更新?如何“链接”单元格?

在 RDBMS 中,我会规范化另一个表中的值并链接 valueIds。但是,由于任何记分卡都可以有很多值,我认为将 valueIds 存储在记分卡文档中并在第二步中检索所有值真的效率低下?!

我还没有决定使用 NoSQL DB 提供程序。目前最喜欢的是 CouchDb,但也可以是 MongoDB 或 DocumentDB。后端在 ASP.NET WebAPI 中实现。

【问题讨论】:

  • 我看不出拥有previousValue 的意义。可以由数据库通过选择上个月并计算inapplication来完成。在链接的“单元格”上,这可能会有所帮助:docs.ehealthafrica.org/couchdb-best-practices/#linked-documents 一般的想法可能是在查询之前使用“已知”的_id,例如_id: 'stats-montly-2015-03'
  • @JuliusBeckmann:链接的单元格可能有效,谢谢!但我想没有办法在数据库中进行“加入”以便将值插入到文档中,对吧?即需要在客户端应用程序中执行此操作...

标签: mongodb couchdb azure-cosmosdb


【解决方案1】:

大多数 NoSQL 数据库不支持多条记录之间的JOINs - 因此您可以使用几种不同的方式来建模关系。

标准化

正如您所提到的,您可以留下指向另一个文档的软链接...然后通过后续查询解决参考。

通常,您会规范化要针对写入优化的数据。

注意:在 DocumentDB 中,您可以通过使用stored procedure 来降低后续查询上下文中与多个网络请求相关的成本。这允许您将一系列操作作为单个网络请求执行。

去规范化

或者,您可以将相关数据嵌入为 JSON 对象。这消除了使用后续查询解析引用的需要;但是在改变数据时可能会引入复杂性(例如,将写入分散到多个记录中)。

通常,您需要对要针对读取进行优化的数据进行规范化。

为什么不两者兼而有之?混合方法

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

参考文献

如需更深入的信息,我建议您查看:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多