IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Mise à jour d'une table en fonction d'une autre


Sujet :

PHP & Base de données

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut Mise à jour d'une table en fonction d'une autre
    Bonjour,

    J'aimerai savoir le meilleur moyen pour mettre à jour une table lorsque qu'une autre table est modifiée.

    En effet, ma première table "joueurs_saison_2021_2022" contient la liste des joueurs, ainsi que leur classement, total de points, etc.
    Lorsque j'ajoute un match dans la table "matchs_saison_2021_2022", la table "joueurs_saison_2021_2022" doit donc recalculer le classement et les points de chaque joueur.

    Dois-je faire cela en php, ou directement en SQL dans phpMyAdmin avec les déclencheurs?
    - En php, la table des joueurs risque de ne pas se mettre à jour si je modifie directement la table des matchs via phpMyadmin. Je sais que ce n'est pas à faire, mais je sais aussi que mon programme comportera quelques erreurs au débuts que je devrais corriger directement dans la BDD.
    - Via un déclencheur, peut on lier automatiquement les tables en fonctions de leur nom? C'est à dire que la table "joueurs_saison_2021_2022" doit chercher les valeurs de matchs_saison_2021_2022 mais pas d'une autre saison.

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 259
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 259
    Points : 8 556
    Points
    8 556
    Billets dans le blog
    17
    Par défaut
    On ne doit pas pratiquer de cette manière. C'est signe d'une mauvaise modélisation de la base.
    Réfléchis aux requêtes nécessaires, ce serait vite ingérable.

    Par exemple, la table matchs_saison_2021_2022, vu son nom, ne devrait pas exister.

    Tu devrais plutôt avoir des tables comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    seasons
    ------------------
    season_id
    season_sport # Ex. "Football"
    season_name # Ex. "Saison 2021-2022"
    season_championship # Ex. "Ligue 1"
    season_begin # Date de lancement officielle de la saison
    season_end # Date de fin officielle de la saison
    ...
    Pour les équipes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    teams
    ------------------
    team_id
    team_name # Ex. "Olympique de Marseille"
    team_city # "Marseille"
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    matches
    ------------------
    match_id
    match_season # Saison de la rencontre, clef étrangère vers seasons.season_id
    match_date # Date du match
    match_team1 # Equipe à domicile, clef étrangère vers teams.team_id
    match_team2 # Equipe en déplacement, clef étrangère vers teams.team_id
    match_score1 # Points de l'équipe à domicile
    match_score2 # Points de l'équipe en déplacement
    ...
    Autres champs : match effectué/reporté ? Affluence ? Météo ? Durée du match ? etc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    players
    ------------------
    player_id
    player_name
    ...
    Pour les joueurs enregistrés sur le match :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sheets # Feuilles de match
    ------------------
    sheet_id
    sheet_match # Clef étrangère vers matches.match_id
    sheet_player # Clef étrangère vers players.player_id
    sheet_team # Clef étrangère vers teams.team_id, équipe pour laquelle le joueur a joué
    sheet_inplay # Minute de l'entrée en jeu, ex. "0" si débute la rencontre, NULL si n'entre pas en jeu
    sheet_outplay # Minute de la sortie de jeu, ex. NULL si ne sort pas
    sheet_points # Nombre de buts/points marqués par le joueur
    ...
    Obtenir tous les matchs de la saison 2021-2022 de ligue 1 de foot et leur résultat :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT ALL match_date, t1.team_name AS t1_name, match_score1, t2.team_name AS t2_name, match_score2
    FROM matches
    INNER JOIN teams AS t1 ON match_team1 = t1.team_id
    INNER JOIN teams AS t2 ON  match_team2 = t2.team_id
    INNER JOIN seasons ON match_season = season_id
    WHERE TRUE 
        AND season_sport = 'Football' 
        AND season_championship = 'Ligue 1'
        AND season_name = 'Saison 2021-2022'

    Obtenir le temps de jeu de Lionel Messi en 2021-2022 en Ligue 1 :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT ALL SUM(COALESCE(sheet_outplay, 90) - sheet_inplay)
    FROM sheets
    INNER JOIN players ON sheet_player = player_id
    INNER JOIN matches ON sheet_match = match_id
    INNER JOIN seasons ON match_season = season_id
    WHERE TRUE
        AND sheet_inplay IS NOT NULL -- Messi est entré en jeu
        AND player_name = 'Lionel Messi' 
        AND season_championship = 'Ligue 1'
        AND season_name = 'Saison 2021-2022'

    Voila, avec un minimum de structure tu peux paramétrer tes requêtes et ne pas avoir à jongler avec les noms de tables/colonnes.

    Pose à plat tout ce que tu veux gérer et quelles sont les informations que tu veux obtenir, et si besoin de conseil de modélisation tu peux poster ici.

    Je te souhaite bon courage, car ce n'est pas simple de tout prévoir, et on peut aller très loin, beaucoup plus loin qu'illustré ici

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 910
    Points : 6 703
    Points
    6 703
    Par défaut
    le meilleur moyen pour mettre à jour une table lorsque qu'une autre table est modifiée.
    Le meilleur moyen est d'éviter cette situation en concevant la base de manière à ce qu'il n'y ait pas d'informations redondantes et où, par exemple quelque chose comme le nombre de buts d'un joueur puisse être trouvé par une requête qui en fait l'addition.
    Modéliser des matchs de foot (ou autres) avec un certain niveau de détail est loin d'être simple, car pleins de paramètres sont à prendre en compte (quelles sont les équipes, qui les constitue, qui est sur le terrain, qui marque, contre son camp ou pas, quand tel joueur arrive dans telle équipe, quand il la quitte?).
    Le fait que tu ais choisi de créer une table par saison pour les matchs et les joueurs c'est moyennement bon signe.
    Je ne saurais trop te conseiller de te tourner vers les experts de la modélisation avant d'aller plus loin: Forum > Général Développement > ALM > Modélisation.

  4. #4
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Je ne saurais trop te conseiller de te tourner vers les experts de la modélisation avant d'aller plus loin: Forum > Général Développement > ALM > Modélisation.
    En effet, j'ai lu rapidement cette discussion et bien que bien moins expert que Cosmo. et Séb., effectivement, il faut d'abord avoir une modélisation correcte et les experts sont là : https://www.developpez.net/forums/f6...sation/schema/. Pour construire un modèle correct, je te conseille de te tourner vers le logiciel gratuit LOOPING. Celui-ci (un bijou) dispose de son propre forum ici : https://www.developpez.net/forums/f2...utils/looping/ et un petit investissement dans le bouquin écrit par l'auteur du logiciel aide aussi : https://www.amazon.fr/Mod%C3%A9lisat.../dp/B07YTDY1LB.

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 910
    Points : 6 703
    Points
    6 703
    Par défaut
    Le modèle que Séb a proposé est très bien, du moins s'il voit les éléments à prendre en compte comme je les vois (reste à confirmer si c'est ce que BruceBoc veut faire), nos postes se sont télescopés (pas vite mais quand même).

    Looping est un excellent outil, voire indispensable. Il y a aussi pas mal de tutoriels de modélisation sur dvp.

    A-t-on vraiment besoin du secours d'une base de données pour compter les buts de Messi à l'heure d'aujourd'hui? J'en doute, la main voire un doigt devrai suffire.

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    Merci à tous pour vos réponses, notamment Séb qui m'a fait un exemple ultra détaillé.
    Je vais prendre un peu de temps pour tester Looping, et modéliser la base de données. Je vais également approfondir quelques notions comme les clés étrangères que je ne connaissais pas.
    Pour ce qui est de mes besoins, ils sont heureusement beaucoup plus simples que pour le foot. Je cherche à faire un comptage de points et un classement, pour le badminton, et un club unique. On joue uniquement entre nous en loisir.
    Dès que j'ai le temps je vous joint le schéma pour validation

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    les clés étrangères, Séb. y fait largement emploi dans son modèle. Dés que l'on parle de SGBDR (R pour relationnelle), il y a des clés étrangères. Si tu utilises Looping, ce logiciel te générera le code SQL de création des tables avec des clés étrangères (dès que 2 tables sont en relation). Par contre, ça reste à toi de générer le code SQL pour manipuler ces tables. Qui dit clé étrangères dit jointure. Voici une bible : https://sqlpro.developpez.com/cours/sqlaz/jointures/.

    Citation Envoyé par CosmoKnacki Voir le message
    A-t-on vraiment besoin du secours d'une base de données pour compter les buts de Messi à l'heure d'aujourd'hui? J'en doute, la main voire un doigt devrai suffire.
    Un seul doigt limite à un seul but...

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    Je regarde ça.
    Merci

  9. #9
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 259
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 259
    Points : 8 556
    Points
    8 556
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par BruceBoc Voir le message
    Pour ce qui est de mes besoins, ils sont heureusement beaucoup plus simples que pour le foot. Je cherche à faire un comptage de points et un classement, pour le badminton, et un club unique. On joue uniquement entre nous en loisir.
    Pas sûr que ce soit plus simple, notamment à cause des rencontres en simple ou en double, des équipes qui vont sûrement pas toujours être les mêmes, et du classement

    Trucs auxquels il faut réfléchir :

    => Il faudra sûrement conserver le principe de feuille de match/rencontre (table (match)sheets de l'exemple du foot) pour spécifier les joueurs ayant participé à la rencontre en simple ou en double, ou autre (on peut imaginer un 1 vs. 2 pour le fun)

    => Déterminer comment les points sont répartis et ce qui est classé (des joueurs ou des équipes de joueurs), il faudra peut-être garder le principe de championnat
    Ex. championnat des simples
    championnat des doubles (équipes fixes ? => Classement par équipe)
    championnat détente/autre (classement plus olé olé => Classement par joueur)

    => Et si le duo n'est plus le même d'un match à l'autre, comment sont comptabilisés les points pour le classement ?

    Voilà, et ce ne sont que les premières interrogations soulevées.

    N'hésite pas à poster tes règles (ce que tu veux pouvoir enregistrer/calculer) et ton schéma

  10. #10
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Séb. Voir le message
    N'hésite pas à poster tes règles (ce que tu veux pouvoir enregistrer/calculer) et ton schéma
    En effet, les spécialistes de la modélisation conseillent de commencer par écrire les règles de gestion. Exemple :
    Citation Envoyé par escartefigue Voir le message
    Il manque vos règles de gestion, sans lesquelles on ne peut pas valider un MCD, les règles sont à rédiger sous la forme :
    R001 : un agent appartient à un et un seul service
    R002 : un service peut avoir un à plusieurs agents
    etc...

  11. #11
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    Voici un premier jet :

    Nom : Capture.PNG
Affichages : 156
Taille : 37,5 Ko

  12. #12
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 910
    Points : 6 703
    Points
    6 703
    Par défaut
    Moi je dirais plutôt que c'est l'équipe qui contient un joueur (pas le match) et qu'un match est la confrontation de deux équipes.

    Pour éviter les doublons pourquoi ne pas inclure l'heure de la rencontre en plus de la date?

  13. #13
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Moi je dirais plutôt que c'est l'équipe qui contient un joueur (pas le match) et qu'un match est la confrontation de deux équipes.
    Tout-à-fait. D'ailleurs, cette classe (équipe ou team) était dans le modèle de Séb..

  14. #14
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    Je suis d'accord dans le principe pour les equipes, mais est-ce indispensable? Les equipes changent a chaque matchs, tout le monde tourne avec tout le monde, du coup j'ai pas envie de complexifier le code pour rien' et les classements sont individuels.

    Pour le doublon, je peux effectivement mettre l'heure en plus.

    J'en reviens a ma toute premiere question, pour les totaux de scores et les statistiques, je peux les mettre dans une table pour eviter de tout calculer a chaque consultation?

  15. #15
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 377
    Points : 39 852
    Points
    39 852
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Avant de savoir où et comment stocker les informations, il faut identifier celles dont on a besoin et pour ça, les règles de gestion sont indispensables.

    Par exemple, chaque match est une rencontre entre deux équipes, chaque équipe étant constituée de joueurs
    Qui marque les points : l'équipe ? les joueurs ? Si ce sont les joueurs, les points sont ils attribués uniquement à ceux qui sont effectivement entrés sur le terrain ou bien également à ceux restés sur le banc de touche... Un joueur qui rejoint l'équipe en cours de saison bénéficie-t-il des points acquis par l'équipe avant son arrivée ?

    Tout ça doit être écrit, en fonction, les attributs seront positionnés dans telle ou telle classe d'entité, mais dans tous les cas sans redondance : on stockera les points là où c'est requis, mais pas le classement.

    Avec un modèle de données bien conçu et des requêtes "sargables", calculer le classement à chaque fois que c'est nécessaire ne posera aucun problème de performances

    À l'inverse, stocker le classement plutôt que les points implique de recalculer celui-ci pour tous les joueurs concernés et à chaque nouvel événement (match, annulation d'un résultat etc.). Mauvaise idée...

Discussions similaires

  1. ProgressBar mise à jour depuis une autre classe
    Par poussinvert dans le forum Android
    Réponses: 23
    Dernier message: 23/05/2012, 20h20
  2. Réponses: 1
    Dernier message: 17/06/2010, 14h00
  3. [AC-2003] Mise à jour d'une date dans une table en fonction d'un critère
    Par carlostropico dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 09/12/2009, 19h07
  4. [AC-2003] Afficher le contenu d'une listBox sur evenement après mise à jour d'une autre.
    Par moilou2 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 17/07/2009, 12h47
  5. Réponses: 2
    Dernier message: 24/03/2009, 15h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo