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

Вам нужно создать отношения

основа какого типа отношений вам нужно использовать

первичный ключ и внешний ключ = один к деньгам

первичный ключ и первичный ключ = один к одному

внешний ключ и внешний ключ = много ко многим

Другие вопросы по тегам