Этот вопрос связывает Foreign Key to multiple tables , но я думал, что моя разработка может использовать свой собственный предмет.Внешняя ссылка на определенный подтип
Скажем, у меня есть следующие схемы (адаптировано из @Nathan Skerl's ответа в приведенной выше ссылке):
create table dbo.PartyType
(
PartyTypeId tinyint primary key,
PartyTypeName varchar(10)
)
insert into dbo.PartyType
values(1, 'User'), (2, 'Group');
create table dbo.Party
(
PartyId int identity(1,1) primary key,
PartyTypeid tinyint references dbo.PartyType(PartyTypeId),
unique (PartyId, PartyTypeId)
)
CREATE TABLE dbo.[Group]
(
ID int NOT NULL,
Name varchar(50) NOT NULL,
PartyTypeId as cast(2 as tinyint) persisted,
foreign key (ID, PartyTypeId) references Party(PartyId, PartyTypeID)
)
CREATE TABLE dbo.[User]
(
ID int NOT NULL,
Name varchar(50) NOT NULL,
PartyTypeId as cast(1 as tinyint) persisted,
foreign key (ID, PartyTypeId) references Party(PartyID, PartyTypeID)
)
CREATE TABLE dbo.Ticket
(
ID int NOT NULL,
[Owner] int NOT NULL references dbo.Party(PartyId),
[Subject] varchar(50) NULL
)
И сказать, что я имел другое отношение, скажем, «Материала», где «Пользователи» может владеть много предметов ' Stuff ', но для «групп» не было смысла иметь «Stuff». Могу ли я иметь внешний ключ в ссылке «Stuff» только «Пользователь»?
Если возможно, то как это сделать? Или мне нужно делать все мои внешние ключи такого рода непосредственно через «партию»? У меня есть ошибка (В ссылочной таблице «dbo.Users» нет первичных или потенциальных ключей, которые соответствуют ссылочному столбцу «ID» во внешнем ключе), когда я пробовал себя.
Заранее благодарен!
Спасибо Вам за очень полезный ответ, и прикрепленные ссылки. Помогло и мое понимание. Пара вещей: код выше не соответствует Fiddle; на самом деле вышеописанный код генерирует «Количество ссылочных столбцов в внешнем ключе отличается от числа ссылочных столбцов, таблицы« Материал ». ошибка. – daner
Во-вторых, мне было интересно узнать о плюсах и минусах утверждения уникальности только в поле ID в User, а затем FK в Stuff будет просто поле UserId (таким образом, выпадающее поле PartyTypeId) – daner