2015-11-16 2 views
0

Предположим, у меня есть два понятия: Учитель и класс. Они хорошо сочетаются с двумя таблицами базы данных, преподавателями и классами. Чтобы выразить утверждение «каждый класс имеет Учителя», я добавляю внешний ключ в таблицу классов, указывающую на таблицу Учителей. Теперь, если я попытаюсь удалить строку «Учителя», которая используется в классе, я получаю хорошую ошибку, говоря «Не могу этого», что я и хочу.Как изменить зависимости ограничения внешнего ключа?

Пока все хорошо. Но что, если я хотел бы распространить это поведение на учеников? То есть когда я пытаюсь удалить ученика, который является частью класса, я хочу, чтобы механизм базы данных кричал на меня и сказал: «Не могу этого сделать».

Я мог бы имитировать то, что хочу, создав 30 внешних ключей в классах: Pupil_1_ID, Pupil_2_ID, ... Pupil_30_ID. Но то, что я на самом деле, делает это для произвольного числа учеников.

Как я могу это достичь?

+0

Стандартное отношение внешних ключей должно это сделать. Если вы хотите другое поведение, то возможности «каскада» позволят другие вещи (например, удаление класса, у которого есть ученики, которые удалены). –

+0

НЕ создавайте столбцы для каждого ученика. Как бы вы ожидали разумного определения того, является ли конкретный ученик в классе? –

ответ

4

Создайте стол с суррогатным ключом, PupilClass, который имеет FK до Class и другой FK до Pupils. Таким образом, вы не можете удалить ученика, который находится в классе, и вы также не можете удалить класс с учениками.

Суррогатная таблица - это общий шаблон дизайна, когда вам нужно моделировать отношения «многие ко многим»: класс может иметь много учеников, ученик может посещать многие классы.

+0

Это должно сделать это, спасибо! –

+0

Другим именем «суррогатной таблицы ключей» является «таблица соединений». –

Смежные вопросы