2012-02-21 48 views
4

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

我有两种类型的参考数据:

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

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

我应该如何将这些文档建模为(或作为)文档的一部分?


PS:链接文献数据库建模指南将不胜感激,以及

+0

我猜''类别'和'子类别',它取决于你是否需要直接调用'子类别'。面向文档的数据库的基本思想是将子类别存储为字典(如树)。但是,你只能直接读第一级,其余的必须用map-reduce来完成。对于多语言系统:再次,这可能是字典的情况,这次用语言代码('de_DE'或'de ')作为关键。但不知道这是否是最好的解决方案,也许你比我更喜欢doc-db。 – Aufziehvogel 2012-06-19 19:50:43

+0

我刚发现,这里Zuelke展示了如何通过map-reduce(p 41后面)获取参考数据。也许这也很有趣:http://www.slideshare.net/Wombert/an-introduction-to-couchdb-ipc11se-20110601 – Aufziehvogel 2012-06-19 20:14:46

回答

2

处理的关系是一个数据库文件到SQL数据库非常不同。 RavenDB文档讨论了这个here。对于很少发生变化的事情,您应该使用denormalized refences

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

为了回答您的具体问题:

  1. 可以存储每个国家/国家的/ etc键,然后用此键,通过加载整个引用的数据文件,并执行检索区域特定的版本内存查找。
  2. 非规范化的引用将是一个很好的类别。如果必须显示名称和/或父类别,可以包含该名称和/或父类别。这听起来像实体本身很小,所以你可以存储整个事物(并且不需要将其非规范化)。可以复制它 - 这样处理会更便宜,并且不会更改,或者至少不会经常更改(如果是,则可以使用修补来更新它)。这同样适用于您的其他实体。就我所见,业务规则与数据库无关,除非您必须能够运行适当的查询来执行它们。

更新:这是一篇文章,介绍如何处理tree structure in Raven