NoSQL规范化帮助

时间:2011-08-31 14:29:58

标签: mongodb nosql

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

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

说我想要以下关系:

  

所有者1 - M PC

     

PC 1 - M部件

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

  

零件

     

PC

     

PCParts

     

所有者

我对此有几个问题。

  1. 有经验的NoSQL开发人员如何为此创建数据模型?
  2. PC只包含一系列Part键吗?或者我错过了这一点?
  3. 欢迎任何有关此事的信息。

1 个答案:

答案 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这样的东西可以有效地进行查找。

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