Partage
  • Partager sur Facebook
  • Partager sur Twitter

[MySQL] Base de données jeu de pronostiques

Sujet résolu
19 février 2021 à 13:47:46

Bonjour à tous,

Je débute un projet que j'avais en stock depuis un moment et je me pose des questions sur l'organisation de ma base de données.
Pour le moment mon modèle est assez simple, j'aimerais commencer sur un fonctionnement basique pour ajouter d'éventuelles améliorations par la suite.

J'ai 4 tables pour le moment.

"Utilisateur" pour gérer les différents utilisateurs sur le site.

"Pronostique" qui va contenir les pronostiques effectués par les utilisateurs. Un pronostique = un utilisateur et un utilisateur = N pronostiques.

"Match" qui contient les différents matchs sur lesquels un utilisateur va pouvoir pronostiquer.

"Equipe" qui contient les différentes équipes qui vont pouvoir participer à un match. Il y aura toujours une équipe domicile et une équipe extérieur à chaque match.

Dans ma table "Match" j'ai une info de date de début pour savoir jusqu'à quel moment les utilisateurs vont pouvoir pronostiquer. Et une information résultat pour indiuer le résultat final du match quand celui-ci sera terminé.

Dans la table "Pronostique" j'ai un champ "pronostique" qui va correspondre à l'équipe choisie comme gagnante par l'utilisateur. Ici je ne sais pas comment faire, dois-je stocker, l'ID de l'équipe gagnante ou juste une information domicile/extérieur ?

Et ma dernière interrogation concerne les points gagnés par les utilisateurs. Si on pars du principe que un bon pronostiqu = 1 point, dois-je mettre un champ "nombre_point" dans ma table utilisateur que je vais incrémenter à chaque bon pronostique ?

Dois-je indiquer dans ma table "Pronostique" une indication de résultat du pronostique (gagné/perdu) ou le nombre de point rapporté par ce pronostique ?

C'est un peu ça ma problématique actuelle. Sachant que derrière j'aimerais afficher le nombre de points gagnés à l'utilisateur ainsi qu'un classement.

Merci d'avance pour vos conseils.

  • Partager sur Facebook
  • Partager sur Twitter
19 février 2021 à 14:04:44

Bonjour,

Un même utilisateur peut faire plusieurs pronostics pour le même match ?

brizy a écrit:

Si on pars du principe que un bon pronostiqu = 1 point, dois-je mettre un champ "nombre_point" dans ma table utilisateur que je vais incrémenter à chaque bon pronostique ?

En règle générale, on évite de stocker le résultat d'un calcul dans une colonne pour éviter les problèmes de perte de cohérence si quelque chose bloque la mise à jour de la colonne pour une raison ou une autre ... Une solution plus normalisée cf. ci-après.

brizy a écrit:

Dans la table "Pronostique" j'ai un champ "pronostique" qui va correspondre à l'équipe choisie comme gagnante par l'utilisateur. Ici je ne sais pas comment faire, dois-je stocker, l'ID de l'équipe gagnante ou juste une information domicile/extérieur ?

Ce serait clairement mieux de stocker l'id de l'équipe (clé étrangère). De même dans la table match pour déterminer le vainqueur ... Ainsi si il y a égalité entre les id de match et pronostic tu sais que l'utilisateur a gagné ... et donc son nombre de point ...

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
19 février 2021 à 14:43:49

Merci pour ta réponse.

Benzouye a écrit:

Bonjour,

Un même utilisateur peut faire plusieurs pronostics pour le même match ?

Non un utilisateur peut faire un seul pronostique pour le même match. Je vais avoir chaque jour une liste de match et il faudra choisir un vainqueur à chaque match.

Tu as raison pour mettre directement l'id de l'équipe dans la table pronostique et match, ce sera parfait pour retrouver les gagnants à chaque fois.

Concernant les points gagnés et le classement, le mieux est donc de faire une requête qui récupère tous les pronostiques gagnant de l'utilisateur c'est ça ? Idem pour le classement en triant du plus grand au plus petit du coup ?

Encore merci

  • Partager sur Facebook
  • Partager sur Twitter
19 février 2021 à 16:02:49

brizy a écrit:

un utilisateur peut faire un seul pronostique pour le même match

Donc la table Pronostique est une table de relation, elle ne doit pas avoir d'identifiant auto incrémenté, mais sa clé primaire doit être composée des deux colonnes id_match/id_utilisateur ...

Le modèle serait :

  • equipe ( id_equipe [pk], nom )
  • utilisateur ( id_utilisateur [pk], identifiant [u], motdepasse )
  • matches ( id_match [pk], date_debut, id_domicile [fk], id_exterieur [fk], id_vainqueur [fk] )
  • pronostique ( id_utilisateur [fk][pk], id_match [pk][fk], id_equipe [fk] )

Il faudra mettre en place des contrôles avec deux TRIGGER qui empêchent :

  • de renseigner un pronostique.id_equipe qui ne correspond pas à id_domicile ou id_exterieur pour le match pronostiqué
  • de renseigner un matches.id_vainqueur qui ne correspond pas à id_domicile ou id_exterieur pour le match donné

brizy a écrit:

faire une requête qui récupère tous les pronostiques gagnant de l'utilisateur c'est ça ? Idem pour le classement en triant du plus grand au plus petit du coup ?

Oui, avec le modèle proposé, pour les paris gagnants c'est super simple :

SELECT COUNT(*) AS nb_win
FROM
	pronostique P
		INNER JOIN matches M
			ON P.id_match = M.id_match
			AND P.id_equipe = M.id_vainqueur
WHERE P.id_utilisateur = 'id utilisateur souhaité'

Pour le classement c'est à peine plus compliqué :

SELECT
	U.id_utilisateur,
	U.identifiant,
	COUNT(*) AS nb_win
FROM
	utilisateur U
		INNER JOIN pronostique P
			ON U.id_utilisateur = P.id_utilisateur
		INNER JOIN matches M
			ON P.id_match = M.id_match
			AND P.id_equipe = M.id_vainqueur
GROUP BY
	U.id_utilisateur,
	U.identifiant
ORDER BY nb_win DESC;
  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
19 février 2021 à 21:02:29

Super merci pour ta réponse très détaillée.

C'est hyper clair et ça répond à tous mes besoins :)

  • Partager sur Facebook
  • Partager sur Twitter