1

示例表:

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

假设idtenant_id在每个表上组成复合主键,这ticket_id是一个外键,Ticket这个设置会保护我免受 a TicketItemhastenant_id=1ticket_id=5 where the Ticketwith id=5has的情况tenant_id=2吗?简而言之,数据库是否允许我将 2 个表中的行(每个表都有不同的)链接tenant_id在一起,破坏我的数据,还是它可以保护我免受这种情况的影响?

另外,上面的例子看起来像是对复合主键的“好”使用吗?

4

3 回答 3

1

如果您的Ticket表有一个主键 on (TicketID, TenantID),那么任何引用该表的Ticket表也必须引用这两个列,例如

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

您不能仅引用(复合)主键的一部分,例如,您不能引用表 - 您需要TicketID在每个引用它的单个外键中复合主键的两个部分(复合索引的主要缺点之一,在我看来-它使连接很麻烦)TicketItemTicket

于 2011-04-03T19:18:43.610 回答
0

如果我理解正确 - TicketItem 中的外键应该引用 Ticket 表中的 id 和tenant_id 字段。外键应引用主键 - 如果您仅引用 id,则不会引用票证表的主键,因为票证表包含包含 id 和tenant_id 字段的复合键。

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

TicketItem:外键应该引用ticket_id -> Ticket.id 和tenant_id -> Ticket.tenant_id

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

于 2011-04-03T18:58:57.723 回答
0

“其中 id=5 的票证有 tenant_id=2”

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

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

于 2011-04-03T19:23:06.310 回答