【发布时间】:2018-11-07 20:11:24
【问题描述】:
我经常遇到这种情况。一个例子,
user 由 appId, externalUserId 唯一标识。
表xxxContract 有一个外键(fileUploadId, appId, externalUserId) 到表fileUpload,确保文件上传属于指定用户。
表xxxContract 有一个外键(businessId, appId, externalUserId) 到表business,确保业务属于指定用户。
以上两项,我们保证用户A的文件上传不会作为用户B业务的合同。
xxxContract 也有一个 fileTypeId 列,即 STORED GENERATED 到某个值,表示“此合同的文件类型为 XXX_CONTRACT”
表xxxContract 也有一个外键(fileUploadId, fileTypeId) 到表fileUpload。
这保证我们只为xxxContract 使用XXX_CONTRACT 文件上传,而不会意外使用其他文件类型。
鉴于上述情况,我们有两个外键指向同一个表fileUpload,甚至有重叠的列,
(fileUploadId, appId, externalUserId)(fileUploadId, fileTypeId)
所有的列都是NOT NULL。
所以,在我看来,将外键组合成一个更大的外键是安全的,
(fileUploadId, appId, externalUserId, fileTypeId)
而且我们仍将拥有与以前相同的保证。
我的直觉是我不应该组合外键,因为按含义将它们分开并为 FK 提供有意义的名称有助于可维护性。
但我从未接受过有关这些东西的正规教育,所以我想知道行业标准是什么。
相关,将它们组合与分离它们是否有性能优势?
【问题讨论】:
标签: mysql