如何在数据库 ERD 中模拟多对多关系的菱形模型
How to model diamond like many-to-many relationship in database ERD
图例:
- PK(蓝色):主键
- FK(绿色):外键
- PFK(蓝色):同时主键和外键
如何模拟菱形(如果术语正确)关系?最好用一个简化的例子来解释:
有 organization
、item
和 tag
个实体。
我的目标是建模:
- 每个
tag
都是独一无二的,属于一个组织。
- 每个
item
都是独一无二的,属于一个组织。
- 项目有很多标签(使用 M2M table 加入)并且相关的
tag
/item
对必须属于同一组织。 (即组织 A 的项目不能与组织 B 的标签配对)
我绘制了两个备选解决方案,但 none 个令我满意。
Diagram 1 breaks 3rd aim: items
和 tags
本身是唯一的,使用 id
作为主键,但没有任何内容停止将对插入属于不同组织的 item_tag
。
图 2 没有中断,但弯曲了第一个和第二个目标:organization_id
作为主键和外键添加到 item
和 tag
tables 和 item_tag.organization_id
列都引用了。这可以防止来自不同组织的配对。 tag.id
和 item.id
列现在是不必要的复合主键的一部分,因为实际上单个 id
列代表 item
和 tag
的唯一性。
我怎样才能正确地模拟这些需求?
要实施参照完整性,您必须...
- 在所有表格中包含
organization_id
- 在
tag
和 item
两个表中对 (organization_id, id)
创建逻辑冗余 UNIQUE
(或 PK)约束
- 在
item_tag
中有多列 FK 约束与那些 UNIQUE
约束的列相匹配。
如果您不包含 organization_id
(逻辑上是冗余的),则没有什么可以阻止您(错误地)链接来自不同组织的项目和标签。
那将是您的 图表 2。但是你真的需要标签的数据类型 uuid
吗? bigint
甚至 int
应该足够了,同时更小更快。
与 PostgreSQL 代码示例密切相关的案例:
图例:
- PK(蓝色):主键
- FK(绿色):外键
- PFK(蓝色):同时主键和外键
如何模拟菱形(如果术语正确)关系?最好用一个简化的例子来解释:
有 organization
、item
和 tag
个实体。
我的目标是建模:
- 每个
tag
都是独一无二的,属于一个组织。 - 每个
item
都是独一无二的,属于一个组织。 - 项目有很多标签(使用 M2M table 加入)并且相关的
tag
/item
对必须属于同一组织。 (即组织 A 的项目不能与组织 B 的标签配对)
我绘制了两个备选解决方案,但 none 个令我满意。
Diagram 1 breaks 3rd aim: items
和 tags
本身是唯一的,使用 id
作为主键,但没有任何内容停止将对插入属于不同组织的 item_tag
。
图 2 没有中断,但弯曲了第一个和第二个目标:organization_id
作为主键和外键添加到 item
和 tag
tables 和 item_tag.organization_id
列都引用了。这可以防止来自不同组织的配对。 tag.id
和 item.id
列现在是不必要的复合主键的一部分,因为实际上单个 id
列代表 item
和 tag
的唯一性。
我怎样才能正确地模拟这些需求?
要实施参照完整性,您必须...
- 在所有表格中包含
organization_id
- 在
tag
和item
两个表中对 - 在
item_tag
中有多列 FK 约束与那些UNIQUE
约束的列相匹配。
(organization_id, id)
创建逻辑冗余 UNIQUE
(或 PK)约束
如果您不包含 organization_id
(逻辑上是冗余的),则没有什么可以阻止您(错误地)链接来自不同组织的项目和标签。
那将是您的 图表 2。但是你真的需要标签的数据类型 uuid
吗? bigint
甚至 int
应该足够了,同时更小更快。
与 PostgreSQL 代码示例密切相关的案例: