【问题标题】:How to model "reference data" in a Document Database model?如何在文档数据库模型中建模“参考数据”?
【发布时间】:2012-03-11 19:47:27
【问题描述】:

我正在创建我的实体的文档模型以存储在文档数据库 (RavenDB) 中。我正在建模的领域围绕Incidents。事件具有来源、优先级、类别、影响级别和许多其他分类属性。在 RDBMS 中,我有一个 Incident 表,其中包含 Priorities 表、Categories 表、Impacts 表等的外键,但我不知道如何在文档数据库中处理它(这是我的第一个 Doc BD)。

我有两种参考数据:

  1. 简单查找值:CountriesStatesSourcesLanguages。属性:它们只有一个名称,但这是一个多语言系统,因此每种语言都有名称。支持的操作:创建、删除、重命名、停用和合并。

  2. 复杂参考数据:与简单查找相同,加:其中一些具有许多字段,并具有自己的业务规则和验证规则。例如,两个 Priorities 不能具有相同的 Rank 值。有些具有更复杂的结构,例如CategoriesSubcategories 组成。

我应该如何将它们建模为(或作为其中的一部分)文档?


PS:文档数据库建模指南的链接也将不胜感激

【问题讨论】:

  • 我猜categoriessubcategories,看你是否需要直接调用subcategories。面向文档的数据库的一般思想是将子类别存储为字典(作为树)。但是你只能直接阅读第一级,其余的必须使用 map-reduce 完成。至于多语言系统:这可能是字典的情况,这次使用语言代码(de_DE 或 @987654335 @) 作为键。但不确定这是否是最好的解决方案,也许你比我更喜欢 doc-db。
  • 我刚刚发现的,这里 Zuelke 展示了如何通过 map-reduce 获取参考数据(以下第 41 页)。也许这也很有趣:slideshare.net/Wombert/…

标签: nosql ravendb document-database


【解决方案1】:

文档数据库与 SQL 数据库的处理关系非常不同。 RavenDB 文档讨论了这个here。对于很少(如果有的话)改变的事情,您应该使用denormalized refences

此外,RavenDB 的主要作者here 对建模参考数据进行了很好的讨论。您可以扩展此示例以非常轻松地包含每个语言环境的缩写/名称字典。这方面的一个例子,here

回答您的具体问题:

  1. 您可以为每个国家/地区/州/等存储一个键,然后使用该键检索特定于语言环境的版本,方法是加载整个参考数据文档并执行内存查找。
  2. 非规范化引用非常适合类别。如果必须显示,您可以包括名称和/或父类别。听起来实体本身很小,因此您不妨存储整个事物(并且不需要对其进行非规范化)。可以复制它 - 以这种方式处理更便宜,并且不会更改,或者至少不会经常更改(如果更改,您可以使用补丁来更新它)。这同样适用于您的其他实体。据我所知,业务规则与数据库无关,只是您必须能够运行适当的查询来执行它们。

更新:这是一篇描述如何处理tree structure in Raven 的帖子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-18
    • 2015-11-17
    • 1970-01-01
    • 2019-12-05
    • 2017-04-07
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多