图例:
- PK(蓝色):主键
- FK(绿色):外键
- PFK(蓝色):同时为主键和外键
如何建模钻石型关系?以下用简化的例子进行解释。
有三个实体: organization
,item
和 tag
。
我的目标是建模:
- 每个
tag
本身都是唯一的,并且属于一个单独的组织。 - 每个
item
本身都是唯一的,并且属于一个单独的组织。 items
拥有多个标签(通过 M2M 表连接),并且相关的tag
/item
必须属于同一个组织。(即来自组织 A 的 item 不能与来自组织 B 的 tag 匹配)
我画了两个备选方案,但它们都无法满足我的需求。
图1 违反第三个目标:使用 id
作为主键,items
和 tags
本身是唯一的,但没有阻止将属于不同组织的组合插入到 item_tag
中。
图2 不违反要求,但扭曲了第一和第二个目标:在 item
和 tag
表中添加了 organization_id
作为主键和外键,并且 item_tag.organization_id
列引用了这两个表。这可以防止来自不同组织的组合。现在,tag.id
和 item.id
列成为了一个不必要的复合主键,因为实际上单个 id
列代表了 item
和 tag
的唯一性。
如何正确建模这些要求呢?