关于复合主键的问题

时间:2011-04-03 18:44:44

标签: database-design composite-primary-key database-integrity

示例表:

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

假设每个表上的idtenant_id构成复合主键,并且ticket_idTicket的外键,此设置将保护我免受环境影响TicketItem tenant_id=1ticket_id=5 Ticket id=5 tenant_id=2哪里有tenant_id?简单来说,数据库是否允许我链接来自2个表的行 - 每个表都有不同的{{1}} - 一起破坏我的数据,还是保护我不受此影响?

此外,上述示例是否似乎是对复合主键的“良好”使用?

3 个答案:

答案 0 :(得分:1)

如果您的Ticket表在(TicketID, TenantID)上有主键,那么引用Ticket表的任何表都必须引用两个列,例如< / p>

TicketItem(TicketID,TenantID) ==> Ticket(TicketID,TenantID)

您不能仅引用(复合)主键的某些部分,例如您不能在TicketIDTicketItem引用Ticket表 - 在引用它的每个外键中都需要复合主键的两个部分(复合索引的主要缺点之一,在我的意见 - 它使连接变得麻烦)

答案 1 :(得分:0)

如果我理解正确 - TicketItem中的外键应该引用Ticket表中的id和ten​​ant_id字段。外键应引用主键 - 如果您只引用该ID,则不会引用票证表的主键,因为Ticket表包含一个包含id和ten​​ant_id字段的组合键。

如果TicketItem中有一个引用Ticket表的主键(id和ten​​ant_id)的外键,那么您将无法在TicketItem表中插入/更新没有相应id + tenant_id的记录在票证表中记录(这是你想要的)。

TicketItem: 外键应该引用ticket_id - &gt; Ticket.id和ten​​ant_id - &gt; Ticket.tenant_id

对于复合键的“好”使用 - 它取决于您的设计/要求,但没有任何“坏”。

答案 2 :(得分:0)

“id = 5的故障单具有tenant_id = 2”

根据该措辞(“票证”),是否只有一张id = 5的票?如果是这样,那就是你的主键,并使用tenant_id制作复合键只会让事情变得更加麻烦。

如果你有多个id = 5,那么你可以使用复合键,是的,它需要正确匹配才能使引用有效。