Учитывая схему:
MACHINE_TYPE { machine_type }
MACHINE { machine, machine_type }
SORT_PLAN { sort_plan, machine_type }
SCHEDULE { day_of_week, machine, sort_plan }
и бизнес-правило:
A sort plan can be assigned to any machine of the same machine_type.
Как мне обеспечить, чтобы в SCHEDULE кортежи, на которые ссылаются машина и sort_plan, имели одинаковый тип аппарата?
При необходимости схему можно изменить.





Я бы использовал триггер вставки в таблице SCHEDULE.
Просто убедитесь, что триггер может обрабатывать несколько вставок записей.
Триггеры пугают. Я стараюсь избегать их без крайней необходимости. Однако некоторые люди действительно чувствуют, что их никогда не бывает достаточно.
Вы можете изменить таблицу плана, чтобы в ней не было 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 }
Это также дает дополнительное преимущество в том, что вы НЕ безвозвратно вводите правила для плана, на котором они применяются. Вы сохраняете эту связь отдельно и можете, при необходимости, использовать тот же набор правил (один и тот же план для машин более чем одного типа ...
Это может быть то, что я ищу. При создании планов сортировки машины не указываются, только тип машины.
Затем вам нужно будет добавить тип машины обратно в sortPlan, но все же при назначении плана новой машине или создании расписания, требующего добавления записи в таблицу MachineSortPlan (а также в расписание), ваши ограничение
«... требуя, чтобы запись была добавлена в MachineSortPlan ...» Разве для этого не требуется триггер? Как я могу добиться этого с помощью только RI?
Я пойду с этим в качестве ответа. Обсуждение убедило меня в том, что спусковой крючок, вероятно, лучший выход.
Для использования схемы, которую я обрисовал, потребуется, чтобы запись существовала (или была добавлена) в MachineSortPlan .. Вы не можете добавлять новое расписание с FK в Machine_SortPlan до тех пор, пока не будет вставлена запись machineSortPlan для этого FK для ссылки ...
Это была моя первая мысль, но я чувствую, что упускаю что-то очевидное.