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 :

id auto increment


Sujet :

MySQL

Vue hybride

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 178
    Par défaut id auto increment
    bonjour, j'ai plusieurs tables qui comporte la même clé étrangére exemple:

    TABLE sujet(id,titre_sujet)
    Table sous_sujet(id,description,id_sujet)

    Est -ce que un id auto incrément et t'il vraiment nécessaire pour la 2eme table ? ou Juste une clé index est suffisante ?
    (id,titre_sujet) (description,id_sujet).

  2. #2
    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
    Oui, l'identifiant est nécessaire car c'est lui qui servira de clé étrangère dans d'autres tables, tout comme l'identifiant de la table sujet est clé étrangère dans la table sous-sujet.
    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 !

  3. #3
    Membre Expert

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Oui, l'identifiant est nécessaire car c'est lui qui servira de clé étrangère dans d'autres tables, tout comme l'identifiant de la table sujet et clé étrangère dans la table sous-sujet.
    Petite précision : Ca sera le couple id, id_sujet de la table sous sujet qui sera référence d'un éventuelle FOREIGN KEY.

    Cette pratique a un nom : l'identification relative. Dans le cas de sujets et sous-sujets, je ne conseillerais pas ce type d'identification pour des raisons de maintenance et d'évolution. L'identification relative implique une dépendance très forte (c'est presque de l'héritage). Il sera donc délica de déplacer un sous sujet dans un autre car la seconde partie de l'identification dépend de la première.

    Ici utiliser un simple auto_increment est quelque peu simpliste car le but de l'identification relative est de gagner des identifiants en réattribuant une même partie de la clé primaire dans d'autres enregistrement.
    Par exemple il y aura plusieurs sous sujet d'id 1, mais ils seront présents dans des sujets différents. La clé primaire étant composée cela ne posera pas de problèmes.

    L'utilisation de l'auto_increment rendra inutile l'identification relative (car toutes les clés seront différentes) , et il deviendrait plus logique d'utiliser uniquement id comme identifiant, et id_sujet serait qu'une FOREIGN KEY.

    Pourquoi c'est une mauvaise idée d'utiliser de l'identification relative dans ce cas de figure?
    En fait imaginons que nous utilisons de l'identifications relatives, et que nous ayons les données suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CREATE TABLE SUJET(
    ID INTEGER PRIMARY KEY
    );
     
    CREATE TABLE SOUS_SUJET(
    ID INTEGER PRIMARY_KEY,
    ID_SUJET INTEGER REFERENCES SUJET(ID)
    );
     
    INSERT INTO SUJET VALUES
    (1),
    (2),
    (3);
     
    INSERT INTO SOUS_SUJET VALUES
    (1,1),
    (1,2),
    (2,2);
    Que se passe il si je déplace mon sous sujet 1 de mon sujet 1 vers le sujet 2 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE SOUS_SUJET SET ID_SUJET = 2 WHERE ID = 1 AND ID_SUJET = 1;
    Le contrôle de l'intégrité refusera alors l'insertion, et il faudra revoir l'identifiant du sujet déplacé ce qui mène à deux problèmes :
    • Il va falloir écrire du code (et donc risquer des bugs).
    • Bien pire : nous devront modifier l'identifiant d'une occurrence !


    Je conseillerais donc d'avoir une simple FOREIGN KEY qui lira les deux tables. Cela se traduit au niveau logique, d'identifier sous_sujets uniquement par ID, et non plus par le couple ID / ID_SUJET. Dans ce cas il deviendra convenable de poser un auto_increment sur l'identifiant de SOUS_SUJET.

Discussions similaires

  1. auto-increment
    Par fafet dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/07/2003, 15h05
  2. [MYSQL] valeur auto-increment
    Par alex1er dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/07/2003, 12h26
  3. Auto Increment
    Par Guizz dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 23/06/2003, 18h36
  4. Nom du champs auto-incrementé
    Par norroy dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/06/2003, 18h30
  5. Pb d'auto-incrément sur une table v7
    Par Nivux dans le forum Paradox
    Réponses: 9
    Dernier message: 26/12/2002, 12h05

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