Por fim, tudo se resume ao uso e à arquitetura.
Arquitetura
O sistema lida com "qualquer esporte"? A idéia que você colocou no seu chapéu de astronauta de arquitetura e construiu um sistema genérico que pode lidar com qualquer tipo futuro de esporte que talvez nem exista hoje?
Nesse caso, obviamente, ter tabelas nomeadas dinamicamente é uma grande dor; portanto, faria sentido ter um esquema que suporte n esportes, se necessário.
Dito isto, tenho um viés muito forte contra essa abordagem: quase sempre é mais trabalho e leva a resultados mais ruins. Criar uma interface do usuário, esquema etc. para cada esporte resultará em melhor experiência do usuário e mais fácil manutenção do código, mesmo que isso signifique uma quantidade superficial de duplicação (como evitar / minimizar isso é uma pergunta à parte).
Como você lida com jogadores que praticam vários esportes? Eles recebem duas entradas (por exemplo, você trata como pessoas diferentes) ou você está tentando fazer algo específico com elas?
Usar
Então, vamos supor que você não pratica esportes dinamicamente (por exemplo, se alguém quiser adicionar um novo esporte, é necessário um esforço de desenvolvimento para adicioná-lo).
Existe um momento em que você exibe jogadores (ou qualquer outro objeto que você mencionou) de mais de um esporte por vez?
Eu pude ver isso em uma função de pesquisa, na qual era possível pesquisar pelo nome do jogador ou da equipe (independentemente do esporte), mas além disso, não consigo imaginar muitos casos de uso.
Se você nunca precisar fazer isso, sua abordagem será perfeitamente adequada. Você pode parar de ler aqui.
Esquemas Alternativos
Visualizações
Sou fã do KISS. Em mais de 15 anos de desenvolvimento de software, continuo voltando à filosofia "construir a coisa mais simples que funciona".
Portanto, minha reação inicial, assumindo que uma função de pesquisa entre esportes é realmente o único caso de uso, é criar visualizações:
SELECT PlayerName, 'NFL' as [Sport], TeamName FROM NFL_Players JOIN NFL_Teams ...
UNION
SELECT PlayerName, 'NHL' as [Sport], TeamName FROM NHL_Players JOIN NHL_Teams ...
UNION ....
Obviamente, se você adicionar um novo esporte, precisará adicionar à exibição. Também pode ser útil incluir outras informações comuns, mas realmente depende do que precisa ser mostrado.
Eu tentaria manter todo o material específico do esporte na definição de visualização, para que o código de pesquisa não precise ter muito ou nenhum código específico (além de talvez saber como vincular ao /nhl/players/player-name
vs/nfl/...
ou como seu aplicativo faz isso).
Herança de Tabela
A herança de tabela pode funcionar, mas é bastante complexa. Não tenho muita experiência com isso e, de fato, acho que toda vez que me envolvo em avaliá-lo, acabamos fazendo algo mais simples (como sugeri aqui).
Então, pessoalmente, ainda não descobri por que isso seria útil, mas talvez haja um caso de uso convincente (que eu não conheça) que justifique a complexidade (por exemplo, a herança da tabela resolve o caso de uso melhor do que qualquer outra solução) .
Tabelas separadas para atributos específicos do esporte
Você pode players
criar uma única tabela que possua atributos comuns a todos os jogadores de todos os esportes e, em seguida, outro conjunto de tabelas comonhl_players_details
essa contém um playerId e colunas com informações adicionais sobre o jogador. Se houver muitos atributos comuns ou você tiver muitos usos de "todos os jogadores de todos os esportes", isso poderá fazer sentido.
Pares de valores-chave para atributos específicos do esporte
Abordagem completamente alternativa: ter uma players
mesa (mais uma vez, com atributos comuns como nome) e, em seguida, uma player_data
tabela que tem PlayerId
, Sport
, Attribute
, Value
. Os nomes dos atributos inseridos seriam específicos do esporte. Isso permite que você adicione essencialmente novos atributos sem modificar o esquema (seu código ainda precisará saber para carregá-los / exibi-los, é claro). A desvantagem é que você perde alguma integridade: o valor normalmente seria um campo de cadeia de caracteres, portanto, o código do seu aplicativo precisaria ser resiliente e lidar com possíveis falhas na conversão da cadeia de caracteresvalue
de em um tipo de dados específico (como número inteiro).
É claro que esse conceito pode se aplicar a equipes, jogos etc.
Você está falando sobre normalização do banco de dados . Você pode ficar aliviado ao saber que não existe um modelo de dados perfeito e que mais normalização nem sempre é melhor. A normalização pode impor custos em termos de clareza do modelo de dados e desempenho do banco de dados. Portanto, o melhor modelo para selecionar dependerá dos seus requisitos de uso.
Aparentemente, seus exemplos parecem bastante semelhantes em conceito (X_Game vs Y_Game e X_Team vs Y_Team) para que a sobrecarga extra de algumas colunas não pareça irracional. Dito isto, se cada esporte adicionar várias dúzias de colunas extras à mesa, seria realmente complicado.
Nesse caso, você pode considerar um modelo híbrido, no qual os dados comuns são mantidos em uma tabela central, mas os dados específicos do esporte são mantidos em uma estrutura de dados vinculada. Algo como:
fonte