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

 MySQL Discussion :

Unique Key et Primary Key


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut Unique Key et Primary Key
    Bonjour à tous,

    je me pose une question quant à l'utilisation d'un index d'unicité. J'ai une table très simple du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE  TABLE IF NOT EXISTS `test`.`users_droits` (
      `idUser` INT UNSIGNED NOT NULL ,
      `idDroit` INT UNSIGNED NOT NULL )
    ENGINE = InnoDB;
    Dois je impérativement déclarer mes deux champs en Primary key ou puis je me contenter d'un index unique comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE UNIQUE INDEX `uniq_droit_user` ON `test`.`users_droits` (`idUser` ASC, `idDroit` ASC) ;
    Tout en sachant que ces deux champs sont des clé étrangères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE INDEX `fk_user_droit_1` ON `test`.`users_users` (`idUser` ASC) ;
    CREATE INDEX `fk_user_droit_2` ON `test`.`users_droits` (`idDroit` ASC) ;
    Mysql ne semble pas raler quand j'utilise un index unique et non un primary.

    Merci pour vos réponses
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Une clef primaire est l'association de deux contraintes : not null + unique.
    Ce qui est bien votre cas !

    Mais rien n'oblige une table à avoir une clef primaire.

  3. #3
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    En fait tu peux très bien avoir autant de clés UNIQUEs dans une table que bon te semble (à la cohérence d'analyse près). Par contre, en toute logique il ne peut y avoir qu'une seule PRIMARY KEY, et dans le cas précis, qu'elle soit PRIMARY KEY ou UNIQUE ne change pas grand chose, cette table n'étant sans doute qu'un pivot entre deux autres tables pour permettre une association n,n
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Ta table semble être issue d'une association entre les utilisateurs et les droits.

    Quel est le MCD ?
    1) user -0,n----avoir----0,n- droit
    2) user -(0,1)----avoir----0,n- droit

    Avec un logiciel de modélisation digne de ce nom, la génération du MLD va créer une table, que tu as le droit d'appeler 'users_droits' :
    - Si c'est le 1), dont la clé primaire sera composée des identifiants des deux autres tables, donc le couple {idUser, idDroit}.
    - Si c'est le 2), un utilisateur ne pouvant avoir qu'un seul droit, n'apparaîtra qu'une fois dans la table associative. Son identifiant (idUser) constituera donc la clé primaire.

    En résumé :
    - Si un utilisateur peut avoir plusieurs droits => clé primaire double {idUser, idDroit}.
    - Si un utilisateur ne peut avoir qu'un seul droit => clé primaire simple {idUSer}.

    EDIT :
    C'est celui qui en dit le moins qui répond le plus vite !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Merci à tous pour vos réponses.
    C'est en effet une table pivot du type user -0,n----avoir----0,n- droit.

    Il n'y a donc pas de différence de performance entre utiliser une clé primaire double (idUser,iddroit) ou un index d'unicité double (sur idUser,iddroit) ?
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par grunk Voir le message
    Il n'y a donc pas de différence de performance entre utiliser une clé primaire double (idUser,iddroit) ou un index d'unicité double (sur idUser,iddroit) ?
    Ça je n'en sais fichtre rien.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Petit précision qui m'oriente dans mon choix.

    Sous mysql workbench , quand j'utilise un index d'unicité plutôt qu'une clé primaire double, la relation entre la table parent et la table enfant n'est pas identifié alors qu'elle devrait l'être (l'enfant n'a pas lieu d'exister si le parent n'existe pas).

    En revanche si j'utilise une clé primaire la relation est bien identifiée
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Mouaisfff

    C'est normalement plutôt corrélé à la présence d'une FOREIGN KEY l'association entre tables.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  9. #9
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par grunk Voir le message
    Merci à tous pour vos réponses.
    C'est en effet une table pivot du type user -0,n----avoir----0,n- droit.

    Il n'y a donc pas de différence de performance entre utiliser une clé primaire double (idUser,iddroit) ou un index d'unicité double (sur idUser,iddroit) ?
    A mon avis non.
    La clé primaire est un index UNIQUE donc :
    - Au niveau performance d'interogation, c'est un indexé donc c'est optimal.
    - Au niveau performance d'ajout, c'est pareil qu'un index UNIQUE puisqu'ils vérifient tous deux l'unicité de l'insertion.

    La seule contrainte supplémentaire de la clé primaire par rapport à l'index UNIQUE, c'est la vérification NOT NULL, pour autant que les colonnes composant un index UNIQUE ne soient pas par ailleurs déclarées NOT NULL. Ca doit prendre un petit paquet de microsecondes à chaque insertion ?

    Conclusion : Ne te casse pas la tête ! Dans ton cas, tu mets une clé primaire double !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. Probleme avec les contraintes primary key et foreign key
    Par haylox dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2013, 14h23
  2. Réponses: 4
    Dernier message: 31/01/2012, 11h03
  3. Primary Key et Foreign Key dans la même Entity
    Par Invité dans le forum JPA
    Réponses: 1
    Dernier message: 08/07/2008, 10h46
  4. PRIMARY KEY et FOREIGN KEY sur la même colonne ?
    Par SpecialCharacter dans le forum Outils
    Réponses: 4
    Dernier message: 31/01/2008, 17h35
  5. PRIMARY KEY - UNIQUE - INDEX
    Par Thierry8 dans le forum Requêtes
    Réponses: 4
    Dernier message: 16/12/2005, 23h28

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