Я создаю веб-страницу для размещения ставок на все матчи предстоящего футбольного турнира Евро-2012. Нужна помощь, чтобы решить, какой подход выбрать для фазы нокаута.
Ниже я создал макет, которым я очень доволен, когда дело доходит до хранения результатов всех «известных» матчей группового этапа. Такой дизайн позволяет легко проверить, правильно ли пользователь сделал ставку или нет.
Но как лучше всего сохранить четвертьфинал и полуфинал? Эти матчи зависят от результата на групповом этапе.
Один из подходов, о котором я подумал, - это добавить ВСЕ совпадения в matches
таблицу, но назначить разные переменные или идентификаторы командам хозяев / гостей для матчей на этапе выбывания. А затем есть какая-то другая таблица с этими идентификаторами, сопоставленными с командами ... Это может сработать, но не будет правильным.
источник
Ответы:
Я бы начал с попытки исправить всю предопределенную информацию в самой модели, включая
Часть этой информации будет представлять собой данные в таблицах, а часть будет кодифицированной логикой в представлениях.
Возможно, что-то вроде этого:
Такую информацию, какую играют команды в первом квартале, не нужно хранить напрямую, потому что она может быть рассчитана по результатам группового этапа. В только изменения , чтобы сделать , как турнир прогрессирует являются вставляет в
result
таблицу.источник
Я думаю, что использование идентификатора команды - правильный путь. Другой уровень абстракции для всех финальных раундов просто добавляет ненужную сложность для небольшого преимущества, кроме предварительной загрузки таблицы соответствий данными.
Структура данных выглядит довольно солидно, чтобы поддержать это. Четвертьфинал и полуфинал должны быть добавлены в таблицу совпадений после того, как будут получены результаты первоначального совпадения. Если совпадения назначаются случайным образом, то это ручная операция, если они находятся в определенном порядке ...
... тогда это может быть сделано с помощью запроса. Опять же, сложность запроса может не стоить усилий, в зависимости от количества команд
источник
Рекомендуется хранить все совпадения в таблице «совпадения». Однако я бы добавил к нему дополнительное поле «ранжирование», потому что позже оно понадобится вам для создания двоичного дерева для эффективного запроса таблицы в памяти. Это классическая проблема с алгоритмом ранжирования, и вы можете найти дополнительную информацию в турнире «Серый код» или посмотреть мою историю переполнения стека. По сути, турнир - это бинарное дерево. Вот хорошая статья о серых кодах: http://villemin.gerard.free.fr/Wwwgvmm/Numerati/CodeGray.htm . К сожалению, это французский. Вот как сгенерировать двоичное дерево из ранжирования: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/229068 .
источник