图例:
pk(蓝色):主键
fk(绿色):外键
pfk(蓝色):主键和外键同时使用
如何建立菱形(如果术语正确)关系模型?最好用一个简单的例子来解释:
有 organization
, item
以及 tag
实体。
我的目标是:
每 tag
它本身是唯一的,属于一个组织。
每 item
它本身是唯一的,属于一个组织。
项有许多标记(使用m2m表连接)和相关的 tag
/ item
对必须属于同一组织(i、 e.组织a的项目不能与组织b的标记配对)
我画了两个备选方案,但没有一个使我满意。
图1第三个目标: items
以及 tags
是独一无二的 id
作为主键,但没有什么可以阻止插入对 item_tag
属于不同的组织。
图2没有断裂,但弯曲了第一和第二目标: organization_id
作为主键和外键添加到 item
以及 tag
表和 item_tag.organization_id
列引用两者。这可以防止来自不同组织的配对。 tag.id
以及 item.id
列现在是不必要的复合主键的一部分,因为实际上是单个主键 id
列表示 item
以及 tag
.
如何正确地建模这些需求?
1条答案
按热度按时间4dc9hkyq1#
要强制引用完整性,您必须。。。
包括
organization_id
在所有表格中创建逻辑冗余
UNIQUE
(或pk)约束(organization_id, id)
在两个表中tag
以及item
在中有多列fk约束item_tag
匹配那些列UNIQUE
约束条件。如果你不包括
organization_id
(逻辑上是冗余的)没有什么可以阻止您链接来自不同组织的项和标记(错误地)。这就是你的图表2。但是你真的需要数据类型吗
uuid
为了标签?bigint
甚至int
应该足够了,同时要小一点,快一点。与postgresql代码示例密切相关的案例:
强制约束“两表之隔”