NoSQL中的多对多关系

NoSQL中的多对多关系,nosql,ravendb,Nosql,Ravendb,我正试图找出如何在我的系统中最好地实现这一点…现在我的头脑已经离开了RDBMS的空间 我当前数据库的一部分有三个表:Show、ShowEntry和Entry。基本上,ShowEntry是Show和Entry之间的多对多连接表。在我的RDBMS中,这是非常合乎逻辑的,因为显示细节的任何更改都可以在一个地方完成,条目也是如此 在基于文档的存储中反映这一点的最佳方式是什么?我确信没有一种方法可以做到这一点,但我不得不思考基于文档的存储是否适合这种情况 仅供参考,我目前正在考虑实施RavenDB。虽然讨

我正试图找出如何在我的系统中最好地实现这一点…现在我的头脑已经离开了RDBMS的空间

我当前数据库的一部分有三个表:Show、ShowEntry和Entry。基本上,ShowEntry是Show和Entry之间的多对多连接表。在我的RDBMS中,这是非常合乎逻辑的,因为显示细节的任何更改都可以在一个地方完成,条目也是如此

在基于文档的存储中反映这一点的最佳方式是什么?我确信没有一种方法可以做到这一点,但我不得不思考基于文档的存储是否适合这种情况

仅供参考,我目前正在考虑实施RavenDB。虽然讨论一般的NoSQL设计会很好,但更关注RavenDB的设计会非常棒

谢谢,
D.

对解决我的问题大有帮助

在文档数据库中建模多对多关系时,通常只在其中一个文档中存储外键集合。您选择的文档在很大程度上取决于您打算遍历关系的方向。以一种方式遍历它很简单,以另一种方式遍历它需要一个索引

以购物篮为例。更重要的是要确切地知道哪些物品在特定的篮子里,而不是哪些篮子里有特定的物品。因为我们通常遵循篮子与物品之间的关系,所以在篮子中存储物品ID比在物品中存储篮子ID更有意义

您仍然可以使用索引以相反的方向遍历关系(例如,查找包含特定项的篮子),但索引将在后台更新,因此并不总是100%准确。(您可以使用
WaitForNonStaleResults
等待索引变得准确,但延迟将显示在您的UI中。)


如果您要求在两个方向上立即100%准确,您可以在两个文档中存储外键,但您的应用程序必须在创建或销毁关系时更新两个文档。

问题的答案

NoSQL中的多对多关系是通过一个实体上的引用数组实现的。 您有两个选择:

  • Show
    有一个
    Entry
    项数组
  • Entry
    有一个
    Show
    s数组
  • 数组的位置由最常见的查询方向确定。要在另一个方向解析记录,请为数组编制索引(在RavenDB中,它就像一个符咒)

    通常,在两个实体上有两个相互指向的数组会带来更多的悲伤而不是快乐。你最终会失去唯一的真相来源。。。它有可能破坏数据完整性


    看看这篇文章-。它从多个角度涵盖实体关系,考虑到性能、运营成本、开发和维护的时间/成本。。。并为RavenDB提供了示例。

    谢谢-非常好的解释。我使用了在每一侧存储外键的组合,以及仅为某些关系存储一侧外键的组合。我的UI在各个方向上访问关系的频率几乎是关键。