Борьба с модельными отношениями - PullRequest
3 голосов
/ 16 февраля 2010

Мне трудно наладить отношения с несколькими моделями в моем проекте.

Модели: группа, музыкант, инструмент

В группах есть несколько музыкантов

У музыкантов есть несколько групп и несколько инструментов

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

В таблицах я собирался добавить инструмент_id к таблице ссылок band_musicians, но мне нужен музыкант, чтобы иметь возможность иметь несколько инструментовдля группы, так что я подумал, что нужно будет перейти в таблицу musicians_instruments.

Как лучше всего установить отношения с этими моделями?

Спасибо за ваше время!

Ответы [ 4 ]

1 голос
/ 16 февраля 2010

someoneinomaha Может быть, вам нужна четвертая модель, которая охватит и объединит все ее дочерние объекты, например, называется как 'Mus Model' (или как вы хотите) и имеет несколько методов, таких как:

  • get_bands ()
  • get_instruments ()
  • get_musicians ()
  • get_instruments_by_musician ()
  • get_musicians_by_band ()
  • get_instruments_by_band ()
  • get band_by_musician () и так далее ... Он предоставит вам необходимые данные и не будет тормозить отношения сущностей, imho.
1 голос
/ 17 февраля 2010

Музыканты будут иметь отношения один ко многим как с группами, так и с инструментами. Поэтому создайте свою таблицу музыкантов и добавьте в нее всю информацию, относящуюся к самим музыкантам.

Создайте таблицу инструментов для хранения информации об инструментах и ​​сделайте то же самое для полос. Это позаботится обо всех ваших индивидуальных вещах.

Затем создайте что-то вроде таблицы 'band_assignments', в которой просто есть идентификатор группы и идентификатор музыканта, и связывает их вместе. Создайте таблицу 'instrument_assignment', чтобы сделать то же самое.

Теперь, когда вы отправляете запрос музыканту, вы можете присоединиться ко всем этим таблицам слева, чтобы получить необходимые данные или выборочно объединить их только на инструментах, только по группам, или отсортировать по «дате присоединения» и ограничить, чтобы получить последнюю группу, которую они присоединился или последний инструмент, который они изучили.

В основном 5 таблиц должны охватывать все это.

musicians  (musician_id, first_name, last_name)
bands  (band_id, name)
instruments  (instrument_id, name)
band_instument_assignments  (musician_id, band_id, instrument_id, date_played)

Как вы можете видеть в отредактированной версии выше, у вас будет несколько строк в таблице 'band_instrument_assignments' - по одной для каждого инструмента, который каждый пользователь играл в каждой группе. Вам нужно будет использовать некоторые предложения GROUP BY и LIMIT, чтобы получить нужные вам данные, но это должно работать для вас.

1 голос
/ 16 февраля 2010

См:

Как обрабатывать отношения «многие ко многим» с PHP и MySQL

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

0 голосов
/ 03 марта 2010

Возможно, я немного опоздал на вечеринку здесь, и я не эксперт по базам данных, но я обнаружил, что создание вашей схемы БД очень помогает. Просто сделайте квадраты и заполните имена таблиц и столбцы, затем нарисуйте стрелки, чтобы определить ваши отношения, и вам должно быть намного понятнее, как вы должны структурировать вещи и нужно ли вам добавлять таблицу для объединения двух других таблиц.

Если ничего не помогает, просто скопируйте схему с databaseanswers.org. Я уверен, что есть один, который, вероятно, поможет вам.

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