数据库设计——关于复合主键的问题



示例表:

Ticket
    - id
    - tenant_id
    - foo
TicketItem
    - id
    - tenant_id
    - ticket_id
    - bar

假设每个表上的idtenant_id构成复合主键,并且ticket_idTicket的外键,这种设置将保护我免受TicketItem具有tenant_id=1ticket_id=5Ticketid=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,那么你可以使用复合键,是的,它需要正确匹配以使引用工作

最新更新