图例:
如何模拟钻石(如果术语是正确的)关系?最好用简化的例子来解释:
有organization
,item
和tag
个实体。
我的目标是建模:
tag
本身都是唯一的,属于一个组织。item
本身都是唯一的,属于一个组织。tag
/ item
对必须属于同一个组织。 (即组织A中的项目不能与组织B中的标签配对)我描绘了两种替代解决方案,但他们都没有满足我。
图1突破第3个目标:items
和tags
本身是唯一的,使用id
作为主键,但没有什么可以阻止插入对item_tag
属于不同的组织。
图2没有中断,但弯曲第一和第二目标:organization_id
被添加为item
和tag
表的主键和外键item_tag.organization_id
列引用了两者。这可以防止来自不同组织的对。 tag.id
和item.id
列现在是不必要的复合主键的一部分,因为实际上单id
列代表item
和tag
的唯一性。
如何正确建模这些要求?
答案 0 :(得分:3)
为了强制执行参照完整性,您必须......
organization_id
UNIQUE
和(organization_id, id)
tag
创建逻辑冗余item
(或PK)约束
item_tag
中的多列FK约束与UNIQUE
约束的列匹配。如果您不包含organization_id
(逻辑冗余),则无法阻止您链接来自不同组织的项目和标签(错误地)。
这将是您的图表2 。但是你真的需要标签的数据类型uuid
吗? <{1}}或甚至bigint
应该足够,同时更小更快。
与PostgreSQL的代码示例密切相关的案例: