Вопрос о составных первичных ключах - PullRequest
1 голос
/ 03 апреля 2011

Пример таблицы:

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 - вместе, разрушая мои данные, или это защитит меня от этого?

Кроме того, выглядит ли приведенный выше примеркак «хорошее» использование составного первичного ключа?

Ответы [ 3 ]

1 голос
/ 03 апреля 2011

ЕСЛИ ваша таблица Ticket имеет первичный ключ на (TicketID, TenantID), то любая таблица, ссылающаяся на таблицу Ticket, также должна ссылаться на оба столбца, например,

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

Нельзя ссылаться только на части (составного) первичного ключа, например, вы не можете иметь TicketID в TicketItem ссылку на таблицу Ticket - вам нужны обе части составного первичного ключа в каждом внешнем ключе, ссылающемся на него (на мой взгляд, один из главных недостатков составных индексов - это соединение громоздкий)

0 голосов
/ 03 апреля 2011

", где Билет с id = 5 имеет tenant_id = 2"

Исходя из этой формулировки ("тикета"), существует ли когда-либо только один билет с id = 5?Если это так, то это ваш первичный ключ, и использование tenant_id для создания составного ключа просто усложняет задачу.

Если у вас может быть несколько id = 5, вы можете использовать составной ключ, и да, это будетдля правильной работы ссылки должны совпадать оба.

0 голосов
/ 03 апреля 2011

Если я правильно вас понимаю - внешний ключ в TicketItem должен ссылаться как на поля id, так и на tenant_id в таблице Ticket.Внешний ключ должен ссылаться на первичный ключ - если вы будете ссылаться только на идентификатор, вы не будете ссылаться на первичный ключ таблицы заявок, поскольку таблица заявок содержит составной ключ, который включает в себя поля id и tenant_id.

Если у вас есть внешний ключ в TicketItem, который ссылается на первичный ключ таблицы Ticket (и id, и tenant_id), вы не сможете вставить / обновить запись в таблице TicketItem, которая не имеет соответствующейзапись id + tenant_id в таблице заявок (это то, что вы хотите).

TicketItem: внешний ключ должен ссылаться на ticket_id -> Ticket.id AND tenant_id -> Ticket.tenant_id

Что касается «правильного» использования составного ключа - это зависит от вашего дизайна /требования, но нет ничего «плохого» в этом.

...