RavenDB数据建模

时间:2012-09-10 10:10:34

标签: nosql ravendb document-storage

我最近开始关注RavenDB,我试图看看它是否适合我们的一些项目。但是,我遇到了一些关于模拟简单数据结构的“正确”方法的问题。我会试着描述一下:

  • 有三种类型的对象:指南类别链接
  • “root”指南可包含0个或更多子指南
  • 指南可以包含0个或更多类别
  • 类别可以包含0个或更多链接

视觉上结构将是:

  • 根指南(0或更多)
    • 子指南(0或更多)
      • 类别(0或更多)
        • 链接(0或更多)
    • 类别(0或更多)
      • 链接(0或更多)

在实际数据中,每个根指南下有大约20个根指南和大约3-5个子指南。根据每个指南(根指南和子指南),有15-25个类别。在每个类别下,有5到20个链接。

我最初的想法是像这样建模(简化模型):

Guide
---------------
Id
ParentGuideId
Title

Category
---------------
Id
GuideId
Title

Link
---------------
Id
CategoryId
Title

这几乎是关系模型,我意识到这可能不是在RavenDB中建模数据的正确方法。那么替代方案是什么?我想问题是,我不想像这样存储Hierarchy:

Guide
---------------
Id
Title
SubGuides
Categories

SubGuide
---------------
Title
Categories

Category
---------------
Title
Links

Link
---------------
Title

因为它会导致文档中包含数千个子对象。请记住,上面的模型已经简化了。实际上每种类型的数据都要多得多,所以如果我们使用这个模型,RavenDB中的20个root-Guide文档将是巨大的。

还有其他选择吗?也许这是我多年来糟糕的关系 - 数据库培养谈话,但也许这种情况根本不适合RavenDB以及它适合SQL吗?

编辑(添加基本查询)

访问数据非常简单。我有以下要求:

  1. 选择包含所有子指南的根指南列表。
  2. 对于特定指南(根或子),获取所有子指南(如果是根),类别和链接。
  3. 这基本上就是我所需要的一切。但是,评估RavenDB或类似的原因之一是添加一些搜索功能。正如我已经提到的,链接,类别和指南有更多信息,例如描述,标签等。所以能够搜索所有这些信息会很好。

1 个答案:

答案 0 :(得分:2)

我会处理事情,以便指南是一份文件。 类别和链接嵌入在该文档中。

指南可以有一组子指南。

第一个查询是查询所有指南及其潜艇。你这样做:

session.Query<Guide>().Include(x=>x.SubGuides).Where(x=>x.Parent == null).ToList();

这将在一个服务器查询中为您提供所有内容。

session.Include<Guide>(x=>x.SubGuides).Load("guides/123")

这将为您提供所有子指南的指南。