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 :

2 champs comme clé primaire ? [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut 2 champs comme clé primaire ?
    Bonjour, je m'explique j'ai 3 tables:

    joueur_licencie(numero_licence,nom_joueur,prenom_joueur,adresse_joueur,ville_joueur,nom_club,elo,classement_championnat)

    et

    club(nom_club,ville_club,adresse_club,pageweb_club,nom_ligue)

    et

    ligue_regionale(nom_ligue,pageweb_ligue).

    Je veux ajouter une contrainte pour qu'il ne soit pas possible qu'un joueur puisse être inscrit dans deux clubs différents.Comment faire ?
    J'ai pensé à mettre 2 champs(numero_licence et nom_club ) en tant que clé primaire dans ma table joueur_licencie.

    A votre avis quelle est la bonne méthode ?
    Merci !

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Par défaut
    Citation Envoyé par guipe Voir le message
    Je veux ajouter une contrainte pour qu'il ne soit pas possible qu'un joueur puisse être inscrit dans deux clubs différents.
    Je vois pas comment c'est possible avec ton schéma actuel. Un licencié n'a qu'un club (nom_club).

  3. #3
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Ne rien faire.

    Vu ta définition de joueur_licencie, il n'est pas possible d'avoir plusieurs clubs pour un joueur.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut
    D'accord et une dernière question :

    joueur_licencie(numero_licence,nom_joueur,prenom_joueur,adresse_joueur,ville_joueur,nom_club,elo,classement_championnat)


    Ma clé primaire doit obligatoirement être définie en AUTO INCREMENT?

    Dans quels cas doit-on le faire ?

    Merci !

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Par défaut
    Citation Envoyé par guipe Voir le message
    D'accord et une dernière question :

    joueur_licencie(numero_licence,nom_joueur,prenom_joueur,adresse_joueur,ville_joueur,nom_club,elo,classement_championnat)


    Ma clé primaire doit obligatoirement être définie en AUTO INCREMENT?

    Dans quels cas doit-on le faire ?

    Merci !
    Tu ne le fais que lorsque tu souhaites que la clé soit gérée toute seule par le SGBD, en prenant des valeurs numériques de 1 jusqu'au maximum que peut supporter ta colonne. Dans ce cas tu n'as pas besoin de préciser la valeur de la clé lors d'un insert. C'est le cas le plus fréquent.

    Là tu as un numéro de licence donc l'auto increment est certainement une mauvaise idée. Il faut gérer toi même ta clé, la préciser lors de l'insert et t'assurer qu'elle est unique pour chaque licencié (sans quoi l'insert se vautrera).

  6. #6
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Il me semble que tu ne peux pas mettre le champ "numero_licence" en autoincrement, car théoriquement, ce n'est pas toi qui décide de ce numéro, mais la fédération (le terme n'est peut être pas le bon).

    Si c'est le cas, alors mettre ce champ "numero_licence" comme clé primaire ne serait pas forcément l'idéal, ce serait mélanger une donnée propre à son activité et une donnée propre au fonctionnement de la Bdd.

    Une solution serait de créer un champ spécifique pour le fonctionnement de la Bdd, pour les jointures entre autre :
    joueur_licencie(joueur_id, numero_licence, nom_joueur, prenom_joueur, adresse_joueur, ville_joueur, nom_club, elo, classement_championnat)

    le champ "joueur_id" serait un auto_increment, mais comme une licence est unique, il faudrait mettre comme contrainte "UNIQUE" sur ce champ "numero_licence".

    Pour la table "clubs" il faudrait une clé primaire en auto_incremente, un ID :
    clubs(club_id, nom_club, ville_club, adresse_club, pageweb_club, nom_ligue)


    Ensuite, si un joueur ne peut appartenir qu'à 1 seul club, alors, il faudrait rajouter l'ID du club dans la table "joueurs" :
    joueur_licencie(joueur_id, club_id, numero_licence, nom_joueur, prenom_joueur, adresse_joueur, ville_joueur, nom_club, elo, classement_championnat)


    Aussi, le champ "nom_club" de la table "joueurs" est inutile, le nom du club devra être obtenu en faisant des jointures grâce au club_id rajouté. (table joueurs/clubs).
    joueur_licencie(joueur_id, club_id, numero_licence, nom_joueur, prenom_joueur, adresse_joueur, ville_joueur, elo, classement_championnat)

    Il faudrait peut être retirer le champ "classement_championnat", ce n'est pas une donnée propre à un joueur, il faudrait à mon sens une table spécifique pour le championnat. Faut voir.

    Le champ "elo" aussi, je ne sais pas ce que c'est, faudrait voir s'il a sa place dans cette table "joueurs".

    Pour la table "ligue_regionale" il faudrait aussi une clé primaire, un ID en auto_incremente :
    ligue_regionale(ligue_id, nom_ligue, page_web_ligue).

    Ensuite, supprimer le champ "nom_ligue" de la table "clubs". Même chose, le nom devra être obtenu par jointure, grâce au ligue_id.
    club(club_id, nom_club, ville_club, adresse_club, pageweb_club)


    Question comme ça.
    Est que (par hasard) un club ne devrait pas appartenir qu'à 1 seule ligue régionale ?
    Si c'est le cas, il faudrait faire comme pour la table "joueur" :
    club(club_id, ligue_id, nom_club, ville_club, adresse_club, pageweb_club)



    Mais, car il y a un mais.
    Ce pose ici la question de l'historique, aussi bien pour la table joueurs, clubs (au minimum).
    Il faudra répondre à la question si on veut conserver l'exactitude des données dans le temps en cas de changement, de mouvement.
    Exemple :
    Si un joueurs en 2009 est licencié dans tel club, (avec une licence), et que l'année d'après il change de club : Que fait on ?
    Dans le cas ici, l'historique sera perdue lorsque qu'on va mettre à jour les données du joueur.

    De même que si un joueur ne renouvelle pas sa licence, que fait on : Faut il le supprimer ?
    Ca dépend du reste de la Bdd, car s'il y a une notion de "joueur contre un autre joueur" (par exemple), une suppression risque de faire planter l'application (voir même une modification).
    De même que si on fait des stats, les données supprimées risque de les faussées (voir même une modification).


    Pas si simple en faite ...


    Ca à été fait au feeling, vite fait à l'instant, je ne peux garantir que cela soit la meilleur approche, faut voir.
    S'il y a d'autres contraintes, il faut le dire, ça peu déboucher sur une manière de faire particulière.
    Mais une chose est sûr, faut éviter de mélanger des données, voir de dupliquer des données dans plusieurs tables, et utiliser des IDs, des identifiants comme clés primaire, (et non des noms).

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut
    Je liste mes contraintes:

    Afi n de pouvoir participer aux competitions oficielles, un joueur doit etre inscrit dans un club d'echecs,
    et posseder une licence. La dureede vie d'une licence est une annee sportive. Un joueur ne peut pas etre inscrit dans deux clubs pendant la meme saison.

    Les coordonnees d'un licencie consistent en quelques coordonnees person-
    nelles, le club d'afiliation, le numero de licence, l'Elo, et son classement actuel au championnat.

    Les coordonnees d'un club sont : le nom, la ligue d'afiliation, l'adresse, et la page web.

    les coordonnees d'une ligue sont :nom et site web.

    joueur_licencie(joueur_id(AUTO INC),club_id, numero_licence(UNIQUE), nom_joueur, prenom_joueur, adresse_joueur, ville_joueur, nom_club, elo, classement_championnat)

    club(club_id(AUTO INC), ligue_id, nom_club(UNIQUE ?), ville_club, adresse_club, pageweb_club)

    ligue_regionale(ligue_id(AUTO INCREMENT), nom_ligue(UNIQUE), page_web_ligue)

    Du moment qu'un nom de ligue est unique: exemple ligue PACA(ce sont des ligues régionales).Est-ce nécessaire de mettre un ligue_id? Ne suffit-il pas de mettre nom_ligue en UNIQUE et de l'utiliser comme clé primaire?
    Pareil pour numero_licence dans joueur_licencie, ne suffit-il pas de le mettre en UNIQUE et de l'utiliser comme clé primaire?

    Par contre pour club je comprends car aucune des informations n'est sure d'etre totalement unique !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/08/2011, 20h03
  2. Réponses: 2
    Dernier message: 06/08/2010, 15h29
  3. Réponses: 4
    Dernier message: 27/02/2008, 13h30
  4. Creation de table avec un champ texte comme clé primaire
    Par Sytchev3 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 30/07/2007, 11h40
  5. Champ de type ROWGUID comme clé primaire
    Par IADJOFOGUE dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/07/2006, 15h15

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