powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Ссылочная целостность
19 сообщений из 19, страница 1 из 1
Ссылочная целостность
    #32297814
lasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть:
Таблица А, имеющая первичный ключ кодА.
Таблицы Б и В, каждая из которых содержит foreign key кодБ и кодС, которые дожны ссылаться на кодА из таблицы А.
Проблема:
Необходимо, чтобы кодА = кодБ ЛИБО кодС, т.о. был их ОБЪЕДИНЕНИЕМ .
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32297911
Maks_f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простейщий пример справочник товаров имеет Id и Name
А две другие таблицы ссылаются по IdTovar через FK на таблицу справочника товаров, и никаких либо или или
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32298223
lasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я наверное не очень точно выразил свою мысль.
Попробую поточнее.
Есть 2 таблицы товаров: Б и С.
Есть таблица "Продажа товаров", в которой есть FK, указывающий какой товар был продан.
Проблема в том, что необходимо, чтобы этот FK ссылался либо на таблицу Б либо на таблицу С.
Примечание:
1.Таблицы Б и С имеют поле кодТовара Integer not null primary key. Множества значений этого поля в таблицах Б и С не пересекаются.
2. Нельзя объединить таблицы Б и С в одну таблицу, т.к. они описывають разные группы товаров.
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32298238
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как раз таблицы желательно объединить - что мешает завести поле кода группы товара?
Возможно можно сделать представление из имеющихся 2-х таблиц и делать FK на него, хотя это как-то нехорошо. Если попробуешь этот способ, сообщи пожалуйста что получилось.
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32298783
Малиновский Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нормализация, нормализация...
Конечно, прав Gold .

Но раз уж Вы это безобразие реализовали, то используйте триггеры.
Я как-то работал под руководством одного очень старательного заказчика, так его оч-чень волновала внутренняя структура базы. В смысле, хотел, чтобы по каждому виду товара своя таблица была, отдельная. Самое интересное, что набор атрибутов в каждой таблице был совершенно одинаков. Ну вот, пришлось реализовывать через триггеры.
Но Gold все равно правее всех.
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32299420
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо уходить на тригеры. Они не заменят в полном объеме ссылочную целостность.
Если нельзя сделать как говорит Gold то в таблице А надо сделать 2 поля-ключа на каждую таблицу. Одно из полей должно всегда быть NULL, а второе NOT NULL.
При желании можно, при этом оставить старое поле, но убрать с него связку.
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32299484
Малиновский Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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


/*--------------------*/

При нарушении Ваших условий триггер может выдать ЛЮБУЮ диагностику. А констрейнты? А если набор ограничений сложный?
Впрочем, на вкус и цвет ...
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32299504
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггеры не могут заменить ограничения, т.к. ограничения работают вне контекста транзакций. Если у вас однопользовательское приложение - то пожалуйста, иначе надо блокировать таблицы.
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32299507
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Малиновский Владимир
>"Ссылочная целостность" - это не способ использования Foreign
Да? Что же тогда.

>Они реализуют все, что напишешь.
Да, если сработают. А если нет по каким то причинам. Например не активировались после ресторе (бывает иногда судя по вопросам), или некорректно прописана работа с транзакциями(не отловили при написании)? В общем не удивляйся, когда после некоторого времени увидишь то что увидишь.

Простой ключ дает гарантию от этого.
Хотя конечно
>А если набор ограничений сложный?
Тут да, но только как крайний случай.
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32299539
Малиновский Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>В общем не удивляйся, когда после некоторого времени увидишь то что увидишь

Тьфу на тебя
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32300613
lasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Не ожидал, что мой вопрос вызовет такое живое обсуждение.
То, что писал "Серега" не подходит, т.к. не исключена ситуация, когда к уже имеющимся 2-м группам товаров добавится еще 1,2,....
Поэтому добавление новых полей - не выход.
Почему я не могу объединить таблицы (На самом деле я так и сделал :-(), только не злитесь, что сразу не сказал), просто у меня такая ситуация:
Б и С имеют 5 общих полей и в Б имеется 40 полей, которые не используются в C. Объединив их я решил проблему, но очень нагромадил таблицу Б. Выход - использовать View, как мне и посоветовали. Но это опять же не дает мне ответа на вопрос - А как же быть с нормализацией?

Вообще я наверное поставлю вопрос более глобально:
Что делать ( как нормализировать), если 2 каких-либо сущности можно примерно с одинаковой позиции рассматривать как врозь, так и вместе???
Помоему сама идея нормализации не допускает такой ситуации??
Lasta

P.S.
Забыл ответить "Gold"у:
InterBAse не позволяет в качестве FK таблицы использовать View. (Я пробовал). Это связано стем, что View нельзя индексировать. (По крайней мере такую ошибку мне возdращал InterBase)

P.S.
На счет использования триггеров - когда пишешь большой проект, необходимо, что бы ВСЕ было как можно проще (чего же я так усердно гоняюсь за нормализацией). А из личного опыта я могу сказать, что триггеры усложняют, причем сильно, всю систему. (Я имею ввиду триггеры, которые пытаются заменить ссылочную целостность. Их просто может бть ОЧЕНЬ ОЧЕНЬ много, а тогда у тебя просто крыша поедет, что бы все учесть)

Ну вроде все.
Буду рад ответам.
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32300695
Фотография SmaLL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не претендую на правильность, но есть идея

Как и предлагалось объединить в таблице товаров А разные товары добавив поле с типом товара. В этой таблице иметь поля одинаковые для разных товаров, а отличные поля вынести в отдельные таблицы

Надеюсь мысль моя ясна...
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32300778
lasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если чесно, то я не въехал, каким образом ты хочешь вынести часть полей в отдельную таблицу?
Можно пример?
Lasta
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32300823
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2lasta
То, что писал "Серега" не подходит, т.к. не исключена ситуация, когда к уже имеющимся 2-м группам товаров добавится еще 1,2,....
Поэтому добавление новых полей - не выход.

Ну такого в условиях не было. К тому же, ИМХО, раз такая ситуация возможна, значит ты недодумал структуру данных.

Б и С имеют 5 общих полей и в Б имеется 40 полей, которые не используются в C. Объединив их я решил проблему, но очень нагромадил таблицу Б. Выход - использовать View, как мне и посоветовали. Но это опять же не дает мне ответа на вопрос - А как же быть с нормализацией?

Ну это решается проще. В таблице Б сливаются 5 полей + создается поле-указатель на таблицу Б1, в которой хранятся остальные 40 полей со связью 1:1. У записей привнесенных из таблицы С это поле будет NULL. Вот и все.

Вообще я наверное поставлю вопрос более глобально:
Что делать ( как нормализировать), если 2 каких-либо сущности можно примерно с одинаковой позиции рассматривать как врозь, так и вместе???
Помоему сама идея нормализации не допускает такой ситуации??

Сам спросил - сам ответил. Выход - или приводить (искусственно) к нормализованной форме или.. забить на нормализацию. 8-) Первое, ИМХО, предпочтительнее.
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32302263
lasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Серега

Я хотел поинтересоваться, хорошо ли использовать Join`ы?? В смысле правильно ли это с точки зрения нормализации?? Потом что, если чесно, то я совсем их не спользую.
Lasta
И, кстати, что такое ИМХО?
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32302604
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2lasta
>Я хотел поинтересоваться, хорошо ли использовать Join`ы??
Хорошо ли использовать рычаг переключения скоростей при езде на автомобиле? Ответ: Когда надо, то как иначе?

>В смысле правильно ли это с точки зрения нормализации??
Это никак не связано, ИМХО.

>Потом что, если чесно, то я совсем их не спользую.
Значит пока не надо было, наверное.

>И, кстати, что такое ИМХО?
Это аббревиатура с аглицкого - "по моему скромному мнению". (так вроде, ИМХО 8-)
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32303120
Малиновский Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то ссылочная целостность - это не использование внешних ключей или констреинтов или триггеров, а способ организации поддержки структуры базы в рабочем состоянии при различных вариантах действий злобных юзеров.
Хлопцы, возьмите ErWin (сам с удовольствием его использую), там эта ссылочная целостность реализуется как хочешь - с помощью констреинтов, внешних ключей - и (о, ужас!) - триггеров. По вашему настроению. А если хотите, то с помощью процедур на сервере - и юзерам со злыми намерениями ничего не остается, как горько рыдать. Если хотите, пришлю большой ErWin - проект, в котором ВСЯ ссылочная целостность реализована на триггерах. И там есть всякая всячина, свойственная InterBase - генераторы, хранимые процедуры, исключения.
Ну так вот, в этом ErWin предусмотрены такие вещи, как организация свящи типа "Sub-category". Ваш случай разбиения похощих сущностей на суб-категории как раз является разновидностью такой связи. И реализуют там все эти дела с помощью триггеров...
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32303868
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Малиновский Владимир
А никто и не говорит, что нельзя в принципе с помощью тригеров. Говорилось о том, что надежность такой реализации гораздо ниже чем у стандартных констрейнтов. Ибо констрейнты работают вне контекста транзакций. Тригеры иногда (по разным причинам) могут не срабатывать (деактивированы) или срабатывать неправильно (шаловливые или кривые руки). Констрейнты лишены этих недостатков.
...
Рейтинг: 0 / 0
Ссылочная целостность
    #32304865
lasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я полность согласен с снением `Сереги`.
lasta
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Ссылочная целостность
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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