我刚刚开始使用NoSQL数据库,并且一直在阅读材料,试图在NoSQL术语中思考如何思考。对我来说,最好的办法是玩耍。
话虽如此,我开始考虑如何在NoSQL中实现传统的关系模型,并希望得到那些了解NoSQL数据库的人的一些帮助和意见。
说我想要以下关系:
所有者1 - M PC
PC 1 - M部件
在这种传统的关系模式中,我们拥有PC的所有者,然后每台PC可以由许多部分组成。这意味着我们通常会有以下表格:
零件
PC
PCParts
所有者
我对此有几个问题。
欢迎任何有关此事的信息。
答案 0 :(得分:7)
一种解决方案是存储一个所有者文档,其中一个字段包含一系列对PC文档的客观引用。同样,PC文档将包括对零件文档的客观参考列表。
这是MongoDB模拟关系的方式。想想一个SQL外键,它位于子节点并引用父节点,反转引用方向:MongoDB在父文档中存储一个objectid列表给它的子节点。
但这不是规范化 - 它是非规范化。这就像在RDBMS中存储以逗号分隔的id列表,这将是repeating group that breaks First Normal Form。
如果引用存储在PC文档中,您可能有理由想知道如何找出哪个PC包含给定部件。为此,您必须在Part文档中存储冗余的PC引用列表,然后担心如何保持双向引用同步,冒着PC认为它使用Part的异常风险,但是相应的部分没有提到PC(反之亦然)。
您可以创建一个模仿SQL多对多交集表的MongoDB文档,其中一个文档只包含一个对PC的objectid引用和一个对Part的引用。然后创建许多这样的文档,就像在SQL中的交集表中创建许多行一样。但是因为这些是文档而不是行,所以没有架构来强制所有文档只存储每个实体的一个引用。并且没有JOIN这样的东西可以有效地进行查找。
这些是非规范化和面向文档的数据库的结果,以及为什么关系数据库仍然具有一些优势。