NoSQL规范化帮助

Tim*_*Tim 5 mongodb nosql

我刚刚开始使用NoSQL数据库,并且一直在阅读材料以尝试包围如何用NoSQL术语思考.对我来说,最好的办法是玩耍.

话虽如此,我开始考虑如何在NoSQL中实现传统的关系模型,并希望得到那些熟悉NoSQL数据库的人的帮助和意见.

说我想要以下关系:

所有者1 - M PC

PC 1 - M零件

在这种传统的关系模式中,我们拥有PC的所有者,然后每台PC可以由许多部分组成.这意味着我们通常会有以下表格:

部分

个人计算机

PCParts

所有者

我有几个问题.

  1. 经验丰富的NoSQL开发人员如何为此创建数据模型?
  2. PC只包含一系列Part键吗?或者我错过了这一点?

任何关于此的信息都会受到欢迎.

Bil*_*win 8

一种解决方案是存储所有者文档,其中一个字段包含对PC文档的客观引用列表.同样,PC文档将包括对零件文档的客观参考列表.

这是MongoDB模拟关系的方式.可以想象一个SQL外键,它驻留在子节点中并引用父节点,并反转引用方向:MongoDB在父文档中存储一个objectid列表供其子节点使用.

但这不是规范化 - 它是非规范化.这就像在RDBMS中存储以逗号分隔的id列表,这将是一个破坏First Normal Form重复组.

如果引用存储在PC文档中,您可能有理由想知道如何找出哪个PC包含给定部件.为此,您必须在Part文档中存储冗余的PC引用列表,然后担心如何保持双向引用同步,冒着PC认为它使用Part的异常风险,但是相应的部分没有提到PC(反之亦然).

您可以创建一个模仿SQL多对多交集表的MongoDB文档,其中一个文档只包含一个对PC的objectid引用和一个对Part的引用.然后创建许多这样的文档,就像在SQL中的交集表中创建许多行一样.但是因为这些是文档而不是行,所以没有架构来强制所有文档只存储每个实体的一个引用.并且没有JOIN这样的东西可以有效地进行查找.

这些是非规范化和面向文档的数据库的结果,以及为什么关系数据库仍然提供一些优势.