SQL Server выбирает внешний ключ из другого внешнего ключа или уникального ключа
В моем сценарии у меня есть таблица tblCity
который имеет два столбца в качестве внешних ключей CompanyRef
а также BranchRef
Тоже они вместе уникальны.
И я бы добавил один уникальный ключ для использования в качестве первичного ключа [ID]
А в другой таблице называется tblCustomer
Мне нужно использовать tblCity
в качестве внешнего ключа.
Моя проблема в том, что мне действительно нужен этот столбец идентификаторов, или я должен использовать два внешних ключа в качестве первичного ключа? Во втором случае я должен использовать три столбца в качестве внешнего ключа (CompanyRef, BranchRef, CityRef
) в tblCustomer
или что?
Какой из этих методов подходит для моей проблемы?
2 ответа
Итак, чтобы прояснить ситуацию немного в вашем вопросе (надеюсь, я правильно понял):
tblCity
CityId INT -- is part of the separate PK option
CompanyRef INT, FK -> tblCompany
BranchRef INT, FK -> tblBranch
tblCustomer
CustomerId INT -- not interesting here
CityRef INT FK -> tblCity -- is part of the separate PK option
CompanyRef INT -- part of the alternative
BranchRef INT -- part of the alternative
Я не могу сказать, какой из них лучше с точки зрения производительности (это скорее вопрос DBA), но с точки зрения разработчика, я бы посоветовал иметь один столбец PK для City:
Город звучит как довольно общее понятие. Это может понадобиться в будущем, поэтому перетаскивание двух столбцов в каждой таблице, ссылающейся на него, означает, что каждый JOIN будет находиться в этих двух столбцах.
Окончательное решение может выглядеть так:
tblCity
CityId INT PRIMARY KEY IDENTITY(1, 1),
CompanyRef INT, FK -> tblCompany
BranchRef INT, FK -> tblBranch
UNIQUE (CompanyRef, BranchRef) -- acts as a constraint, but also an index
tblCustomer
CustomerId INT
CityRef INT FK -> tblCity
Примечание: в наши дни венгерские обозначения кажутся совершенно обескураженными - посмотрите на этот очень популярный вопрос и его ответы.
Кроме того, я бы посоветовал сохранить одно и то же имя столбца для одной и той же вещи. Например
CompanyRef -> CompanyId (or whatever the PK is named)
BranchRef -> BranchId
Вам нужно создать отношения
основа какого типа отношений вам нужно использовать
первичный ключ и внешний ключ = один к деньгам
первичный ключ и первичный ключ = один к одному
внешний ключ и внешний ключ = много ко многим