Связывание третьей таблицы с таблицей мостов в ассоциации «многие ко многим» - PullRequest
2 голосов
/ 17 ноября 2011

Как правильно спроектировать эту базу данных?

Вот как я настроил свои таблицы:

У меня есть отношения многие ко многим между столом, который называется учителями, и столом, который называется инструментами. У меня тогда есть бридж-стол, соединяющий их. Я хотел бы связать другую таблицу с таблицей BRIDGE. Значение комбинации инструмент / учитель. В этой таблице будет 3 строки, указывающие, какой уровень игры может преподавать учитель (т. Е. Начальный, средний, продвинутый). Похоже, мне нужно настроить таблицу моста так, чтобы она имела имя teacher_id, instrument_id AND level_id, но я не знаю, является ли это обычным способом сделать это.

Я использую mysql и cakephp, и я не нашел ничего в документации об ассоциациях HABTM о наличии дополнительного поля в таблице мостов. Просто хочу убедиться, что я делаю это правильно.

Ответы [ 2 ]

5 голосов
/ 17 ноября 2011

+ 1 для Мэтта Фенвика.Я бы добавил, что вы хотите быть немного осторожнее с ограничениями внешнего ключа.По сути, у вас есть два варианта, каждый из которых может выглядеть довольно похожим, в зависимости от вашего выбора первичных ключей.

Вариант один : Забудьте о простом пересечении между TEACHER и INSTRUMENT и замените его сложным пересечением, которое включает teacher_id, instrument_id и level_id.Все три из этих столбцов будут (составным) первичным ключом этой таблицы пересечений.В этом варианте у вас есть ограничения внешнего ключа, определенные для teacher_id и instrument_idlevel_id, если это на самом деле внешний ключ к таблице LEVEL, а не просто целочисленный или строковый код).

Вариант два : сохранить простое пересечение между TEACHER и INSTRUMENT (назовем его TEACHER_INSTRUMENT, даже если это не является воображаемым) и добавить дочернюю таблицу, которая определяет уровни, которые могутучиться.Эта дочерняя таблица (назовем ее SKILL) имеет level_id и внешний ключ для TEACHER_INSTRUMENT.Если первичный ключ TEACHER_INSTRUMENT является комбинацией teacher_id и instrument_id, то таблица SKILL будет иметь те же три столбца, что и в первом варианте.Чем отличается этот вариант? Ограничение внешнего ключа от SKILL должно быть к таблице пересечений, а не к TEACHER и INSTRUMENT.

Почему это важно? Если вы выберете первый вариант, вам может потребоваться дополнительная логика запроса, чтобы получить полностью заполненную сетку навыков, так как нет ограничения ссылочной целостности, которое вы можете определить, чтобы гарантировать, что все навыкиуровни заполняются для каждой комбинации учитель / инструмент.

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

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

3 голосов
/ 17 ноября 2011

Если это то, к чему обращаются ваши данные, и звучит так, как будто это так, то пойдите на это.

В принципе, как вы заметили, у вас будет ключ из трех частей:

  • teacher_id
  • instrument_id
  • level_id

Это означает, что учитель может преподавать гитары на начальном и продвинутом уровнях, фортепиано на среднем и начальном уровнях, а также другой учительможет преподавать фортепьяно на всех трех уровнях и играть на гобое у начинающих ... звучит хорошо.


Кстати, стол для игры в бридж также известен как intersect или intersection стол.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...