|
|
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
У меня есть: Таблица А, имеющая первичный ключ кодА. Таблицы Б и В, каждая из которых содержит foreign key кодБ и кодС, которые дожны ссылаться на кодА из таблицы А. Проблема: Необходимо, чтобы кодА = кодБ ЛИБО кодС, т.о. был их ОБЪЕДИНЕНИЕМ . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2003, 21:34 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
Простейщий пример справочник товаров имеет Id и Name А две другие таблицы ссылаются по IdTovar через FK на таблицу справочника товаров, и никаких либо или или ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2003, 07:59 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
Я наверное не очень точно выразил свою мысль. Попробую поточнее. Есть 2 таблицы товаров: Б и С. Есть таблица "Продажа товаров", в которой есть FK, указывающий какой товар был продан. Проблема в том, что необходимо, чтобы этот FK ссылался либо на таблицу Б либо на таблицу С. Примечание: 1.Таблицы Б и С имеют поле кодТовара Integer not null primary key. Множества значений этого поля в таблицах Б и С не пересекаются. 2. Нельзя объединить таблицы Б и С в одну таблицу, т.к. они описывають разные группы товаров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2003, 12:33 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
Как раз таблицы желательно объединить - что мешает завести поле кода группы товара? Возможно можно сделать представление из имеющихся 2-х таблиц и делать FK на него, хотя это как-то нехорошо. Если попробуешь этот способ, сообщи пожалуйста что получилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2003, 12:41 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
Нормализация, нормализация... Конечно, прав Gold . Но раз уж Вы это безобразие реализовали, то используйте триггеры. Я как-то работал под руководством одного очень старательного заказчика, так его оч-чень волновала внутренняя структура базы. В смысле, хотел, чтобы по каждому виду товара своя таблица была, отдельная. Самое интересное, что набор атрибутов в каждой таблице был совершенно одинаков. Ну вот, пришлось реализовывать через триггеры. Но Gold все равно правее всех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2003, 16:55 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
Не надо уходить на тригеры. Они не заменят в полном объеме ссылочную целостность. Если нельзя сделать как говорит Gold то в таблице А надо сделать 2 поля-ключа на каждую таблицу. Одно из полей должно всегда быть NULL, а второе NOT NULL. При желании можно, при этом оставить старое поле, но убрать с него связку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2003, 11:02 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
2 Серега >Они не заменят в полном объеме ссылочную целостность. "Ссылочная целостность" - это не способ использования Foreign Они реализуют все, что напишешь. CREATE TRIGGER TU_BANK FOR BANK ACTIVE AFTER UPDATE POSITION 0 AS DECLARE VARIABLE numrows INTEGER; BEGIN /* Запрет изменения родительской записи */ IF (OLD.bank_id <> NEW.bank_id) THEN BEGIN select count(*) from Client where Client.bank_id = OLD.bank_id into numrows; IF (numrows > 0) THEN BEGIN execute procedure c_r 'Изменять нельзя: имеются записи в связанной таблице "Клиенты"'; END END /*---------------*/ CREATE TRIGGER TD_BANK FOR BANK ACTIVE AFTER DELETE POSITION 0 AS /* DELETE trigger on Bank */ DECLARE VARIABLE numrows INTEGER; BEGIN /* Запрет удаления родительской записи */ select count(*) from Client where Client.bank_id = OLD.bank_id into numrows; IF (numrows > 0) THEN BEGIN execute procedure c_r 'Удалять нельзя: имеются записи в связанной таблице "Клиенты"'; END END /*--------------------*/ При нарушении Ваших условий триггер может выдать ЛЮБУЮ диагностику. А констрейнты? А если набор ограничений сложный? Впрочем, на вкус и цвет ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2003, 11:37 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
Триггеры не могут заменить ограничения, т.к. ограничения работают вне контекста транзакций. Если у вас однопользовательское приложение - то пожалуйста, иначе надо блокировать таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2003, 11:46 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
2Малиновский Владимир >"Ссылочная целостность" - это не способ использования Foreign Да? Что же тогда. >Они реализуют все, что напишешь. Да, если сработают. А если нет по каким то причинам. Например не активировались после ресторе (бывает иногда судя по вопросам), или некорректно прописана работа с транзакциями(не отловили при написании)? В общем не удивляйся, когда после некоторого времени увидишь то что увидишь. Простой ключ дает гарантию от этого. Хотя конечно >А если набор ограничений сложный? Тут да, но только как крайний случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2003, 11:47 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
>В общем не удивляйся, когда после некоторого времени увидишь то что увидишь Тьфу на тебя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2003, 11:56 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
Всем привет. Не ожидал, что мой вопрос вызовет такое живое обсуждение. То, что писал "Серега" не подходит, т.к. не исключена ситуация, когда к уже имеющимся 2-м группам товаров добавится еще 1,2,.... Поэтому добавление новых полей - не выход. Почему я не могу объединить таблицы (На самом деле я так и сделал :-(), только не злитесь, что сразу не сказал), просто у меня такая ситуация: Б и С имеют 5 общих полей и в Б имеется 40 полей, которые не используются в C. Объединив их я решил проблему, но очень нагромадил таблицу Б. Выход - использовать View, как мне и посоветовали. Но это опять же не дает мне ответа на вопрос - А как же быть с нормализацией? Вообще я наверное поставлю вопрос более глобально: Что делать ( как нормализировать), если 2 каких-либо сущности можно примерно с одинаковой позиции рассматривать как врозь, так и вместе??? Помоему сама идея нормализации не допускает такой ситуации?? Lasta P.S. Забыл ответить "Gold"у: InterBAse не позволяет в качестве FK таблицы использовать View. (Я пробовал). Это связано стем, что View нельзя индексировать. (По крайней мере такую ошибку мне возdращал InterBase) P.S. На счет использования триггеров - когда пишешь большой проект, необходимо, что бы ВСЕ было как можно проще (чего же я так усердно гоняюсь за нормализацией). А из личного опыта я могу сказать, что триггеры усложняют, причем сильно, всю систему. (Я имею ввиду триггеры, которые пытаются заменить ссылочную целостность. Их просто может бть ОЧЕНЬ ОЧЕНЬ много, а тогда у тебя просто крыша поедет, что бы все учесть) Ну вроде все. Буду рад ответам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2003, 01:41 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
Не претендую на правильность, но есть идея Как и предлагалось объединить в таблице товаров А разные товары добавив поле с типом товара. В этой таблице иметь поля одинаковые для разных товаров, а отличные поля вынести в отдельные таблицы Надеюсь мысль моя ясна... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2003, 09:01 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
Если чесно, то я не въехал, каким образом ты хочешь вынести часть полей в отдельную таблицу? Можно пример? Lasta ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2003, 09:56 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
2lasta То, что писал "Серега" не подходит, т.к. не исключена ситуация, когда к уже имеющимся 2-м группам товаров добавится еще 1,2,.... Поэтому добавление новых полей - не выход. Ну такого в условиях не было. К тому же, ИМХО, раз такая ситуация возможна, значит ты недодумал структуру данных. Б и С имеют 5 общих полей и в Б имеется 40 полей, которые не используются в C. Объединив их я решил проблему, но очень нагромадил таблицу Б. Выход - использовать View, как мне и посоветовали. Но это опять же не дает мне ответа на вопрос - А как же быть с нормализацией? Ну это решается проще. В таблице Б сливаются 5 полей + создается поле-указатель на таблицу Б1, в которой хранятся остальные 40 полей со связью 1:1. У записей привнесенных из таблицы С это поле будет NULL. Вот и все. Вообще я наверное поставлю вопрос более глобально: Что делать ( как нормализировать), если 2 каких-либо сущности можно примерно с одинаковой позиции рассматривать как врозь, так и вместе??? Помоему сама идея нормализации не допускает такой ситуации?? Сам спросил - сам ответил. Выход - или приводить (искусственно) к нормализованной форме или.. забить на нормализацию. 8-) Первое, ИМХО, предпочтительнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2003, 10:11 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
2Серега Я хотел поинтересоваться, хорошо ли использовать Join`ы?? В смысле правильно ли это с точки зрения нормализации?? Потом что, если чесно, то я совсем их не спользую. Lasta И, кстати, что такое ИМХО? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2003, 21:29 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
2lasta >Я хотел поинтересоваться, хорошо ли использовать Join`ы?? Хорошо ли использовать рычаг переключения скоростей при езде на автомобиле? Ответ: Когда надо, то как иначе? >В смысле правильно ли это с точки зрения нормализации?? Это никак не связано, ИМХО. >Потом что, если чесно, то я совсем их не спользую. Значит пока не надо было, наверное. >И, кстати, что такое ИМХО? Это аббревиатура с аглицкого - "по моему скромному мнению". (так вроде, ИМХО 8-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2003, 10:49 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
Вообще-то ссылочная целостность - это не использование внешних ключей или констреинтов или триггеров, а способ организации поддержки структуры базы в рабочем состоянии при различных вариантах действий злобных юзеров. Хлопцы, возьмите ErWin (сам с удовольствием его использую), там эта ссылочная целостность реализуется как хочешь - с помощью констреинтов, внешних ключей - и (о, ужас!) - триггеров. По вашему настроению. А если хотите, то с помощью процедур на сервере - и юзерам со злыми намерениями ничего не остается, как горько рыдать. Если хотите, пришлю большой ErWin - проект, в котором ВСЯ ссылочная целостность реализована на триггерах. И там есть всякая всячина, свойственная InterBase - генераторы, хранимые процедуры, исключения. Ну так вот, в этом ErWin предусмотрены такие вещи, как организация свящи типа "Sub-category". Ваш случай разбиения похощих сущностей на суб-категории как раз является разновидностью такой связи. И реализуют там все эти дела с помощью триггеров... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2003, 15:01 |
|
||
|
Ссылочная целостность
|
|||
|---|---|---|---|
|
#18+
2Малиновский Владимир А никто и не говорит, что нельзя в принципе с помощью тригеров. Говорилось о том, что надежность такой реализации гораздо ниже чем у стандартных констрейнтов. Ибо констрейнты работают вне контекста транзакций. Тригеры иногда (по разным причинам) могут не срабатывать (деактивированы) или срабатывать неправильно (шаловливые или кривые руки). Констрейнты лишены этих недостатков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2003, 09:10 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32302263&tid=1579767]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
206ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 508ms |

| 0 / 0 |
