Естественная склонность - смотреть на скобки в том порядке, в котором играются. Вы читаете традиционную схему снаружи в. Но давайте подумаем об этом наоборот. Каждая игра проводится между двумя командами. Один выигрывает, другой проигрывает.
Теперь, это нечто большее, чем просто это. Победители определенной пары игр сталкиваются друг с другом в другой игре. Таким образом, между самими играми есть связь, независимо от того, кто играет в эти игры. То есть команды, которые сталкиваются в каждой игре (кроме первого раунда), являются победителями двух предыдущих игр.
Таким образом, вы можете заметить, что каждая игра имеет две «дочерние игры», которые предшествуют ей, и определяют, кто будет противостоять в этой игре. Это похоже на двоичное дерево: каждый корневой узел имеет не более двух дочерних узлов. Если вы знаете, кто выигрывает в каждой игре, вы можете легко определить команды в «родительских» играх.
Итак, чтобы создать базу данных для моделирования, вам действительно нужны только две сущности: Team
и Game
. Каждый Game
имеет два внешних ключа, которые относятся к другим Game
с. Имена не имеют значения, но мы бы смоделировали их как отдельные ключи, чтобы обеспечить требование, чтобы в каждой игре было не более двух предыдущих игр. Давайте назовем их leftGame
и rightGame
, чтобы соответствовать номенклатуре двоичного дерева. Точно так же у нас должен быть ключ с именем parentGame
, который отслеживает обратную связь.
Кроме того, как я уже отмечал ранее, вы можете легко определить команды, которые сталкиваются в каждой игре, посмотрев, кто выиграл в двух предыдущих играх. Так что вам действительно нужно отслеживать победителя в каждой игре. Итак, присвойте сущности Game
внешний ключ winner
для таблицы Team
.
Теперь есть небольшая проблема с посевом кронштейна. То есть моделирование матчей для игр первого раунда. Вы можете смоделировать это, имея Game
для каждой команды в общем соревновании, где эта команда является winner
и не имеет предыдущих игр.
Итак, общая схема будет:
Game:
winner: Team
leftGame: Game
rightGame: Game
parentGame: Game
other attributes as you see fit
Team:
name
other attributes as you see fit
Конечно, вы добавили бы всю другую информацию, которую вы хотели бы к сущностям: местоположение, результаты, результат (в случае, если игра была выиграна в результате поражения или какого-либо другого необычного условия).