Подтвердить что ты не робот

Лучшая схема для представления баскетбола NCAA

Какая лучшая схема базы данных представляет собой баскетбольный кронштейн NCAA? Вот ссылка, если вы не знакомы: http://www.cbssports.com/collegebasketball/mayhem/brackets/viewable_men

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

В духе мартовского безумия я думал, что это будет хороший вопрос. Здесь есть некоторые очевидные ответы, и главная цель этого вопроса - увидеть все различные способы ответа на него. Какой способ лучше всего может быть субъективным для используемого вами языка или того, как именно вы работаете с ним, но старайтесь сохранять ответы db агностиками, языковыми агностиками и довольно высоким уровнем. Если у кого-нибудь есть предложения по более эффективному формулированию этого вопроса или лучшему способу его определения, дайте мне знать в комментариях.

4b9b3361

Ответ 1

Для РСУБД я считаю, что самый простой подход, который достаточно гибкий, чтобы удовлетворить большинство ситуаций, заключается в следующем:

  • Команды имеют [team-id (PK)], [name], [region-id (FK до Регионы)], [начальное семя ]. У вас будет одна запись для каждой команды. (Таблица регионов представляет собой тривиальную таблицу кодов с четырьмя записями, по одному для каждой области NCAA и не указана здесь.)

  • Участники имеют [идентификатор игры (от FK до Игры)], [team-id (FK до Команды)], [оценка (обнуление)], [результат]. [score] имеет значение nullable, чтобы отразить, что команда может потерять силу. Обычно у вас будет два участника за игру.

  • Игры имеют [игровой идентификатор (PK)], [дата], [местоположение]. Чтобы узнать, какие команды играли в игре, найдите соответствующий идентификатор игры в таблице "Участники". (Помните, что может быть более двух команд, если кто-то бросил или был дисквалифицирован.)

Чтобы настроить начальную скобку, сопоставьте соответствующие семена друг с другом. Как игры играют, обратите внимание, какая команда имеет результат = Победитель для конкретной игры; эта команда сопоставляется с победителем другой игры. Заполните скобу, пока не осталось больше команд-победителей.

Ответ 2

Естественным наклоном является просмотр скобки в порядке игры. Вы читаете традиционную диаграмму снаружи. Но подумайте об этом по-другому. Каждая игра проводится между двумя командами. Один выигрывает, другой проигрывает.

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

Таким образом, вы можете заметить, что в каждой игре есть две "дочерние игры", которые предшествуют ей, и определить, кто стоит в этой игре. Это похоже на двоичное дерево: каждый корень node имеет не более двух дочерних узлов. Если вы знаете, кто выигрывает каждую игру, вы можете легко определить команды в "родительских" играх.

Итак, чтобы создать базу данных для моделирования, вам понадобятся только два объекта: Team и Game. Каждый Game имеет два внешних ключа, которые относятся к другим Game s. Имена не имеют значения, но мы будем моделировать их как отдельные ключи для обеспечения требования, чтобы каждая игра имела не более двух предыдущих игр. Позвольте называть их leftGame и rightGame, чтобы сохранить номенклатуру бинарного дерева. Точно так же мы должны иметь ключ под названием parentGame, который отслеживает обратную связь.

Кроме того, как я уже отмечал ранее, вы можете легко определить команды, которые сталкиваются в каждой игре, посмотрев, кто выиграл две предыдущие игры. Поэтому вам действительно нужно только отслеживать победителя каждой игры. Итак, дайте Game entity a 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

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

Ответ 3

Поскольку вы не указали RDBMS, я немного поменяю и займусь подходом CouchDB, так как я читал об этом в эти выходные. Здесь структура документа, с которой я столкнулся, представляет собой игру.

{
  "round" : 1, //The final would be round 5, and I guess Alabama St. vs. Morehead would be 0
  "location" : "Dayton, OH",
  "division": "South",
  "teams" : ["UNC", "Radford"]  //A feature of Couch is that fields like teams don't need a fixed nuber of columns.
  "winner" : "UNC"  //Showing my bias
}

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

Ответ 4

Я создал небольшую систему со следующими таблицами:

Игры: GameId, TournId, RoundId, Sequence, Date, VisitorId, VisitorScore, HomeId, HomeScore, WinnerId, WinnerGameId, WinnerHome (бит)

Прогнозы: PredId, UserId, GameId, PredVisitorId, PredHomeId, PredWinnerId

Раунды: RoundId, TournId, RoundNum, Heading1, Heading2

Команды: TeamId, TournId, TeamName, Seed, MoreInfo, Url

Турниры: TournId, TournDesc

Пользователи: TournId, UserName

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

Ответ 5

4 таблицы:

Команда (команда, регион, семя)

Пользователь (UserId, Email, blablabla)

Скобка (BracketId, UserId, Points)

Выберите (BracketId, GameId, Team, Points)

Каждая скобка, которую подает человек, будет иметь 63 строки в таблице Pick.
После каждой игры вы будете обновлять таблицу выбора, чтобы набрать индивидуальные подборки. Поле очков в этой таблице будет равно нулю, если игра еще не сыграна, 0 для неправильного выбора или положительного числа для правильного выбора. GameId - это всего лишь ключ, определяющий, где в этой пользовательской скобке этот выбор идет (например: East_Round2_Game2, FinalFour_Game1).

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

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

Ответ 6

Предлагаемая модель

Предлагаемая схема ER http://img257.imageshack.us/img257/1464/ncaaer.jpg

Таблица команд

Все, что нам нужно знать о команде, - это имя и семя. Поэтому для хранения начального значения нам нужна таблица "Команда". Единственным кандидатом является имя команды, поэтому мы будем использовать это как основное, чтобы все было просто. Имена команд NCAA вряд ли будут меняться в течение одного турнира или содержать дубликаты, поэтому он должен быть адекватным ключом.

Таблица соответствия

Таблица "MatchUp" может использоваться для объединения команд в каждый из совпадений. Внешние ключи (FK1, FK2) для "Команды" гарантируют, что команды существуют, а первичный ключ по этим значениям гарантирует, что команды будут согласованы друг с другом только один раз.

Внешний ключ (FK4) в таблице "Команда" из таблицы "MatchUp" будет записывать победителя. Логически победитель должен быть одной из двух команд, участвующих в матче. Ограничение проверки на первичный ключ может обеспечить это.

Как только результат матча будет определен, семя Виктора может быть извлечено из таблицы команд, чтобы сравнить с другим Виктором, чтобы определить последующие совпадения. После этого FK (FK3) к полученному совпадению может быть записано в определяющие совпадения, чтобы отобразить ход турнира (хотя эти данные, вероятно, могут быть получены в любое время).

Таблица игр

Я также смоделировал игры каждого матча. Игра идентифицируется совпадением, это часть и порядковый номер, основанный на порядке, в котором он имел место во время матча. Игры имеют победителя из таблицы команд (FK2). Оценка также может быть записана в этой таблице.

Ответ 7

Отслеживание большого количества различных предсказаний с помощью скобок: вы можете использовать 67 бит для отслеживания результатов каждой игры. (т.е. каждая из шестидесяти семи игр, играемых в турнире, представлена ​​немного, 1 = "команда A выигрывает", 0 = "команда B выигрывает" ). Чтобы отобразить любой данный кронштейн, вы можете использовать довольно простую функцию для сопоставления 67 бит с пользовательским интерфейсом. Функция знает имена команд и их начальное местоположение, а затем отслеживает их перемещение через скобку, когда она отслеживает "битовую".

Ответ 8

Я использую ту же схему для всех моих баз данных.

t
--------
1 guid PK
2 guid FK
3 bit

Затем в моем коде:

select [2],[3] from t where [1] = @1

@1 - это идентификатор данных, которые я получаю. Тогда, если [2] не является нулевым, я выбираю снова, устанавливая от 1 до [2].

Это позволяет легко моделировать ситуацию, которую вы опубликовали.