Составной внешний ключ в SQL Server - PullRequest
1 голос
/ 15 февраля 2012

У меня есть таблица с именем Books, которая содержит 3 столбца.

TableName: Books
Columns: BookId (PK), BookName, Book_Publisher_XRef_Id (FK), IsInternal

У меня есть две таблицы, которые содержат информацию об издателе.Обе эти таблицы имеют различный набор столбцов.

TableName: InternalPublishers
Columns: PublisherId (PK), PublisherName, ....

TableName: ExternalPublishers
Columns: PublisherId (PK), PublisherName, ....

У меня есть таблица ссылок, которая содержит информацию о том, какая книга принадлежит какому издателю.В одной книге может быть несколько издателей.

TableName: Books_Publishers_XRef
Columns: Book_Publisher_XRef_Id (PK), PublisherId

Если я хочу создать ограничение внешнего ключа для PublisherId, мне нужно создать своего рода ограничение Составного внешнего ключа, которое, я не уверен, может быть создано.

Таким образом, в этом сценарии, каков наилучший способ получения FK для PublisherId в таблице Books_Publishers_XRef?

  1. Разбить таблицу Books_Publishers_XRef на 2 таблицы, т.е. одну для внутренних издателей и другую для внешнихИздатели и имеют 2 столбца в таблице «Книги» для таблиц Books_Internal_Publishers_XRef и Books_External_Publishesr_XRef?

  2. Не создавать FK для столбца Publisher_Id и оставить дизайн как есть?

  3. Создать составной FK, добавив столбец Publisher_Type_Id в таблицу Books и таблицу Books_Publishers_XRef, где, если Publisher_Type_Id = 1, он принадлежит таблице Internal_Publishers и Publisher_Type_Id = 2, принадлежит таблице External_Publishers?(Не уверен, что это возможно)

  4. Какой-то другой дизайн схемы?

Пожалуйста, сообщите.

Ответы [ 2 ]

1 голос
/ 16 февраля 2012
  • Сохранить все общие столбцы в таблице Publisher.
  • В таблицах подтипов есть только столбцы, специфичные для каждого.

enter image description here

1 голос
/ 15 февраля 2012

Не делите ваши данные между двумя таблицами: InternalPublishers, ExternalPublishers.Создайте одну таблицу и укажите поле bit, чтобы определить, являются ли они внутренними или внешними.Примерно так:

create table Publisher
(
    PublisherId int not null primary key clustered,
    PublisherName varchar(100) not null,
    IsInternal bit not null
)
go

Таким образом, вы можете легко создать ссылку на внешний ключ.В конце концов, у вас, похоже, такой же дизайн для Books, держите его в руках издателей.

...