我刚刚开始使用NoSQL数据库,并且一直在阅读材料以尝试包围如何用NoSQL术语思考.对我来说,最好的办法是玩耍.
话虽如此,我开始考虑如何在NoSQL中实现传统的关系模型,并希望得到那些熟悉NoSQL数据库的人的帮助和意见.
说我想要以下关系:
所有者1 - M PC
PC 1 - M零件
在这种传统的关系模式中,我们拥有PC的所有者,然后每台PC可以由许多部分组成.这意味着我们通常会有以下表格:
部分
个人计算机
PCParts
所有者
我有几个问题.
任何关于此的信息都会受到欢迎.
一种解决方案是存储所有者文档,其中一个字段包含对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这样的东西可以有效地进行查找.
这些是非规范化和面向文档的数据库的结果,以及为什么关系数据库仍然提供一些优势.
| 归档时间: |
|
| 查看次数: |
2517 次 |
| 最近记录: |