+ 1 для Мэтта Фенвика.Я бы добавил, что вы хотите быть немного осторожнее с ограничениями внешнего ключа.По сути, у вас есть два варианта, каждый из которых может выглядеть довольно похожим, в зависимости от вашего выбора первичных ключей.
Вариант один : Забудьте о простом пересечении между TEACHER
и INSTRUMENT
и замените его сложным пересечением, которое включает teacher_id
, instrument_id
и level_id
.Все три из этих столбцов будут (составным) первичным ключом этой таблицы пересечений.В этом варианте у вас есть ограничения внешнего ключа, определенные для teacher_id
и instrument_id
(и level_id
, если это на самом деле внешний ключ к таблице LEVEL
, а не просто целочисленный или строковый код).
Вариант два : сохранить простое пересечение между TEACHER
и INSTRUMENT
(назовем его TEACHER_INSTRUMENT
, даже если это не является воображаемым) и добавить дочернюю таблицу, которая определяет уровни, которые могутучиться.Эта дочерняя таблица (назовем ее SKILL
) имеет level_id
и внешний ключ для TEACHER_INSTRUMENT
.Если первичный ключ TEACHER_INSTRUMENT
является комбинацией teacher_id
и instrument_id
, то таблица SKILL
будет иметь те же три столбца, что и в первом варианте.Чем отличается этот вариант? Ограничение внешнего ключа от SKILL
должно быть к таблице пересечений, а не к TEACHER
и INSTRUMENT
.
Почему это важно? Если вы выберете первый вариант, вам может потребоваться дополнительная логика запроса, чтобы получить полностью заполненную сетку навыков, так как нет ограничения ссылочной целостности, которое вы можете определить, чтобы гарантировать, что все навыкиуровни заполняются для каждой комбинации учитель / инструмент.
С другой стороны, если вы выберете второй вариант, у вас есть преимущество разделения интересов между тем, кто может что-то использовать, и насколько хорошо они могут этому научить.
Чего вы хотите избежать, так это иметь одну таблицу, которая содержит только отношения учитель / инструмент, а затем вторую, которая (независимо) повторяет эти отношения, но добавляет детализацию уровня навыка.Если вы это сделаете, то рискуете, что эти две вещи выйдут из синхронизации.