Melhor maneira de criar banco de dados de torneios

13

Estou criando uma página da web para fazer apostas em todos os jogos do próximo torneio de futebol da Euro 2012. Precisa de ajuda para decidir qual abordagem adotar para a fase eliminatória.

Eu criei uma maquete abaixo, com a qual estou bastante satisfeito em armazenar os resultados de todas as partidas "conhecidas" da fase de grupos. Esse design facilita a verificação de se um usuário fez uma aposta correta ou não.

Mas qual é a melhor maneira de armazenar as quartas e meias-finais? Essas partidas dependem do resultado na fase de grupos.

Uma abordagem em que pensei foi adicionar TODAS as partidas à matchestabela, mas atribuir diferentes variáveis ​​ou identificadores às equipes da casa / fora das partidas na fase eliminatória. E depois tenha outra tabela com os identificadores mapeados para as equipes ... Isso pode funcionar, mas não parece certo.

Design básico de banco de dados

hampusohlsson
fonte
Você está decidido a usar o MySQL ou está aberto a alternativas?
Jack diz que tente topanswers.xyz 15/11
Muito bem resolvido. Há alguma vantagem / desvantagem no MySQL que eu deveria estar ciente?
hampusohlsson
As restrições de verificação não são aplicadas. Geralmente, há menos opções para impor restrições ao DRI - mas se isso importa para você depende muito do seu aplicativo.
Fico
Obrigado, mas acho que não usaria restrições de qualquer maneira, pois não estou muito familiarizado com isso. Irá validar todos os dados no meu aplicativo antes de ser enviado para o DB, mantendo-o simples
hampusohlsson
Bom Bom. É mais simples do DB, claro, mas isso é toda uma outra conversa ;)
Jack diz tentar topanswers.xyz

Respostas:

3

Eu começaria tentando consertar todas as informações predeterminadas no próprio modelo, incluindo

  • datas / locais
  • estrutura (isto é, grupos / fases eliminatórias)
  • regras (pontuação de pontos, regras de desempate)

Algumas dessas informações serão dados em tabelas, outras serão lógicas codificadas em visualizações.

Algo assim talvez:

  • team (id da equipe, enumeração do código do grupo ('A', 'B', 'C', 'D'), nome)
  • match (match_id, kickoff_at)
  • match_match (match_id, team_id_home, team_id_away, group_code)
  • knockout_match (match_id, enumeração knockout_code ('Q1', 'Q2', 'Q3', 'Q4', 'S1', 'S2', 'F')
  • resultado (match_id, score_home, score_away)

Informações como as equipes jogam no primeiro trimestre nunca precisam ser armazenadas diretamente, porque podem ser calculadas a partir dos resultados da fase de grupos. As únicas alterações a serem feitas à medida que o torneio avança são inseridas na resulttabela.

Jack diz que tenta topanswers.xyz
fonte
3

Eu acho que usar o ID da equipe é o caminho certo a seguir. Outro nível de abstração para todas as rodadas finais adiciona complexidade desnecessária para outros benefícios que não sejam o pré-carregamento da tabela de correspondências com dados.

A estrutura de dados parece bastante sólida para suportar isso. As quartas e meias-finais precisariam ser adicionadas à tabela de correspondências assim que os resultados da correspondência inicial fossem entregues. Se as correspondências forem atribuídas aleatoriamente, esta é uma operação manual, no entanto, se elas estiverem em uma ordem específica ...

   A
match 1 -----+
   B         A
          match 5 -----+
   C         C         |
match 2 -----+         |
   D                   A
                    match 7
   E                   F
match 3 -----+         |
   F         F         |
          match 6 -----+
   G         G
match 4 -----+
   H

... então isso poderia ser feito com uma consulta. Novamente, a complexidade da consulta pode não valer o esforço, dependendo do número de equipes

Tevo D
fonte
1

É uma boa ideia armazenar todas as correspondências na tabela "correspondências". No entanto, eu adicionaria um campo adicional "ranking" a ele, porque mais tarde você precisará criar uma árvore binária para consultar com eficiência a tabela na memória. É um problema clássico de algoritmo de classificação e você pode procurar no google pelo torneio de código cinza para obter mais informações ou procurar no meu histórico de stackoverflow. Basicamente, um torneio é uma árvore binária. Aqui está um bom artigo sobre códigos cinza: http://villemin.gerard.free.fr/Wwwgvmm/Numerati/CodeGray.htm . Infelizmente é francês. Aqui está como gerar uma árvore binária a partir da classificação: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/229068 .

Gigamegs
fonte