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

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

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 ?

Схема может быть изменена, если это необходимо.

11.12.2008 14:07:07
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 }

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

1
11.12.2008 14:25:01
Это может быть то, что я ищу. Когда создаются планы сортировки, машины не указываются, только тип машины.
Dave 11.12.2008 14:37:46
Затем вам нужно будет добавить тип машины обратно в sortPlan, но, тем не менее, при назначении плана новому компьютеру или создании расписания, требующего добавления записи в таблицу MachineSortPlan (а также в расписание), принудительно ограничение
Charles Bretana 11.12.2008 14:45:45
«... требующий добавления записи в MachineSortPlan ...» Разве для этого не потребуется триггер? Как бы я обеспечил это только с помощью RI?
Dave 11.12.2008 14:57:21
Я пойду с этим в качестве ответа. Дискуссия убедила меня, что триггер - это, вероятно, путь.
Dave 11.12.2008 15:49:24
При использовании схемы, которую я обрисовал в общих чертах, потребуется наличие (или добавление) записи в MachineSortPlan .. Вы не можете добавить новое расписание с FK в Machine_SortPlan, пока не будет вставлена ​​запись machineSortPlan для этого FK для ссылки ...
Charles Bretana 11.12.2008 15:53:40

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

2
11.12.2008 14:14:45
Это была моя первая мысль, но я чувствую, что упускаю что-то очевидное.
Dave 11.12.2008 14:17:18
Просто убедитесь, что триггер может обрабатывать несколько вставок записей.
HLGEM 11.12.2008 14:29:06
Триггеры страшны. Я стараюсь избегать их без крайней необходимости. Однако некоторые люди считают, что их никогда не будет достаточно.
BobbyShaftoe 15.12.2008 15:44:19