Existem várias perguntas/questões aqui, então tentarei abordar cada uma delas.
Todas as interações do torneio devem ser em tempo real/refletidas para muitos usuários.
Para tráfego pequeno a médio em seu site, isso pode não ser um problema. Para tráfego mais pesado, isso rapidamente começará a ser um grande problema.
Considere como exemplo a frequência com que você deseja pesquisar o banco de dados com suas chamadas AJAX. Todo segundo? Então, se você tem 100 pessoas com uma página aberta, você tem 100 chamadas de banco de dados a cada segundo? Você descobrirá que isso matará rapidamente seu banco de dados.
Mesmo que isso seja um pouco fora do tópico, eu recomendo fortemente investigar como armazenar em cache os resultados do torneio com antecedência. Você pode armazenar em cache as estatísticas, etc. e deixá-las expirar ou expirar proativamente, mas definitivamente gaste algum tempo pesquisando.
Estatísticas/resultados em tempo real
Tenha em mente que as junções levam tempo em bancos de dados relacionais. Se você normalizar fortemente a estrutura do seu torneio, obter estatísticas pode ser doloroso. A parte mais difícil de tornar o sistema eficiente serão os agregados e estatísticas de cada torneio.
Ao projetar seu banco de dados/tabelas/visualizações/procedimentos armazenados, tenha em mente o objetivo final - obter estatísticas rapidamente. Isso pode significar não normalizando demais os dados (para evitar muitas junções). Também pode significar prestar muita atenção aos seus tipos de dados - por exemplo, usando bits/shorts/etc. em vez de inteiros.
Como modelar os diferentes tipos de torneio
Não estou familiarizado com modelos de torneios, mas tenho conselhos específicos sobre como modelar. =)
Algumas perguntas que você deve se fazer:
-
Todos os torneios têm campos comuns? Em outras palavras, para um torneio round robin, armazenamos 10 campos. Para um torneio de eliminação única, armazenamos 11 campos. Se eles compartilham os mesmos 10 campos, então eu recomendaria colocar todos os tipos de torneio em uma mesa e então usar um campo tipo_torneio para determinar o tipo de torneio para sua aplicação.
-
Todos os torneios não têm campos comuns? Faça-as mesas separadas - uma por tipo de torneio. Você pode criar uma tabela para dados compartilhados, mas ter tabelas diferentes para informações específicas.
-
Os campos de torneios se distanciarão com o tempo ? Com o tempo, você desejará adicionar campos aos tipos de torneio. Se você prevê que os torneios se tornarão únicos e específicos ao longo do tempo, separe-os. Caso contrário, você acabará com muitos campos com toneladas de valores NULL.
-
Você considerou uma solução NoSQL ? O bom de um armazenamento NoSQL é que ele desnormaliza os dados para que você não tenha junções. Além disso, você pode ter dados heterogêneos (diferentes tipos de dados) na mesma "tabela" ou contêiner. Apenas algo a considerar, porque pode tornar sua vida consideravelmente mais fácil. Confira o MongoDB como um exemplo.