Je joue régulièrement à un jeu 2c2 avec 12 amis et je veux une base de données pour garder une trace des joueurs, des équipes, des scores et des jeux, avec l'intention de créer un système de classement.
Depuis que nous changeons régulièrement d'équipe, j'ai créé des tables players
, teams
et games
où les jeux ont deux équipes (équipe1 et équipe2) et les équipes sont composées de deux joueurs (joueur1 et joueur2).
Cela pose pas mal de problèmes - par exemple si je choisis deux joueurs (appelons-les A et B ) pour jouer ensemble, je dois vérifier s'il existe déjà une équipe où Player1 est A et Player2 est B ou Player1 est B et Player2 est un.
Les colonnes games
et wins
sont présentes à la fois dans le players
tableau et dans le teams
tableau - mais c'est parce que je veux voir à la fois le nombre de parties gagnées par les joueurs, mais aussi la compatibilité du joueur dans différentes équipes (la fréquence à laquelle un joueur gagne lorsqu'il est associé à un autre joueur spécifique).
- Tableau de bord de classement (je vais probablement utiliser le système de notation Elo )
- Une page de statistiques pour chaque joueur avec classement, victoires, jeux, statistiques de jeux récents et avec quels joueurs il est le plus compatible.
Je soupçonne fortement qu'une grande partie de cela viole certains des principes de normalisation de la base de données, et j'aimerais quelques suggestions sur la façon de mettre en œuvre la conception de ma base de données.
la source
Réponses:
Il y a deux problèmes que je vois avec votre schéma actuel, l'un est le problème d'avoir à vérifier deux champs dans une table pour déterminer si une clé composée est effectivement un doublon, et, certaines données agrégées sont regroupées dans les tables individuelles pour être séparées entités (gagne, en particulier, mais aussi potentiellement la cote d'un joueur).
Pour le premier problème, il n'y a pas d'astuces dans la base de données pour que l'un ou l'autre champ d'une clé composée soit traité de la manière OU que vous recherchez, mais si votre base de données la prend en charge, vous pouvez créer une fonction
getPlayerTeams(player_id)
pour encapsuler la requête.(Vous pouvez également créer une vue avec le team_thumbprint calculé comme un hachage des identifiants des joueurs triés, de sorte que tout combo des deux mêmes personnes entraîne toujours la même empreinte numérique, mais cela pourrait être un peu beaucoup ici).
En ce qui concerne la normalisation, envisagez de séparer les entités des résultats qui se produisent en utilisant un
team_result
tableau pour suivre tous les résultats pour une équipe donnée. Une normalisation un peu plus extrême nécessiterait également uneplayer_rating_hist
table, contenant tous les changements de classement pour un joueur. Leur note actuelle est simplement celle avec la date la plus récente. Une vue de joueur peut également être utilisée pour contenir la valeur la plus récente pour une interrogation facile.Schéma proposé (désolé pas de diagramme):
Requêtes:
Cette structure permet de séparer les entités «de base» (joueurs et équipes) du «contenu» résultant du fonctionnement du système au fil du temps, et signifie que vous ne mettez pas constamment à jour l'une des tables de base avec la note actuelle, # de gains, etc. Ce sont des valeurs dérivées et devraient être récupérées en obtenant la note la plus récente, la note moyenne,
COUNT
des gains ou des pertes, etc. (même s'il ne s'agissait que d'un ensemble de tables distinct dans la même base de données) pour une analyse plus facile.la source