我最近开始关注 RavenDB,并尝试看看它是否适合我们的一些项目。然而,我遇到了一些关于对简单数据结构进行建模的“正确”方法的问题。我将尝试描述它:
- 有 3 种类型的对象:指南、类别和链接
- “根”指南可以包含 0 个或多个子指南
- 指南可以包含 0 个或多个类别
- 一个类别可以包含0个或多个链接
从视觉上看,结构是:
- 根指南(0 个或多个)
- 子指南(0 个或多个)
- 类别(0 个或多个)
- 链接(0 个或多个)
- 类别(0 个或多个)
- 类别(0 个或多个)
- 链接(0 个或多个)
- 子指南(0 个或多个)
实际数据中大约有20个根Guide,每个根Guide下有大约3-5个子Guide。每个指南(根指南和子指南)下都有 15-25 个类别。每个类别下有 5 到 20 个链接。
我最初的想法是像这样建模(简化模型):
Guide
---------------
Id
ParentGuideId
Title
Category
---------------
Id
GuideId
Title
Link
---------------
Id
CategoryId
Title
这几乎是关系模型,我意识到这可能不是在 RavenDB 中建模数据的正确方法。那么还有什么选择呢?我想问题是我不想像这样存储层次结构:
Guide
---------------
Id
Title
SubGuides
Categories
SubGuide
---------------
Title
Categories
Category
---------------
Title
Links
Link
---------------
Title
因为它会生成包含潜在数千个子对象的文档。请记住,上面的模型是经过简化的。实际上,每种类型都有更多的数据,因此如果我们采用此模型,RavenDB 中的 20 个根指南文档将会非常庞大。
还有其他选择吗?也许这是我多年来对关系数据库的不良教育,但也许这个场景既不适合 SQL,也不适合 RavenDB?
编辑(添加基本查询)
访问数据相当简单。我有以下要求:
- 选择包含所有子指南的根指南列表。
- 对于特定指南(根指南或子指南),获取所有子指南(如果是根指南)、类别和链接。
这基本上就是我所需要的。然而,评估 RavenDB 或类似数据库的原因之一是添加一些搜索功能。正如我已经提到的,还有一些有关链接、类别和指南的更多信息,例如描述、标签等。因此,如果能够搜索所有这些信息,那就太好了。
最佳答案
我会处理一些事情,以便指南成为一个文档。 类别和链接嵌入在该文档中。
一个指南可以有一组子指南。
第一个查询是查询所有指南及其子指南。你这样做:
session.Query<Guide>().Include(x=>x.SubGuides).Where(x=>x.Parent == null).ToList();
这将在一次服务器查询中为您提供所有信息。
session.Include<Guide>(x=>x.SubGuides).Load("guides/123")
这将为您提供包含所有子指南的指南。
关于nosql - RavenDB 数据建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12349501/