2010-02-16 3 views
3

Мне сложно спланировать отношения с несколькими моделями в моем проекте.Борьба с модельными отношениями

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

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

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

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

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

Каков наилучший способ установления отношений с этими моделями?

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

+0

Может ли музыкант быть в нескольких группах? – Andrew

+4

Я борюсь с вступлением в отношения с моделью тоже ... –

+0

:) приятно. Да, музыкант может быть в нескольких группах. – someoneinomaha

ответ

1

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

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

Затем создайте что-то вроде таблицы «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 для получения требуемых данных, но они должны работать на вас.

+0

Что-то, что я хотел бы сделать, что я не могу понять, как это будет работать в этой структуре, можно сказать, что для группы x, y музыкант играл в a и b, но для группы z она играла c инструментом. Мне кажется, что мне нужно добавить еще одну структуру, чтобы справиться с этим ... если только я не понимаю, что вы здесь нарисовали. Спасибо! – someoneinomaha

+0

@someoneinomaha - Проверьте новую отредактированную структуру таблицы. Я добавил комментарии ниже, чтобы объяснить, как это будет работать. Возможно, теперь будет немного проще в использовании. – Shane

+0

Право на ... спасибо за вашу помощь в этом. Очень признателен! – someoneinomaha

1

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

  • get_bands()
  • get_instruments()
  • get_musicians()
  • get_instruments_by_musician()
  • get_musicians_by_band ()
  • get_instruments_by_band()
  • получить band_by_musician() и т. Д. Он предоставит вам необходимые данные и не будет отношения тормозных сущностей, имхо.
0

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

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

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