J'ai actuellement les trois tableaux suivants dans une base de données de football :
équipes(nom) saison(nom, début, fin) jeu (identifiant, date, saison, équipe à domicile, équipe à l'extérieur, HomeTeamScore, AwayTeamScore) (l'équipe locale, l'équipe extérieure et la saison sont des clés étrangères)
Maintenant, je souhaite avoir un nouveau tableau qui enregistre les buts marqués et les buts encaissés par chaque équipe, ainsi que les points qu'ils ont gagnés au cours de chaque saison (un point pour chaque match nul, trois pour chaque victoire). Cela rendra le classement facile à obtenir.
J'ai envisagé de créer un tableau comme celui-ci :
stats (saison, équipe, buts marqués, buts encaissés, points)
Ensuite, chaque fois qu'une nouvelle correspondance est insérée, je mets également à jour ce tableau. Ce tableau contiendra une ligne pour chaque combinaison équipe+saison. Je ne sais pas si c'est la meilleure solution car je sais que j'introduis de la redondance, mais comme ces informations doivent être calculées fréquemment, j'ai pensé que cela pourrait être utile. Je souhaite créer un déclencheur pour mettre à jour ces informations, mais je ne sais pas trop comment faire : selon l'équipe qui participe au match, je dois mettre à jour deux lignes dans le tableau des statistiques, et selon qu'elles le soient à la maison ou à l'extérieur, j'ai besoin de les mettre à jour avec des valeurs différentes.
Idéalement, ce déclencheur devrait créer une entrée dans cette nouvelle table si l'équipe n'a pas inséré d'enregistrement pour la saison à laquelle appartient le jeu, mais je ne suis même pas sûr qu'une telle condition soit possible dans MySQL. Je sais que je n'ai fourni aucun test que j'ai effectué, mais c'est parce que je n'ai vraiment pas pu trouver de demande similaire en ligne (ou plus généralement, une demande permettant d'interroger facilement les informations dont j'ai besoin).
De plus, je suis ouvert à de meilleures idées sur la façon de gérer cette situation.
Je pense que vous devriez envisager une structure comme celle-ci :
Cette structure n’est pas non plus optimale. À mon avis, vous pourriez opter pour une meilleure structure :
Le tableau Goal sera utilisé pour enregistrer chaque but et vous pourrez ensuite construire des résultats de match à partir de celui-ci, en évitant l'utilisation des champs "HomeTeamScore" et "AwayTeamScore".
En ce qui concerne le tableau des statistiques, vous devez savoir qui a gagné les points, alors restons fidèles à notre structure de table finale :
La valeur du champ d'état dans les correspondances peut être : ['1','X','2']
De cette façon, vous pouvez facilement avoir tout pour calculer vos statistiques, par exemple pour l'équipe avec l'ID 12 :
Vous pouvez l'utiliser comme point de départ pour créer une requête légèrement plus complexe en utilisant les fonctions group by et group pour calculer les statistiques de l'équipe. Une fois que vous avez créé avec succès une requête comme celle-ci, je vous recommande d'utiliserViews
D’ailleurs, ces requêtes que vous souhaitez exécuter ne sont pas lourdes, vous n’avez pas forcément besoin de triggers, pensez d’abord au design de la base de données !
Un moyen beaucoup plus simple que d'utiliser des déclencheurs pour conserver des données redondantes est d'utiliser une vue, il s'agit simplement d'une somme syndicale de base :