示例表:
Ticket
- id
- tenant_id
- foo
TicketItem
- id
- tenant_id
- ticket_id
- bar
假设每个表上的id
和tenant_id
构成复合主键,并且ticket_id
是Ticket
的外键,此设置将保护我免受环境影响TicketItem
tenant_id=1
和ticket_id=5
Ticket
id=5
tenant_id=2
哪里有tenant_id
?简单来说,数据库是否允许我链接来自2个表的行 - 每个表都有不同的{{1}} - 一起破坏我的数据,还是保护我不受此影响?
此外,上述示例是否似乎是对复合主键的“良好”使用?
答案 0 :(得分:1)
如果您的Ticket
表在(TicketID, TenantID)
上有主键,那么引用Ticket
表的任何表都必须引用两个列,例如< / p>
TicketItem(TicketID,TenantID) ==> Ticket(TicketID,TenantID)
您不能仅引用(复合)主键的某些部分,例如您不能在TicketID
中TicketItem
引用Ticket
表 - 在引用它的每个外键中都需要复合主键的两个部分(复合索引的主要缺点之一,在我的意见 - 它使连接变得麻烦)
答案 1 :(得分:0)
如果我理解正确 - TicketItem中的外键应该引用Ticket表中的id和tenant_id字段。外键应引用主键 - 如果您只引用该ID,则不会引用票证表的主键,因为Ticket表包含一个包含id和tenant_id字段的组合键。
如果TicketItem中有一个引用Ticket表的主键(id和tenant_id)的外键,那么您将无法在TicketItem表中插入/更新没有相应id + tenant_id的记录在票证表中记录(这是你想要的)。
TicketItem: 外键应该引用ticket_id - &gt; Ticket.id和tenant_id - &gt; Ticket.tenant_id
对于复合键的“好”使用 - 它取决于您的设计/要求,但没有任何“坏”。
答案 2 :(得分:0)
“id = 5的故障单具有tenant_id = 2”
根据该措辞(“票证”),是否只有一张id = 5的票?如果是这样,那就是你的主键,并使用tenant_id制作复合键只会让事情变得更加麻烦。
如果你有多个id = 5,那么你可以使用复合键,是的,它需要正确匹配才能使引用有效。