Nosql RavenDB数据建模

Nosql RavenDB数据建模,nosql,ravendb,document-storage,Nosql,Ravendb,Document Storage,我最近开始研究RavenDB,我试着看看它是否适合我们的一些项目。然而,我遇到了一些关于简单数据结构建模的“正确”方法的问题。我将尝试描述它: 有三种类型的对象:指南、类别和链接 “根”指南可以包含0个或多个子指南 指南可以包含0个或多个类别 类别可以包含0个或多个链接 从视觉上看,结构应为: 根指南(0或更多) 子指南(0或更多) 类别(0或更多) 链接(0或更多) 类别(0或更多) 链接(0或更多) 在实际数据中,每个根指南下大约有20个根指南和3-5个子指南。在每个

我最近开始研究RavenDB,我试着看看它是否适合我们的一些项目。然而,我遇到了一些关于简单数据结构建模的“正确”方法的问题。我将尝试描述它:

  • 有三种类型的对象:指南类别链接
  • “根”指南可以包含0个或多个子指南
  • 指南可以包含0个或多个类别
  • 类别可以包含0个或多个链接
从视觉上看,结构应为:

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

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

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

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

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

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

Link
---------------
Title
session.Query<Guide>().Include(x=>x.SubGuides).Where(x=>x.Parent == null).ToList();
因为这将导致文档可能包含数千个子对象。请记住,上面的模型是简化的。实际上,每种类型都有更多的数据,因此如果我们使用这种模型,RavenDB中的20个根指南文档将是巨大的

还有其他选择吗?也许这是我多年来在关系数据库方面糟糕的成长经历,但也许这个场景不适合RavenDB,也不适合SQL

编辑(添加基本查询)

访问数据相当简单。我有以下要求:

  • 选择包含所有子辅助线的根辅助线列表
  • 对于特定指南(根目录或子目录),获取所有子指南(如果根目录)、类别和链接
    这基本上就是我所需要的。然而,评估RavenDB或类似产品的原因之一是添加一些搜索功能。正如我已经提到的,还有一些关于链接、类别和指南的更多信息,如描述、标签等。因此,能够搜索所有这些信息将是一件好事。

    我会处理一些事情,使指南成为一个文档。 类别和链接嵌入到该文档中

    指南可以有一系列子指南

    第一个查询是查询所有指南及其子目录。你是这样做的:

    Guide
    ---------------
    Id
    Title
    SubGuides
    Categories
    
    SubGuide
    ---------------
    Title
    Categories
    
    Category
    ---------------
    Title
    Links
    
    Link
    ---------------
    Title
    
    session.Query<Guide>().Include(x=>x.SubGuides).Where(x=>x.Parent == null).ToList();
    
    session.Query().Include(x=>x.SubGuides)。其中(x=>x.Parent==null)。ToList();
    
    这将在一个服务器查询中提供所有信息

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

    这将为您提供一个包含所有it子指南的指南。

    正确的建模方法在很大程度上取决于您计划如何访问它,以及您希望如何通过定义聚合来安排事务边界。如果我知道您的应用程序将如何访问这些数据,那么帮助您会容易得多。我添加了我们今天使用的两个基本查询:谢谢你,艾恩德。如果我选择此结构,是否可以使用搜索索引搜索链接?我猜索引只会找到指导文档,还是我错了?