gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:41:39 24 4
gpt4 key购买 nike

关系:

  • 拥有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com