Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Можно ли сделать сложный внешний ключ (FK)? / 23 сообщений из 23, страница 1 из 1
15.06.2006, 16:34
    #33793572
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
Такой вот теоретический вопрос:

Допустим в БД имеются след. таблицы:

STREETS
PROSPECTS
AVENUES

в которых содержаться соответственно названия улиц, проспектов и авеню

также есть таблица типов этих топологических объектов: OBJECT_TYPES, которая типизирует эти объекты и содержит 3-и записи:

ID TYPE DESCRIPTION
1 1 Streets
2 2 Prospects
3 3 Avenues

Ну и имеется естественно таблица адресов: ADDRESSES(ID, OBJECT_TYPE_ID, OBJECT_ID, HOUSE, CITY)

в которой:

OBJECT_TYPE_ID - Тип топол. объекта, т.е. улица, проспект или авеню;
OBJECT_ID - ID топол. объекта, т.е. улицы, проспекта или авеню;

Вопрос: Как правильно сделать внешний ключ из таблицы адресов на все объекты? В такой схеме всё хорошо за исключением того, что ссылочную целостность не сделать внешними ключами.
...
Рейтинг: 0 / 0
15.06.2006, 17:07
    #33793711
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
Может всё-таки не делать так с OBJECT_TYPE? Может просто сделать внешние ключи в ADDRESSES:
т.е. вместо OBJECT_ID и OBJECT_TYPE_ID использовать STREET_ID, PROSPECT_ID и AVENUE_ID, ссылающиеся на ID в соответствующих таблицах?

Можно ли как-нибудь указать, что OBJECT_ID ссылается на ID в STREETS если OBJECT_TYPE_ID = 1 ?
...
Рейтинг: 0 / 0
15.06.2006, 17:16
    #33793741
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
ID TYPE1 12 23 3Это сильно, это 5+
verterМожно ли сделать сложный внешний ключ (FK)?Можно.
verterКак правильно сделать внешний ключ из таблицы адресов на все объекты?Ваша основная ошибка в расщеплении улиц на подкатегории, ни одна из них не является в чем то отличной от другой, это, грубо говоря, просто точка отсчета и вряд ли в контексте предметной области их описания принципиально различаются. В данном случае, IMHO, достаточно сделать одну таблицу Streets в которой будет дополнительное поле - StreetType, не входящее в ключ. Можете даже оставить неидентифицирующую связь с таблицей StreetTypes по типу OBJECT_TYPES. В таком случае, если правильно понял Ваше описание, проблемы с ссылочной целостностью для данного случая должны пропасть.
...
Рейтинг: 0 / 0
15.06.2006, 17:25
    #33793777
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
Я это специально такой пример привёл, он не относиться к какой-либо реальной задаче. Пускай это будут не улицы и проспекты, а в общем если, то допустим есть несколько таблиц и их НЕЛЬЗЯ свести в одну, допустим одна таблица содержит данные одного типа, вторая - другого и т.д. И есть таблица которая использует эти данные. Хочется, чтобы внешним ключём обеспечивалась ссылочная целостность, но это не получится, потому что нужно ссылаться сразу на несколько таблиц в зависимости от типа. Я вот и спрашивал может как-то это можно сделать?
А вообще мне тут подумалось, что наверное придётся в триггерах проверять ссылочную целостность
...
Рейтинг: 0 / 0
15.06.2006, 17:37
    #33793821
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
verterдопустим есть несколько таблиц и их НЕЛЬЗЯ свести в одну, допустим одна таблица содержит данные одного типа, вторая - другого и т.д. И есть таблица которая использует эти данные. Хочется, чтобы внешним ключём обеспечивалась ссылочная целостность, но это не получится, потому что нужно ссылаться сразу на несколько таблиц в зависимости от типа.В таком случае всегда можно выделить надсущность, через которую и обеспечивается ссылочная целостность. Вернувшись к предыдущему посту, никто теперь не помешает добавить отдельно таблицы STREET, PROSPECT и AVENUE. Ссылочная целостность будет обеспечиваться через надсущность - таблицу Streets, хотя, возможно, надо придумать для нее более адекватное наименование. Надеюсь, аналогия понятна ?
...
Рейтинг: 0 / 0
15.06.2006, 17:42
    #33793838
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
ну а смысл в этой надсущности? Я итак могу без неё вместо OBJECT_TYPE_ID и OBJECT_ID использовать 3 поля STREET_ID, PROSPECT_ID и AVENUE_ID, которые будут внешними ключами на соответствующие таблицы.
...
Рейтинг: 0 / 0
15.06.2006, 17:55
    #33793879
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
Кстати, я посмотрел, ты в основном с SQL Server'ом работаешь, я сейчас тоже вот начал с ним разбираться, а если точнее то с 2005. Я вот и подумал, что может в новом 2005-ом есть какие-то хитрые методы для решения такой часто встречающейся проблеммы?
...
Рейтинг: 0 / 0
15.06.2006, 17:56
    #33793882
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
verterвместо OBJECT_TYPE_ID и OBJECT_ID использовать 3 поля STREET_ID, PROSPECT_ID и AVENUE_ID, которые будут внешними ключами на соответствующие таблицы.Зачем 3, когда достаточно одного ? Исходные вопросы были verterКак правильно сделать внешний ключ из таблицы адресов на все объекты? В такой схеме всё хорошо за исключением того, что ссылочную целостность не сделать внешними ключами.. На них было предложено решение. Хотите 3 поля, нет проблем, хозяин - барин :)
...
Рейтинг: 0 / 0
15.06.2006, 17:56
    #33793887
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
ChA
А почём сейчас хаты в Москве снять? Я вот в Питере сейчас снимаю, у нас уже в среднем простецкую хату за 350$ тока снять можно.
...
Рейтинг: 0 / 0
15.06.2006, 17:58
    #33793890
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
verterможет в новом 2005-ом есть какие-то хитрые методы для решения такой часто встречающейся проблеммы?Это проблема проектирования, а не инструментов.
...
Рейтинг: 0 / 0
16.06.2006, 09:13
    #33794529
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
[quot ChA][quot]

Не совсем понятно всё-таки что ты предлагаешь конкретно. Напиши структуру таблиц применительно к улицам, проспектам и авеню и где там будет обеспечиваться ссылочная целостность данных через внешние ключи.
...
Рейтинг: 0 / 0
16.06.2006, 13:15
    #33795453
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
...
Рейтинг: 0 / 0
16.06.2006, 13:23
    #33795491
Можно ли сделать сложный внешний ключ (FK)?
Из BOL MSSQL 2000. Цветом выделена необходимая информация, по конкретному вопросу. Ответ - можно.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
< table_constraint > ::= [ CONSTRAINT constraint_name ] 
    { [ { PRIMARY KEY | UNIQUE } 
        [ CLUSTERED | NONCLUSTERED ] 
        { ( column [ ASC | DESC ] [ ,...n ] ) } 
        [ WITH FILLFACTOR = fillfactor ] 
        [ ON { filegroup | DEFAULT } ] 
    ] 
    | FOREIGN KEY  определяем ключ
        [ ( column [ ,...n ] ) ]  состоящий из набора колонок
        REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] связанный с набором колонок в другой таблице
        [ ON DELETE { CASCADE | NO ACTION } ] 
        [ ON UPDATE { CASCADE | NO ACTION } ] 
        [ NOT FOR REPLICATION ] 
    | CHECK [ NOT FOR REPLICATION ] 
        ( search_conditions ) 
    }
...
Рейтинг: 0 / 0
16.06.2006, 13:49
    #33795609
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
Мимо пробегал...
[ ( column [ ,...n ] ) ] состоящий из набора колонок
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] связанный с набором колонок в другой таблице
Слишком быстро - вот и мимо:) Автору нужен ключ на набор ТАБЛИЦ.
Кстати, решалось бы, если можно было реализовывать ссылки на View.
В Оракл 9 - 10 это можно объявлять, но лишь DISABLE NOVALIDATE :(.
...
Рейтинг: 0 / 0
16.06.2006, 18:07
    #33796626
Можно ли сделать сложный внешний ключ (FK)?
Автору нужен ключ на набор ТАБЛИЦ

Упс. тоогда это старые песТни о главном... в смысле об OID или о чём то типа того.
...
Рейтинг: 0 / 0
16.06.2006, 18:29
    #33796674
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
ModelRКстати, решалось бы, если можно было реализовывать ссылки на View.Смысл ? IMHO, подобное желание возникает, как правило, когда проектировщик явно что-то недопонимает в предметной области. Собственно, полагаю, Вы это и сами прекрасно понимаете, просто непонятно, зачем придумывать механизм для оправдания неверного проектирования ?
...
Рейтинг: 0 / 0
19.06.2006, 09:53
    #33798739
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
Не скажите. Сплошь и рядом такая задача возникает не по ошибке. Начиная с аналитики в бухучете.
...
Рейтинг: 0 / 0
19.06.2006, 14:45
    #33799904
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
Основной тезис: любая связь между сущностями должна быть выразима только посредством ссылочных ограничений и ни одна из них не должна определяться программным кодом. Возможно, звучит немного максималистски, но только в таком случае сама схема БД полностью контролирует ссылочную целостность, независимо от клиентских приложений и процедурных расширений самого сервера. Как только возникает повод делать иначе, значит изначально было неверное проектирование(и не всегда из-за квалификации проектировщика). Как правило, это следствие недопонимания предметной области аналитиком/проектировщиком БД, либо представителями заказчика, которые описывает ее в меру своей компетенции, не видя деревьев из-за леса.
В случае возникновения подобной ситуации(с обеспечением ссылочной целостности на разные сущности) появляется повод добавить новую сущность, которая бы эээ... инкапсулировала эти разные сущности. Это дает возможность определить ссылочную целостность легальным способом, т.е., как уже было сказано выше, самой схемой БД. ModelRНачиная с аналитики в бухучете.И что с ней не так ?
...
Рейтинг: 0 / 0
19.06.2006, 19:24
    #33801029
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
ChA ModelRНачиная с аналитики в бухучете.И что с ней не так ?Вот топик по теме структур бухучета. Там много примеров приводили, начиная с OEBS.
Дело в том, что бухучет сам по себе прекрасный пример информационной модели. Коротко - каждый счет логически есть сущность со специфической аналитикой, Аналитикой счета может быть сегодня все, что и не предполагалось вчера:). Т.е.применение максималистского подхода означает рефакторинг таблиц при изменении плана счетов. Практически никто так не делает.
...
Рейтинг: 0 / 0
20.06.2006, 00:16
    #33801330
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
ModelRДело в том, что бухучет сам по себе прекрасный пример информационной модели. Коротко - каждый счет логически есть сущность со специфической аналитикой, Аналитикой счета может быть сегодня все, что и не предполагалось вчера Некоторое представление о бухучете(БУ) имею, как, думаю, и половина здесь бывающих. В принципе, Вы подтверждаете предположение выше, о недостатке понимания/знания предметной области. ModelRприменение максималистского подхода означает рефакторинг таблиц при изменении плана счетов. Практически никто так не делает.Со второй частью готов согласиться, с первой - нет. Если бы в процессе проектирования БД для БУ стоял специалист, хорошо понимающий предметную область, то ссылки на "разнородные" сущности всплыли бы на этапе обследования, именно в связи с аналитикой. В таком случае нашелся бы способ ее решить, например, введением общего "предка", с последующим "расщеплением" на subtypes. Утрированно говоря, если объектом ссылки может быть любой объект, значит должна существовать сущность "Любой объект" :) Которая является эээ... предком для всех остальных сущностей. Более того, есть системы, реализованные именно таким образом, в которых нет проблем с разнородными ссылками. Возможно, у них есть свои недостатки, но нарушение ссылочной целостности точно не относится к их числу.
...
Рейтинг: 0 / 0
20.06.2006, 10:19
    #33801699
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
ChA ModelRАналитикой счета может быть сегодня все, что и не предполагалось вчера Некоторое представление о бухучете(БУ) имею, как, думаю, и половина здесь бывающих. В принципе, Вы подтверждаете предположение выше, о недостатке понимания/знания предметной области.Определенно, Вы же не утверждаете, что сегодня мы можем знать все про завтра? В любом случае система не должна исходить из того, что завтра ничего не измениться. ChA
ModelRприменение максималистского подхода означает рефакторинг таблиц при изменении плана счетов. Практически никто так не делает.Со второй частью готов согласиться, с первой - нет. Если бы в процессе проектирования БД для БУ стоял специалист, хорошо понимающий предметную область, то ссылки на "разнородные" сущности всплыли бы на этапе обследования, именно в связи с аналитикой. В таком случае нашелся бы способ ее решить, например, введением общего "предка", с последующим "расщеплением" на subtypes. Утрированно говоря, если объектом ссылки может быть любой объект, значит должна существовать сущность "Любой объект" :) Которая является эээ... предком для всех остальных сущностей. Более того, есть системы, реализованные именно таким образом, в которых нет проблем с разнородными ссылками. Возможно, у них есть свои недостатки, но нарушение ссылочной целостности точно не относится к их числу.Со сторны удаления - да, единый каталог OID предотвращает безобразия. При изменени/добавлении система контроля целостности будет допускать много мусора. Точное же отражение в ссылочной целостности ограничений предметной области ведет к комбинатрному взрыву числа сущностей типа каталогов подмножеств OID. Так что практически это реализуется на уровне приложения динамически.
Вот тут разбирался с КЛАДР. Три естественных ограничения, кстати реальные данные их немножко:) нарушают:
-Актуальные объекты могут быть частью только актуальных.
-Район обязан входить в субъект федерации.
-Переименованный объект обязан иметь парный актуальный того же уровня.
Если их реализовывать как ссылочную целостность, то шесть сущностей немедленно.
...
Рейтинг: 0 / 0
21.06.2006, 02:12
    #33804154
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
ModelRВы же не утверждаете, что сегодня мы можем знать все про завтра? В любом случае система не должна исходить из того, что завтра ничего не измениться.Ну почему же. В принципе, множество предметных областей настолько формализовано, что добавить практически уже нечего. Если вдруг грядут изменения, то они, скорее всего, будут иметь такой характер, что никакой рефакторинг не справится, проще построить новую, более адекватную, модель. При необходимости выполнив перенос данных из старой схемы в новую, хотя это может оказаться более чем сложным из-за различия парадигм.
ModelRТочное же отражение в ссылочной целостности ограничений предметной области ведет к комбинатрному взрыву числа сущностей типа каталогов подмножеств OID.Только теоретически, если кто-то вдруг возмет на себя смелость описать все :), но в этом случае никакие view c поддержкой ссылочной целостности все равно не спасут. Если же не сильно отрываться от практики, то, IMHO, сложность "хорошей" модели не должна превышать способности понимания ее любым вменяемым специалистом. ModelRЕсли их реализовывать как ссылочную целостность, то шесть сущностей немедленно.И ? Есть популярные СУБД, для которых это становится непреодолимым препятствием ? Кроме того, мне показалось, что у Вас есть сомнения в адекватности модели, реализованной КЛАДР, более того, даже само наличие таковой модели :) Просто за неимением лучшего пытаемся приспособить то, что есть и, с некоторой натяжкой, считается стандартом.
...
Рейтинг: 0 / 0
21.06.2006, 10:47
    #33804603
ModelR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли сделать сложный внешний ключ (FK)?
ChA ModelRВы же не утверждаете, что сегодня мы можем знать все про завтра? В любом случае система не должна исходить из того, что завтра ничего не измениться.Ну почему же. В принципе, множество предметных областей настолько формализовано, что добавить практически уже нечего. Неплохое пособие, но сам автор их назвал 'Kick-Start' Data Models, т.е. добавить есть много чего. ChA ModelRЕсли их реализовывать как ссылочную целостность, то шесть сущностей немедленно.И ? Есть популярные СУБД, для которых это становится непреодолимым препятствием ? Э.., так это ж только начало и только для одной таблицы.
С "не отрываться от практики" согласен.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Можно ли сделать сложный внешний ключ (FK)? / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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