|
|
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
Такой вот теоретический вопрос: Допустим в БД имеются след. таблицы: 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 топол. объекта, т.е. улицы, проспекта или авеню; Вопрос: Как правильно сделать внешний ключ из таблицы адресов на все объекты? В такой схеме всё хорошо за исключением того, что ссылочную целостность не сделать внешними ключами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2006, 16:34 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
Может всё-таки не делать так с OBJECT_TYPE? Может просто сделать внешние ключи в ADDRESSES: т.е. вместо OBJECT_ID и OBJECT_TYPE_ID использовать STREET_ID, PROSPECT_ID и AVENUE_ID, ссылающиеся на ID в соответствующих таблицах? Можно ли как-нибудь указать, что OBJECT_ID ссылается на ID в STREETS если OBJECT_TYPE_ID = 1 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2006, 17:07 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
ID TYPE1 12 23 3Это сильно, это 5+ verterМожно ли сделать сложный внешний ключ (FK)?Можно. verterКак правильно сделать внешний ключ из таблицы адресов на все объекты?Ваша основная ошибка в расщеплении улиц на подкатегории, ни одна из них не является в чем то отличной от другой, это, грубо говоря, просто точка отсчета и вряд ли в контексте предметной области их описания принципиально различаются. В данном случае, IMHO, достаточно сделать одну таблицу Streets в которой будет дополнительное поле - StreetType, не входящее в ключ. Можете даже оставить неидентифицирующую связь с таблицей StreetTypes по типу OBJECT_TYPES. В таком случае, если правильно понял Ваше описание, проблемы с ссылочной целостностью для данного случая должны пропасть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2006, 17:16 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
Я это специально такой пример привёл, он не относиться к какой-либо реальной задаче. Пускай это будут не улицы и проспекты, а в общем если, то допустим есть несколько таблиц и их НЕЛЬЗЯ свести в одну, допустим одна таблица содержит данные одного типа, вторая - другого и т.д. И есть таблица которая использует эти данные. Хочется, чтобы внешним ключём обеспечивалась ссылочная целостность, но это не получится, потому что нужно ссылаться сразу на несколько таблиц в зависимости от типа. Я вот и спрашивал может как-то это можно сделать? А вообще мне тут подумалось, что наверное придётся в триггерах проверять ссылочную целостность ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2006, 17:25 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
verterдопустим есть несколько таблиц и их НЕЛЬЗЯ свести в одну, допустим одна таблица содержит данные одного типа, вторая - другого и т.д. И есть таблица которая использует эти данные. Хочется, чтобы внешним ключём обеспечивалась ссылочная целостность, но это не получится, потому что нужно ссылаться сразу на несколько таблиц в зависимости от типа.В таком случае всегда можно выделить надсущность, через которую и обеспечивается ссылочная целостность. Вернувшись к предыдущему посту, никто теперь не помешает добавить отдельно таблицы STREET, PROSPECT и AVENUE. Ссылочная целостность будет обеспечиваться через надсущность - таблицу Streets, хотя, возможно, надо придумать для нее более адекватное наименование. Надеюсь, аналогия понятна ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2006, 17:37 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
ну а смысл в этой надсущности? Я итак могу без неё вместо OBJECT_TYPE_ID и OBJECT_ID использовать 3 поля STREET_ID, PROSPECT_ID и AVENUE_ID, которые будут внешними ключами на соответствующие таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2006, 17:42 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
Кстати, я посмотрел, ты в основном с SQL Server'ом работаешь, я сейчас тоже вот начал с ним разбираться, а если точнее то с 2005. Я вот и подумал, что может в новом 2005-ом есть какие-то хитрые методы для решения такой часто встречающейся проблеммы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2006, 17:55 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
verterвместо OBJECT_TYPE_ID и OBJECT_ID использовать 3 поля STREET_ID, PROSPECT_ID и AVENUE_ID, которые будут внешними ключами на соответствующие таблицы.Зачем 3, когда достаточно одного ? Исходные вопросы были verterКак правильно сделать внешний ключ из таблицы адресов на все объекты? В такой схеме всё хорошо за исключением того, что ссылочную целостность не сделать внешними ключами.. На них было предложено решение. Хотите 3 поля, нет проблем, хозяин - барин :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2006, 17:56 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
ChA А почём сейчас хаты в Москве снять? Я вот в Питере сейчас снимаю, у нас уже в среднем простецкую хату за 350$ тока снять можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2006, 17:56 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
verterможет в новом 2005-ом есть какие-то хитрые методы для решения такой часто встречающейся проблеммы?Это проблема проектирования, а не инструментов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2006, 17:58 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
[quot ChA][quot] Не совсем понятно всё-таки что ты предлагаешь конкретно. Напиши структуру таблиц применительно к улицам, проспектам и авеню и где там будет обеспечиваться ссылочная целостность данных через внешние ключи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 09:13 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 13:15 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
Из BOL MSSQL 2000. Цветом выделена необходимая информация, по конкретному вопросу. Ответ - можно. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 13:23 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
Мимо пробегал... [ ( column [ ,...n ] ) ] состоящий из набора колонок REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] связанный с набором колонок в другой таблице Слишком быстро - вот и мимо:) Автору нужен ключ на набор ТАБЛИЦ. Кстати, решалось бы, если можно было реализовывать ссылки на View. В Оракл 9 - 10 это можно объявлять, но лишь DISABLE NOVALIDATE :(. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 13:49 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
Автору нужен ключ на набор ТАБЛИЦ Упс. тоогда это старые песТни о главном... в смысле об OID или о чём то типа того. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 18:07 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
ModelRКстати, решалось бы, если можно было реализовывать ссылки на View.Смысл ? IMHO, подобное желание возникает, как правило, когда проектировщик явно что-то недопонимает в предметной области. Собственно, полагаю, Вы это и сами прекрасно понимаете, просто непонятно, зачем придумывать механизм для оправдания неверного проектирования ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 18:29 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
Не скажите. Сплошь и рядом такая задача возникает не по ошибке. Начиная с аналитики в бухучете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 09:53 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
Основной тезис: любая связь между сущностями должна быть выразима только посредством ссылочных ограничений и ни одна из них не должна определяться программным кодом. Возможно, звучит немного максималистски, но только в таком случае сама схема БД полностью контролирует ссылочную целостность, независимо от клиентских приложений и процедурных расширений самого сервера. Как только возникает повод делать иначе, значит изначально было неверное проектирование(и не всегда из-за квалификации проектировщика). Как правило, это следствие недопонимания предметной области аналитиком/проектировщиком БД, либо представителями заказчика, которые описывает ее в меру своей компетенции, не видя деревьев из-за леса. В случае возникновения подобной ситуации(с обеспечением ссылочной целостности на разные сущности) появляется повод добавить новую сущность, которая бы эээ... инкапсулировала эти разные сущности. Это дает возможность определить ссылочную целостность легальным способом, т.е., как уже было сказано выше, самой схемой БД. ModelRНачиная с аналитики в бухучете.И что с ней не так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 14:45 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
ChA ModelRНачиная с аналитики в бухучете.И что с ней не так ?Вот топик по теме структур бухучета. Там много примеров приводили, начиная с OEBS. Дело в том, что бухучет сам по себе прекрасный пример информационной модели. Коротко - каждый счет логически есть сущность со специфической аналитикой, Аналитикой счета может быть сегодня все, что и не предполагалось вчера:). Т.е.применение максималистского подхода означает рефакторинг таблиц при изменении плана счетов. Практически никто так не делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 19:24 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
ModelRДело в том, что бухучет сам по себе прекрасный пример информационной модели. Коротко - каждый счет логически есть сущность со специфической аналитикой, Аналитикой счета может быть сегодня все, что и не предполагалось вчера Некоторое представление о бухучете(БУ) имею, как, думаю, и половина здесь бывающих. В принципе, Вы подтверждаете предположение выше, о недостатке понимания/знания предметной области. ModelRприменение максималистского подхода означает рефакторинг таблиц при изменении плана счетов. Практически никто так не делает.Со второй частью готов согласиться, с первой - нет. Если бы в процессе проектирования БД для БУ стоял специалист, хорошо понимающий предметную область, то ссылки на "разнородные" сущности всплыли бы на этапе обследования, именно в связи с аналитикой. В таком случае нашелся бы способ ее решить, например, введением общего "предка", с последующим "расщеплением" на subtypes. Утрированно говоря, если объектом ссылки может быть любой объект, значит должна существовать сущность "Любой объект" :) Которая является эээ... предком для всех остальных сущностей. Более того, есть системы, реализованные именно таким образом, в которых нет проблем с разнородными ссылками. Возможно, у них есть свои недостатки, но нарушение ссылочной целостности точно не относится к их числу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2006, 00:16 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
ChA ModelRАналитикой счета может быть сегодня все, что и не предполагалось вчера Некоторое представление о бухучете(БУ) имею, как, думаю, и половина здесь бывающих. В принципе, Вы подтверждаете предположение выше, о недостатке понимания/знания предметной области.Определенно, Вы же не утверждаете, что сегодня мы можем знать все про завтра? В любом случае система не должна исходить из того, что завтра ничего не измениться. ChA ModelRприменение максималистского подхода означает рефакторинг таблиц при изменении плана счетов. Практически никто так не делает.Со второй частью готов согласиться, с первой - нет. Если бы в процессе проектирования БД для БУ стоял специалист, хорошо понимающий предметную область, то ссылки на "разнородные" сущности всплыли бы на этапе обследования, именно в связи с аналитикой. В таком случае нашелся бы способ ее решить, например, введением общего "предка", с последующим "расщеплением" на subtypes. Утрированно говоря, если объектом ссылки может быть любой объект, значит должна существовать сущность "Любой объект" :) Которая является эээ... предком для всех остальных сущностей. Более того, есть системы, реализованные именно таким образом, в которых нет проблем с разнородными ссылками. Возможно, у них есть свои недостатки, но нарушение ссылочной целостности точно не относится к их числу.Со сторны удаления - да, единый каталог OID предотвращает безобразия. При изменени/добавлении система контроля целостности будет допускать много мусора. Точное же отражение в ссылочной целостности ограничений предметной области ведет к комбинатрному взрыву числа сущностей типа каталогов подмножеств OID. Так что практически это реализуется на уровне приложения динамически. Вот тут разбирался с КЛАДР. Три естественных ограничения, кстати реальные данные их немножко:) нарушают: -Актуальные объекты могут быть частью только актуальных. -Район обязан входить в субъект федерации. -Переименованный объект обязан иметь парный актуальный того же уровня. Если их реализовывать как ссылочную целостность, то шесть сущностей немедленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2006, 10:19 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
ModelRВы же не утверждаете, что сегодня мы можем знать все про завтра? В любом случае система не должна исходить из того, что завтра ничего не измениться.Ну почему же. В принципе, множество предметных областей настолько формализовано, что добавить практически уже нечего. Если вдруг грядут изменения, то они, скорее всего, будут иметь такой характер, что никакой рефакторинг не справится, проще построить новую, более адекватную, модель. При необходимости выполнив перенос данных из старой схемы в новую, хотя это может оказаться более чем сложным из-за различия парадигм. ModelRТочное же отражение в ссылочной целостности ограничений предметной области ведет к комбинатрному взрыву числа сущностей типа каталогов подмножеств OID.Только теоретически, если кто-то вдруг возмет на себя смелость описать все :), но в этом случае никакие view c поддержкой ссылочной целостности все равно не спасут. Если же не сильно отрываться от практики, то, IMHO, сложность "хорошей" модели не должна превышать способности понимания ее любым вменяемым специалистом. ModelRЕсли их реализовывать как ссылочную целостность, то шесть сущностей немедленно.И ? Есть популярные СУБД, для которых это становится непреодолимым препятствием ? Кроме того, мне показалось, что у Вас есть сомнения в адекватности модели, реализованной КЛАДР, более того, даже само наличие таковой модели :) Просто за неимением лучшего пытаемся приспособить то, что есть и, с некоторой натяжкой, считается стандартом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2006, 02:12 |
|
||
|
Можно ли сделать сложный внешний ключ (FK)?
|
|||
|---|---|---|---|
|
#18+
ChA ModelRВы же не утверждаете, что сегодня мы можем знать все про завтра? В любом случае система не должна исходить из того, что завтра ничего не измениться.Ну почему же. В принципе, множество предметных областей настолько формализовано, что добавить практически уже нечего. Неплохое пособие, но сам автор их назвал 'Kick-Start' Data Models, т.е. добавить есть много чего. ChA ModelRЕсли их реализовывать как ссылочную целостность, то шесть сущностей немедленно.И ? Есть популярные СУБД, для которых это становится непреодолимым препятствием ? Э.., так это ж только начало и только для одной таблицы. С "не отрываться от практики" согласен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2006, 10:47 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33795609&tid=1545189]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
399ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 738ms |

| 0 / 0 |
