Четырех- или пятисторонние Табличные Отношения в Laravel - PullRequest
2 голосов
/ 29 апреля 2019

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

Я управляю веб-сайтом дляЛегкая атлетика средней школы.У меня есть 5 таблиц:

  1. школы - Автономный список всех школ в штате.
  2. спорт - Автономный список всех видов спорта, разрешенных государством.
  3. сезоны- Автономный список сезонов (один сезон на учебный год).
  4. Лиги - Автономный список лиг / конференций.
  5. league_divisions - Список дивизионов для лиг, которые имеют несколько дивизионов (например, «Большая десятка»).Восток "и" Большая Десять Запад "), где league = parent и league_divisions = child.Примечание. Лига будет иметь дочерние записи в этой таблице только в том случае, если в ней есть подразделения;В большинстве спортивных конференций / лиг старших классов нет разделений, и поэтому в этой таблице не было бы соответствующей записи.

Время от времени школы меняют лиги или могут менять, какое подразделение лиги ониявляются частью.(подумайте «школьные лиги»)

Аналогичным образом, школа может начать заниматься новым видом спорта (в школе А в прошлом никогда не было футбола для девочек, но теперь у них есть команда) или прекратить старое (школа В нет.дольше есть футбольная команда).(подумайте "school_sports")

Кроме того, хотя государство может санкционировать 25 видов спорта, сама лига может только санкционировать 10. Мой веб-сайт предназначен для самой Лиги, поэтому мне также нужен способ перечислить, какие виды спорталига санкций.(подумайте "league_sports")

В моей старой (до Laravel) модели данных у меня просто была таблица "school_leagues", в которой хранится информация о том, к какой лиге (и подразделению, если применимо) принадлежала школа для определенного диапазонасезонов (через start_season_id, end_season_id).Кроме того, в HTML я просто жестко закодировал статический список того, какие виды спорта разрешены в лиге, и какие команды должны появиться в турнирной таблице этого вида спорта.

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

Кроме того, вместо использования start_season_id и end_season_id (где end_season_id = NULL, если отношениевсе еще действует), заставит ли меня конвенция Laravel иметь 1 запись на школу на спорт в сезон на лигу / дивизион?(Это напрямую присоединится к season_id, а не к столбцам start / end_season_id)

Любая помощь приветствуется!

Я мог бы просто использовать 3 таблицы отношений: school_leagues, school_sports и league_sports, ивсе присоединяются к сезону либо по сезону (1 запись в год), либо по началу / окончанию_сезона.

ИЛИ у меня будет 1 основная таблица, объединяющая school_id, sport_id, season_id, league_id и (необязательно) league_division_id.В каждом экземпляре будет 1 запись, поэтому каждый год я буду генерировать новую группу записей.

1 Ответ

0 голосов
/ 29 апреля 2019

Laravel / Eloquent имеет исправную схему отношений «многие ко многим». https://laravel.com/docs/5.8/eloquent-relationships#many-to-many В вашем приложении есть несколько отношений «многие ко многим», например schools >----< sports. Eloquent использует таблицу соединений (которая называется что-то вроде schools_sports для представления этого в СУБД.

Чтобы справиться со сложностью, вам, вероятно, понадобится новая сущность в вашей структуре базы данных. Давайте назовем это teamseason. Есть один из них для каждой школы, спорта, сезона и лиги. Он относится к одному из этих объектов и может иметь такие атрибуты, как won, lost, captain и другие данные, относящиеся к команде и сезону.

Например,

  • Средняя школа Stuyvesant (школа) имела
  • Прецизионная пневматическая (спортивная) команда
  • Весной 2018 года (сезон) играет в
  • Нью-Йоркская лига Geeksports (лига)
  • Они выиграли 10 и проиграли 3 матчей, а капитаном был Мертвый Робинсон (атрибуты)

Вам понадобится другая из этих сущностей для команды Spring 2019.

Таблица для этого может выглядеть так:

teamseason_id  PK
school_id      FK to school.school_id
sport_id       FK to sport.sport_id
season_id      FK to season.season_id
league_id      FK to league.league_id
won            int
lost           int
captain        varchar(128)

Я бы бросил в делении, но я не понимаю структуру.

Похоже, это может быть таблица соединения с четырьмя путями, но это не так. Я добавил атрибуты won / lost / captain, чтобы подчеркнуть, что это его собственная сущность.

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

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