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

Можно ли стандартными средствами органиовать хранение в одном поле значение ключа нескольких таблиц с ограничением целостности или это только все триггерами организовывать?
5 окт 10, 11:00    [9553009]     Ответить | Цитировать Сообщить модератору
 Re: Внешний ключ на нескольких таблиц  [new]
Crimean
Member

Откуда:
Сообщений: 13147
можно сделать, чтобы так выглядело. несколько полей + CHECK + VIEW
но работать ИМХО будет не самым эффективным способом
5 окт 10, 11:08    [9553059]     Ответить | Цитировать Сообщить модератору
 Re: Внешний ключ на нескольких таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
guest_guest
хранение в одном поле значение ключа нескольких таблиц
Crimean как-то понял, что Вы сказали. А я тупой
Может, пример нарисуете?
5 окт 10, 12:13    [9553746]     Ответить | Цитировать Сообщить модератору
 Re: Внешний ключ на нескольких таблиц  [new]
Crimean
Member

Откуда:
Сообщений: 13147
в таблице несколько NULL полей с форинами на свои таблицы
CHECK, который обеспечивает заполнение только одного из них
представление, которое показывает одно не нуловое поле
ну и, скорее всего, триггер, который решает, куда писать значения при вставке / изменении
технически будет почти то, что просили, но может только триггер и проще
5 окт 10, 12:17    [9553805]     Ответить | Цитировать Сообщить модератору
 Re: Внешний ключ на нескольких таблиц  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
guest_guest,

Если я правильно понял то в поле находится id ссылающееся в разных строках на разные таблицы, тогда должно быть еще одно поле в котором указано какого типа этот id, если всё так то триггер делайте и в нем описывайте все проверки в зависимости от типа связи
5 окт 10, 12:26    [9553911]     Ответить | Цитировать Сообщить модератору
 Re: Внешний ключ на нескольких таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Crimean
в таблице несколько NULL полей с форинами на свои таблицы
CHECK, который обеспечивает заполнение только одного из них
представление, которое показывает одно не нуловое поле
ну и, скорее всего, триггер, который решает, куда писать значения при вставке / изменении
технически будет почти то, что просили, но может только триггер и проще
То есть, можно сделать поле, задающее таблицу (справочник), и поле, ссылающееся на эту таблицу (справочник)?

Получится так: одна таблица-множество справочников с дополнительным полем "Тип справочника".
Ссылка на неё получится из двух ключевых полей - (Тип)+(ID этого типа)
Понятно, что в такой таблице-множестве справочников надо предусмотреть кучу полей для хранения
разнородной информации, характерной для разных справочников.

У нас много-много лет работает нечто подобное, хоть и ненормально это с точки зрения реляционной БД
(получается, что несколько сущностей находятся в одной таблице)
5 окт 10, 12:36    [9553994]     Ответить | Цитировать Сообщить модератору
 Re: Внешний ключ на нескольких таблиц  [new]
guest_guest
Guest
WarAnt
guest_guest,

Если я правильно понял то в поле находится id ссылающееся в разных строках на разные таблицы, тогда должно быть еще одно поле в котором указано какого типа этот id, если всё так то триггер делайте и в нем описывайте все проверки в зависимости от типа связи


Да совершенно верно, однно поле ссылается на разные таблицы.
Тоже сразу мысль про триггеры, но думал может что стандарное есть
5 окт 10, 14:07    [9555059]     Ответить | Цитировать Сообщить модератору
 Re: Внешний ключ на нескольких таблиц  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32174
guest_guest
Да совершенно верно, однно поле ссылается на разные таблицы.
Тоже сразу мысль про триггеры, но думал может что стандарное есть
Стандартное - это ссылка 2-мя полями - ид и тип.
В тех таблицах ПК (или АК) тоже из 2-х полей и чек-констрейн с дефаулт-констрейном на тип.
5 окт 10, 16:02    [9556342]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Внешний ключ на нескольких таблиц  [new]
Lithium
Member

Откуда: Волгодонск
Сообщений: 28
А если таких полей в таблице требуется несколько или даже много? Тогда количество полей нужно удвоить.
Есть ещё вариант, чтобы в одно текстовое поле записывать тип и значение ссылки, а потом его парсить.

Триггеры - тоже плохо, т.к. делать их придётся на каждую таблицу, на которую может быть такая ссылка. Есть вариант - удаление записей производить не стандартным delete from, а специальной процедурой, которая будет написана однажды. И требование, чтобы ключи записей были недоступными для update.

Подобная схема у меня реализована и давно уже работает. Но мне не нравится. Надеюсь, MS SQL Server когда-нибудь добавит родную поддержку такой возможности.
17 сен 13, 12:05    [14848471]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить