mongodb - 所有者 1 的 NoSQL 设计 :M PC and PC 1:M Parts

标签 mongodb nosql

关系:

  • 拥有 1:M 台电脑
  • PC 1:M 零件

在传统的关系模式中,我们有一台 PC 的所有者,然后每台 PC 可以由许多部分组成。

表格:

Parts
PC
PCParts
Owner

MongoDB NoSQL 数据模型是什么?

PC 是否只包含零件 key 数组?

最佳答案

一种解决方案是存储一个所有者文档,其中一个字段由 PC 文档的 objectid 引用列表组成。同样,PC 文档将包含对 Parts 文档的 objectid 引用的列表。

这就是 MongoDB 模拟关系的方式。考虑一个 SQL 外键,它驻留在子文档中并引用父文档,并且反转引用的方向:MongoDB 在父文档中存储其子文档的 objectid 列表。

但这不是规范化 - 这是非规范化。这就像在 RDBMS 中存储以逗号分隔的 id 列表,即 repeating group that breaks First Normal Form .

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

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

这些是非规范化和面向文档的数据库的后果,也是关系数据库仍然具有一些优势的原因。

关于mongodb - 所有者 1 的 NoSQL 设计 :M PC and PC 1:M Parts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7258504/

相关文章:

mongodb - Azure cosmos DB 3.6 Mongo 不支持具有嵌入字段的复合索引

mongodb - 在 Mongoose 中进行小时/日/月/年的范围查询

nosql - Neo4j(或其他一些图形数据库)可以处理关系之间的关系吗?

nosql - 跟踪 NOSQL db (firebase) 中的 id

mongodb - 错误 : network error while attempting to run command 'isMaster' on host '127.0.0.1:27017'

node.js - 如何在MongoDB中插入500万条记录?

c# - 如何同步 nosql db (ravendb) 中的更改

mysql - 为什么使用 cassandra 而不是 mysql 的 nosql?

java - Spring MongoDB 查询排序

mongodb - 我是 mongoDB Atlas 的新手,现在我想知道如何删除我的 MongoDB Atlas 项目