Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Внешний ключ на две таблицы (+) / 25 сообщений из 44, страница 1 из 2
22.10.2005, 11:10
    #33338588
Kezya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
Всем здравствуйте.
Точно знаю, что подобная тема здесь уже была, встречал, но вот найти никак не могу :(
Есть таблица, в ней необходимо сделать внешний ключ, который может ссылаться на одну из двух таблиц, как это лучше реализовать:
1. Сделать PK в каждой из двух таблиц сквозной, т.е. поле IDENTITY с непересекающимися значениями. Соответственно, берем значение внешнего ключа в связанной таблице и ищем поочередно в каждой из двух родительских таблиц.
2. Сделать в связанной таблице два поля - внешние ключи на каждую из таблиц. Одно из полей всегда NULL. Проверяем, какое из полей не NULL и обращаемся к соответствующей родительской таблице.
Расширения не будет, т.е. родительских таблиц всего две.
Подскажите, пожалуйста, как лучше сделать? Можно ссылкой на подобную тему.
Спасибо!
...
Рейтинг: 0 / 0
22.10.2005, 11:40
    #33338606
YBW
YBW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
KezyaВсем здравствуйте.
Точно знаю, что подобная тема здесь уже была, встречал, но вот найти никак не могу :(

эта тема обычно поднимается, когда речь заходит о физиках-юриках

можно искать по топикам Физические лица, Юридические лица
...
Рейтинг: 0 / 0
22.10.2005, 11:40
    #33338608
Kezya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
Спасибо !
...
Рейтинг: 0 / 0
22.10.2005, 14:01
    #33338700
VladSh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
Есть таблица, в ней необходимо сделать внешний ключ, который может ссылаться на одну из двух таблиц, как это лучше реализовать:

Применительно к физическим-юридическим лицам и т.д.
лучший вариант - хранить данные не в двух разных таблицах, а в одной.
Например CUSTOMER.
При желании к этой таблице можно создать подчиненную, где хранить дополнительные атрибуты юридических лиц.

Все другие варианты - хуже.

--
Шумов В.
http://www.acdplus.ru/
...
Рейтинг: 0 / 0
22.10.2005, 16:47
    #33338808
Kezya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
У меня не физ. и юр. лица :)
Сущности разные, схожих атрибутов у них нет. Сделал одно поле - внешний ключ и поле-признак, значение в котором и будет означать из какой сущности взят экземпляр.
...
Рейтинг: 0 / 0
22.10.2005, 19:09
    #33338885
Внешний ключ на две таблицы (+)
KezyaУ меня не физ. и юр. лица :)
Сущности разные, схожих атрибутов у них нет. Сделал одно поле - внешний ключ и поле-признак, значение в котором и будет означать из какой сущности взят экземпляр.


можно сделать одну общую "сквозную" "опорную" "единую" таблицу ключей (EntryID EntryDate etc.) для разных сущностей - по ним и определять откуда данные о сущности (таблиц таким образом может быть и не две... и не пять...)
...
Рейтинг: 0 / 0
22.10.2005, 21:32
    #33338953
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
Kezya
На мой взгляд, неправильно сделали. Если это абсолютно разные сущности, то лучше в главной таблице сделать два поля. Зачем экономить-то?
...
Рейтинг: 0 / 0
22.10.2005, 21:43
    #33338954
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
Вот еще. С таким подходом Вы не напишите нм одного нормального запроса ни на одном диалекте SQL.
По всей видимости Вы еще не совсем освоились в реляционных БД и мыслите навигационным способом доступа к данным :)
...
Рейтинг: 0 / 0
23.10.2005, 06:32
    #33339024
Kezya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
В главной таблице у этих разных сущностей есть общее поле - количество.
Cat2
По всей видимости Вы еще не совсем освоились в реляционных БД

это верно :(
...
Рейтинг: 0 / 0
23.10.2005, 12:19
    #33339059
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
VladShПрименительно к физическим-юридическим лицам и т.д.
лучший вариант - хранить данные не в двух разных таблицах, а в одной.
Меня всегда умиляли слова "лучше так" при абсолютно неизвестной постановке задачи (то есть - как именно будет использоваться это "так").

VladShНапример CUSTOMER.
Если CUSTOMER - то действительно например. Но подброшу другой например, из моей практики: хранятся данные о самой фирме и ее филиалах (сотрудники и оргструктура), контрагентах (те самые customer), банках (которые само собой юрики и которые могут быть контрагентами) ключевых сотрудниках контрагентов-юриков и банков (грубо говоря, контакты), расчетных счетах, которые физик или юрик может иметь в банке.

Признаться, с огромным интересом изучил бы хорошую реализацию, в которой все это свалено в одну таблицу. Например, хранение данных о физике, который является контрагентом, одновременно является сотрудником банка-контагента и имеет счет в своем банке :)
...
Рейтинг: 0 / 0
23.10.2005, 12:24
    #33339060
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
KezyaСделал одно поле - внешний ключ и поле-признак, значение в котором и будет означать из какой сущности взят экземпляр.
Присоединюсь к предыдущим ораторам. Это решение во-первых наиболее неудобно в использовании, а во-вторых, наиболее ненадежно, чревато проблемами в сопровождении (разрешите не расшифровывать почему, если угодно - просто точка зрения).

Нормальные решения уже были названы - это либо "сквозная" таблица, объединяющая две сущности, либо то, что в Oracle Designer-е называется "дугой" - два поля, два foreign key и check constraint вида (a is null and b is not null or a is not null and b is null).
...
Рейтинг: 0 / 0
23.10.2005, 18:44
    #33339159
Kezya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
Да, прошелся поиском по форуму, нашел кучу поднобных тем. Знал ведь, что они есть :)
Решение с битовым полем-"переключателем" действительно не очень удачное, сделал
Softwarer
...то, что в Oracle Designer-е называется "дугой" - два поля, два foreign key и check constraint вида (a is null and b is not null or a is not null and b is null).
Еще раз большое всем спасибо за советы!
...
Рейтинг: 0 / 0
23.10.2005, 19:45
    #33339175
Kezya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
Хм, возникла интересная ситуация: сначала в таблице внешний ключ ссылался всего лишь на одну таблицу и этот внешний ключ являлся составной частью первичного ключа. Я не стал делать суррогатный ключ, а сделал составной. Первичный ключ для таблицы состоял из трех внешних ключей, теперь же добавляется четвертый, но так, что два внешних ключа являются "взаимоисключающими", т.е. один из них всегда(!) NULL. Возможно ли создание такого PK, состоящего из 4-х полей таблицы, причем одно из них всегда будет NULL?
Я конечно попробую все же создать, но насколько хорошо будет такое решение (если получится)?
...
Рейтинг: 0 / 0
23.10.2005, 19:55
    #33339177
Kezya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
Поле с возможностью NULL значения не может быть частью PK. Очень удобно ссылочная целостность реализовывалась, как в таком случае ее поддерживать - триггерами?
...
Рейтинг: 0 / 0
23.10.2005, 21:59
    #33339231
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
KezyaПоле с возможностью NULL значения не может быть частью PK. Очень удобно ссылочная целостность реализовывалась, как в таком случае ее поддерживать - триггерами?
Лучше сделать PK все таки суррогатным ключом, а на поля сделать UNIQUE CONSTRAINT/INDEX (если конечно Оракл позволяет нормально делать UNIQUE на NULL-поля).
...
Рейтинг: 0 / 0
23.10.2005, 22:22
    #33339246
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
Надо в сущности , на которую нужно ссылаться, выделить общего предка, применив отношение подкатегории. И на него (общего предка) тогда и ссылаться.
...
Рейтинг: 0 / 0
24.10.2005, 00:50
    #33339314
Внешний ключ на две таблицы (+)
MasterZivНадо в сущности , на которую нужно ссылаться, выделить общего предка.

БОЯН
...
Рейтинг: 0 / 0
24.10.2005, 01:29
    #33339332
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
KezyaПервичный ключ для таблицы состоял из трех внешних ключей, теперь же добавляется четвертый,
"А зачем нам кузнец?" (c)

Почти всегда лучше обойтись без подобных первичных ключей. Для адресации нужной записи в таблице составной ключ из четырех полей, мягко говоря, неудобен. А если адресовать записи не требуется - зачем первичный ключ? Делайте просто уникальный по требуемому набору полей.
...
Рейтинг: 0 / 0
24.10.2005, 01:30
    #33339334
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
ASCRUS(если конечно Оракл позволяет нормально делать UNIQUE на NULL-поля).
Позволяет. Даже позволяет создать foreign key, ссылающийся на такой unique constraint.
...
Рейтинг: 0 / 0
24.10.2005, 05:48
    #33339370
Kezya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
У меня не Oracle, а MS SQL Server. Сделаю, наверное, суррогатный ключ. "Опорную" таблицу делать имеет смысл если таблиц более 2-х, мне же хватит и одной :)
...
Рейтинг: 0 / 0
24.10.2005, 13:49
    #33340282
hardsign
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
softwarer
Если CUSTOMER - то действительно например. Но подброшу другой например, из моей практики: хранятся данные о самой фирме и ее филиалах (сотрудники и оргструктура), контрагентах (те самые customer), банках (которые само собой юрики и которые могут быть контрагентами) ключевых сотрудниках контрагентов-юриков и банков (грубо говоря, контакты), расчетных счетах, которые физик или юрик может иметь в банке.


Правильно, давайте всё в кучу. Делить клиентов на "контрагентов" и "неконтрагентов" -- дальновидное и технически грамотное решение :)

Если серьёзно -- "контрагенты", "расчётные счета" и т.п. это всё преходяще и должно описываться отдельными сущностями. Деление на "физиков" и "юриков" вечно и неизменно, и два поля, одно из которых не null, и битовый флаг -- решения равнозначные. Единственное неудобство -- во втором случае нельзя сделать FK, но я считаю FK злом :)
...
Рейтинг: 0 / 0
24.10.2005, 14:08
    #33340336
sgdsfgsfgsfgsfgsfg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
hardsignДеление на "физиков" и "юриков" вечно и неизменно :)

а физиков на физиков с ИНН и без?
а физиков на резидентов и не резидентов


"вечных и неизменных" делений несть числа - это показывает практика

у кого-то она шире... у кого-то уже...
...
Рейтинг: 0 / 0
24.10.2005, 14:45
    #33340445
hardsign
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
sgdsfgsfgsfgsfgsfgа физиков на физиков с ИНН и без?
а физиков на резидентов и не резидентов

"вечных и неизменных" делений несть числа - это показывает практика


Да ну? Физик без ИНН может получить ИНН. Физик-резидент может эмигрировать (или наоборот -- нерезидент может получить гражданство). Юрик физиком не станет никогда.
...
Рейтинг: 0 / 0
24.10.2005, 15:18
    #33340544
Внешний ключ на две таблицы (+)
hardsign sgdsfgsfgsfgsfgsfgа физиков на физиков с ИНН и без?
а физиков на резидентов и не резидентов

"вечных и неизменных" делений несть числа - это показывает практика


Да ну? Физик без ИНН может получить ИНН. Физик-резидент может эмигрировать (или наоборот -- нерезидент может получить гражданство). Юрик физиком не станет никогда.

меньше боевого задора - я в вам про Кузьму вы мне про Ярему...

а вдруг станет? что будете делать - харакири?

по категории физики юрики субъектов хозяйственной деятельности различает законодатель ИМХО - а ну как он перестанет различать?
...
Рейтинг: 0 / 0
24.10.2005, 16:06
    #33340705
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний ключ на две таблицы (+)
rtwertwertwertwertwertwertwet
а вдруг станет? что будете делать - харакири?
Да бог с ним. Возражение гораздо проще - у меня упомянута, например, таблица банков, которая ссылается на юриков (банк физиком быть не может). Еще там упомянуты сотрудники, которые вряд ли могут быть кем-то кроме физиков. Итого, если валить физиков с юриками в одну таблицу - начинаются пляски с целостностью. Правда, уже было задекларировано "зло", на что трудно возразить :)
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Внешний ключ на две таблицы (+) / 25 сообщений из 44, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]