2015-07-25 3 views
0

Этот вопрос связывает 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» во внешнем ключе), когда я пробовал себя.

Заранее благодарен!

ответ

1

Если я правильно понимаю, вы можете делать то, что хотите. Идея заключается в создании уникального ключа на PartyTypeId, Id.

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), 
    unique (PartyTypeId, Id) 
); 

CREATE TABLE Stuff (
    StuffId int not null primary key, 
    UserId int, 
    PartyTypeId as cast(1 as tinyint) persisted, 
    Foreign Key (UserId) references user(PartyTypeId, userId) 
); 

Here - это SQL-скрипт. Это объясняется в documentation.

+0

Спасибо Вам за очень полезный ответ, и прикрепленные ссылки. Помогло и мое понимание. Пара вещей: код выше не соответствует Fiddle; на самом деле вышеописанный код генерирует «Количество ссылочных столбцов в внешнем ключе отличается от числа ссылочных столбцов, таблицы« Материал ». ошибка. – daner

+0

Во-вторых, мне было интересно узнать о плюсах и минусах утверждения уникальности только в поле ID в User, а затем FK в Stuff будет просто поле UserId (таким образом, выпадающее поле PartyTypeId) – daner

0

Да, вы можете иметь внешний ключ в Материала справки только пользователя:

CREATE TABLE Stuff (
    StuffId int not null primary key, 
    UserId int, 
    Foreign Key (UserId) references dbo.[User](ID) 
);