SQL: база данных дизайна, отражающая дизайн турнира - PullRequest
1 голос
/ 04 марта 2011

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

Я думал о том, чтобы иметь таблицу с именем Matches, которая имеет 4 столбца:

  • ID => Идентификатор
  • Team1ID => Ссылка на ID в командах
  • Team2ID => Ссылка на ID в командах
  • WinnerID => То же значение, что и Team1ID или Team2ID

WinnerID затем будет иметь SQL-триггер, который проверяет, совпадает ли его значение с Team1ID или Team2ID ... Если нет, то откат транзакции будет выполнен.

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

Team myTeam1 = ... Get team1 ...
Team myTeam2 = ... Get team2 ...

Match myMatch = new Match { Team1 = myteam1, Team2 = myteam2; }

, что неверно, поскольку сущность Match определена как "дочерняя сущность" для сущности Team и должна добавляться только через сущность Team.

Любые предложения о том, как правильно спроектировать мою базу данных, чтобы соответствовать моим потребностям?

Ответы [ 2 ]

1 голос
/ 04 марта 2011

Что касается триггера, я бы просто использовал некоторые ограничения.

(Team1ID <> Team2ID)
AND
(WinnerID IS NULL OR Team1ID = WinnerID OR Team2ID = WinnerID)

вероятно, все в одном ограничении.

Что касается модели предметной области, я бы не подумал, что вы добавляете матч через команду, но, возможно, через экземпляр турнира: Match = Tournament.NewMatch (Team1, Team2);

Вероятно, будут правила турниров более высокого порядка, такие как раунды, выбывания и т. Д.

Поскольку кажется, что ваши Команды знают свой Кубок, то для создания Команды или извлечения ее из базы данных она будет проходить через Cup: Cup.NewTeam (TeamName) или Cup.LoadTeam (TeamID). Тогда это будет иметь смысл и для Cup.NewMatch, поскольку вам определенно не захочется проводить матч между командами в разных кубках.

0 голосов
/ 04 марта 2011

Как ваша модель будет хранить ничью?:)

Почему бы не сохранить счет в строке матча и просто определить победителя на основании этого?

Id, Team1Id, Team2Id, Team1PointsScored, Team2PointsScored

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