Поддержание ссылочной целостности

Учитывая схему:

MACHINE_TYPE { machine_type }
MACHINE { machine, machine_type }
SORT_PLAN { sort_plan, machine_type }
SCHEDULE { day_of_week, machine, sort_plan }

и бизнес-правило:

План сортировки может быть назначен любой машине того же типа.

Как обеспечить, чтобы в SCHEDULE кортежи, на которые ссылаются machine и sort_plan, имели один и тот же machine_type?

При необходимости схему можно изменить.


person Dave    schedule 11.12.2008    source источник


Ответы (2)


Вы можете изменить таблицу плана, чтобы она не имела MachineType, и добавить новую таблицу с именем machinePlan, в которой есть строка для каждой машины, которая может использовать этот план, с MachineId и PlanId. Затем выведите MachineType для плана из таблицы родительского компьютера этой новой таблицы, а не из самой таблицы плана.

Наконец, измените таблицу расписания, чтобы ее FK вернулся к этой новой таблице MachinePlan, а не к той, которая у вас есть в настоящее время.

MACHINE_TYPE { machine_type }
MACHINE { machine, machine_type }
SORT_PLAN { sort_plan}
MACHINE_SORTPLAN {machine, sort_plan }
SCHEDULE { day_of_week, machine_Sortplan }

Это также имеет дополнительное преимущество в том, что вы НЕ безвозвратно вводите правила для плана, к какому типу машины они применяются. Вы сохраняете эту ассоциацию отдельно и можете, при необходимости, решить использовать один и тот же набор правил (один и тот же план для машин более чем одного типа...

person Charles Bretana    schedule 11.12.2008
comment
Это может быть то, что я ищу. При создании планов сортировки машины не указываются, только тип машины. - person Dave; 11.12.2008
comment
Затем вам нужно будет добавить тип машины обратно в sortPlan, но, тем не менее, при назначении плана новой машине или создании расписания требование о добавлении записи в таблицу MachineSortPlan (а также в расписание) приведет к принудительному выполнению вашего ограничение - person Charles Bretana; 11.12.2008
comment
... требуя, чтобы запись была добавлена ​​​​в MachineSortPlan ... Разве для этого не потребовался бы триггер? Как бы я добился этого только с помощью RI? - person Dave; 11.12.2008
comment
Я пойду с этим в качестве ответа. Обсуждение убедило меня в том, что триггер — это, вероятно, правильный путь. - person Dave; 11.12.2008
comment
Ну, использование схемы, которую я изложил, потребует, чтобы запись существовала (или была добавлена) в MachineSortPlan. Вы не можете добавить новое расписание с FK в Machine_SortPlan, пока запись machineSortPlan не будет вставлена ​​для этого FK для ссылки... - person Charles Bretana; 11.12.2008

Я бы использовал триггер вставки в таблице SCHEDULE.

person Community    schedule 11.12.2008
comment
Это была моя первая мысль, но я чувствую, что упускаю что-то очевидное. - person Dave; 11.12.2008
comment
Просто убедитесь, что триггер может обрабатывать несколько вставок записей. - person HLGEM; 11.12.2008
comment
Триггеры пугают. Я стараюсь избегать их без крайней необходимости. Тем не менее, некоторые люди считают, что их никогда не будет достаточно. - person BobbyShaftoe; 15.12.2008