Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 FK одним полем на одну из двух таблиц  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
Добрый день коллеги,

В таблице есть поле которое является идентификатором, ссылающаяся на одну из двух таблиц, т.е FK не явный - в одной записи он может указывать на запись таблицы T1, в другой записи на запись таблицы T2. Можно ли не создавая 2 поля и имя потом в таблице подобную чехарду

FK_Field1 | FK_Field2
NULL 1
10 NULL

создать одно поле как ссылку сразу на 2? Что-то я даже не знаю как это в поисковике написать чтобы почитать полезное и вообще можно ли.
29 ноя 12, 15:12    [13550105]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
OracleLover
Что-то я даже не знаю как это в поисковике написать чтобы почитать полезное и вообще можно ли.

Просто взять и написать скрипт на создание двух FK ?
Или в студии в гуи это сделать
29 ноя 12, 15:16    [13550137]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
Гость333
Member

Откуда:
Сообщений: 3683
OracleLover,

А как вы отличаете, что в одной записи идентификатор указывает на T1, а в другой — на T2?
29 ноя 12, 15:24    [13550212]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3027
создать-то можно, но по-моему, будут ошибки, если таблицы Т1 и Т2 различны по содержанию
т.е если ID= 1 есть в Т1, но нет в Т2, то получите ошибку и т.д
29 ноя 12, 15:27    [13550250]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
Glory
OracleLover
Что-то я даже не знаю как это в поисковике написать чтобы почитать полезное и вообще можно ли.

Просто взять и написать скрипт на создание двух FK ?
Или в студии в гуи это сделать


Не, ошибко.

Пример для наглядности приведу.

Table1
T1_Id T1_Name
1 Zenit
2 Spartak

Table2
T2_Id T2_Name
10 AK BARS
20 Dinamo

Table3
T2_Id Type FK_ID
1 Football 1
2 Hockey 1

Вот скрипт
CREATE TABLE [dbo].[Table3](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Type] [varchar](255) NOT NULL,
	[FK_ID] [int] NOT NULL,
 CONSTRAINT [PK_Table3] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Table3]  WITH CHECK ADD  CONSTRAINT [FK_Table3_Table1] FOREIGN KEY([FK_ID])
REFERENCES [dbo].[Table1] ([T1_Id])
GO

ALTER TABLE [dbo].[Table3] CHECK CONSTRAINT [FK_Table3_Table1]
GO

ALTER TABLE [dbo].[Table3]  WITH CHECK ADD  CONSTRAINT [FK_Table3_Table2] FOREIGN KEY([FK_ID])
REFERENCES [dbo].[Table2] ([T2_Id])
GO

ALTER TABLE [dbo].[Table3] CHECK CONSTRAINT [FK_Table3_Table2]
GO


Если пытаешься вставить запись со ссылкой 10, то пишет что не срабатывает ибо нет такого id в таблице T1.
29 ноя 12, 15:33    [13550312]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
Crimean
Member

Откуда:
Сообщений: 13147
делать 2 нуловых поля и 2 форина с них + чек, который обеспечит заполнение хотя бы одного поля. дальше - согласно вашей модели данных. при необходимости - обернуть таблицу представлением, где будет 1 поле, я так понимаю, у вас вопроса "а когда там чего" - не возникает
29 ноя 12, 15:34    [13550318]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
Гость333
OracleLover,

А как вы отличаете, что в одной записи идентификатор указывает на T1, а в другой — на T2?


у меня есть битовое поле где искать

гыы, круто я придумал? В итоге я конечно в количестве поле не выиграл, но зато у меня хотя бы не будет решетка из NULL
29 ноя 12, 15:35    [13550326]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
поправел


Table3
T2_Id Type FK_ID
1 Football 1
2 Hockey 10
29 ноя 12, 15:36    [13550338]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
OracleLover
Если пытаешься вставить запись со ссылкой 10, то пишет что не срабатывает ибо нет такого id в таблице T1.

И что неправильного делает констрейнт ?
Вы же хотели, чтобы он проверял обе таблицы
29 ноя 12, 15:36    [13550343]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
Glory
OracleLover
Если пытаешься вставить запись со ссылкой 10, то пишет что не срабатывает ибо нет такого id в таблице T1.

И что неправильного делает констрейнт ?
Вы же хотели, чтобы он проверял обе таблицы


Если убрать ALTER TABLE ... CHECK CONSTRAINT ошибка все равно есть. Можно конечно забить на FK, и сделать просто обычно поле, которое на самом деле ссылка и не следить за целостностью - но я поэтому и спросил можно ли чтобы сервер следил за целостностью по схеме - нет здесь, позырить в другой таблице если и там нет - тогда уж вот те ошибка.
29 ноя 12, 15:40    [13550374]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
HandKot
создать-то можно


как?
29 ноя 12, 15:41    [13550383]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
OracleLover
Если убрать ALTER TABLE ... CHECK CONSTRAINT ошибка все равно есть.

CHECK как раз разрешает проверку
29 ноя 12, 15:43    [13550404]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
пользоват.11
Member

Откуда:
Сообщений: 19
даже в любимом Вами Оракле такое невозможно, т.к. это в принципе противоречит ссылочной целостности, поддержку которой мы ожидаем от субд.
если во внешний ключ попадает значение из одной справочной таблицы, то это автоматически нарушает ссылочную целостность для другой справочной таблицы
29 ноя 12, 15:45    [13550411]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
Glory
OracleLover
Если убрать ALTER TABLE ... CHECK CONSTRAINT ошибка все равно есть.

CHECK как раз разрешает проверку


А все. Я запутался.

Я разные комбинации попробовал и with check и без, все равно сервер думает что я хочу FK который проверяет наличие ссылки сразу в двух таблицах(&&) а мне нужно или там, или там чтобы было(||)
29 ноя 12, 15:46    [13550423]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
пользоват.11
даже в любимом Вами Оракле такое невозможно, т.к. это в принципе противоречит ссылочной целостности, поддержку которой мы ожидаем от субд.
если во внешний ключ попадает значение из одной справочной таблицы, то это автоматически нарушает ссылочную целостность для другой справочной таблицы


сейчас если Глори напишет "ааа, ну так конечно нельзя" - замутю 2 поля и покину лоно оппозиции.
29 ноя 12, 15:50    [13550449]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
OracleLover
сейчас если Глори напишет "ааа, ну так конечно нельзя" - замутю 2 поля и покину лоно оппозиции.

Что нельзя то ?
"создать одно поле как ссылку сразу на 2? " - можно. Вы сами предоставили скрипт

А заставить констрейт каким то магическим образом определять, для какой именно из таблиц должна быть проведена проверка текущей записи, разумеется нельзя
29 ноя 12, 15:55    [13550495]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
Гость333
Member

Откуда:
Сообщений: 3683
OracleLover
Гость333
OracleLover,

А как вы отличаете, что в одной записи идентификатор указывает на T1, а в другой — на T2?


у меня есть битовое поле где искать

гыы, круто я придумал? В итоге я конечно в количестве поле не выиграл, но зато у меня хотя бы не будет решетка из NULL

По-моему, не круто. Цель какая? Сэкономить место на диске? :)
Если оставлять такую схему данных, то целостность можно контролировать триггерами на всех таблицах. Форин кеями не получится.
29 ноя 12, 15:57    [13550519]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
пользоват.11
Member

Откуда:
Сообщений: 19
просто у меня недавно такой же вопрос стоял
и прикинув, чего будет стоить мне поддержка специфики такого поля, я банально создал 2 таких поля, по одному на каждый FK
Поскольку поддержки в реляционных базах такого двойного отношения я не видел нигде
29 ноя 12, 15:57    [13550521]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
пользоват.11
просто у меня недавно такой же вопрос стоял
и прикинув, чего будет стоить мне поддержка специфики такого поля, я банально создал 2 таких поля, по одному на каждый FK
Поскольку поддержки в реляционных базах такого двойного отношения я не видел нигде


да вроде нормуль с точки зрения целостности, есть у меня поле которое по бизнес-логике ссылается сразу например на 10 таблиц. Флагов создания констрейнта в msdn целая туча, я наивно полагал что там что-нить есть для этого случая.

Вот я создал первый констрейнт, второй... десятый. Логично же что и смотреть бы серверу в той же последовательности - проверил первую табличку, там такой нет? нет. пошли дальше во вторую. и тут нет? идем дальше и т.д Если дошли до десятой и там нет - все, стандартная ошибка. С точки зрения логики никаких коллизий или неопределенностей.
29 ноя 12, 16:03    [13550583]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
OracleLover
С точки зрения логики никаких коллизий или неопределенностей.

А если в двух есть, а третьей нет ? Это по-вашему, определенность ?
29 ноя 12, 16:05    [13550604]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
Glory
OracleLover
С точки зрения логики никаких коллизий или неопределенностей.

А если в двух есть, а третьей нет ? Это по-вашему, определенность ?


Да, типичный .FirstOrDefault() MS его очень любит
29 ноя 12, 17:02    [13551187]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
OracleLover
Да, типичный .FirstOrDefault() MS его очень любит

Там есть ClientID=1 и там есть ClientID=1
Только там Иванов, а там - Петров
Интересно, кого же мне выбрать ?
29 ноя 12, 17:06    [13551255]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
Вы меня конечно извините, я что-то запутался в обсуждении. Короче это IMHO стандартное наследование. Реализуется оно через дискриминант.

Sport {Sport_Id, Sport_Type, < attr... >};
Soccer {Sport_Id, Sport_Type, < attr ... >}; constraint: {Sport_Type = 'Soccer'};
Hokey {Sport_Id, Sport_Type, < attr ... >}; constraint: {Sport_Type = 'Hokey'};

ForeinKey: Sport (Sport_Id, Sport_Type) reference Soccer (Sport_Id, Sport_Type);
ForeinKey: Hokey (Sport_Id, Sport_Type) reference Soccer (Sport_Id, Sport_Type);
Надеюсь понятно описываю, лень на SQL писать.

В таблицах вот что может быть:

Sport
Sport_Id Sport_Type
--------------------------------
1 Soccer ...
22 Hokey ...
2 Soccer ...
1 Hokey ...

Hokey
Sport_Id Sport_Type
-------------------------------
1 Hokey ...
22 Hokey ...

Soccer
Sport_Id Sport_Type
--------------------------------
1 Soccer ...
2 Soccer ...
29 ноя 12, 17:45    [13551709]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
Glory
OracleLover
Да, типичный .FirstOrDefault() MS его очень любит

Там есть ClientID=1 и там есть ClientID=1
Только там Иванов, а там - Петров
Интересно, кого же мне выбрать ?


смотря в какой очередности задавали FK
29 ноя 12, 18:31    [13551988]     Ответить | Цитировать Сообщить модератору
 Re: FK одним полем на одну из двух таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
OracleLover
смотря в какой очередности задавали FK

А если завтра я пересоздам один или несколько ?
А если это буду не я, а другой dba ?
29 ноя 12, 18:35    [13552020]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить