示例表:
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
的情况吗?简单地说,数据库允许我链接行从2个表-每个不同的tenant_id
-在一起,破坏我的数据,或者它保护我从这个吗?
另外,上面的例子看起来像是对复合主键的"好"使用吗?
如果你的Ticket
表在(TicketID, TenantID)
上有一个主键,那么任何引用Ticket
表的表也必须引用两个列,例如
TicketItem(TicketID,TenantID) ==> Ticket(TicketID,TenantID)
你不能只引用(复合)主键的一部分,例如你不能让TicketItem
中的TicketID
引用Ticket
表——你需要复合主键的两个部分在每个引用它的外键中(复合索引的主要缺点之一,在我看来——它使连接变得麻烦)
如果我理解正确的话- TicketItem中的外键应该引用Ticket表中的id和tenant_id字段。外键应该引用主键——如果只引用id,就不会引用票据表的主键,因为票据表包含一个复合键,其中既包括id字段,也包括tenant_id字段。
如果TicketItem中的外键引用了Ticket表的主键(id和tenant_id),那么您将无法在TicketItem表中插入/更新一条在Ticket表中没有相应id + tenant_id记录的记录(这是您想要的)。
TicketItem:外键应该引用ticket_id -> Ticket。id AND tenant_id -> Ticket。tenant_id
至于组合键的"好"使用——这取决于你的设计/需求,但没有什么"坏"的。"其中id=5的Ticket的tenant_id=2"
根据这个措辞("票"),是否只有一张id = 5的票?如果是这样,那就是主键,使用tenant_id创建复合键只会让事情变得更麻烦。
如果你可以有多个id = 5,那么你可以使用复合键,是的,它需要正确匹配以使引用工作