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 :

Quand on créé une table associative est que ces 2 processus de création sont vraiment équivalents ?


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 51
    Par défaut Quand on créé une table associative est que ces 2 processus de création sont vraiment équivalents ?
    Quand on créé une table associative est que ces 2 processus de création sont vraiment équivalents ?

    Dans mon MLD quand je fabrique la table associative livre_contributeur pour satisfaire la relation livre (1,n)← contribuer →(1,n) contributeur



    -Ces 2 codes sont ils équivalents*?
    -l'un doit il être préféré à l'autre ?

    CODE 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* on créé la table livre_contributeur */
    CREATE TABLE IF NOT EXISTS livre_contributeur(
    IDlivre SMALLINT UNSIGNED NOT NULL ,
    IDcontributeur SMALLINT UNSIGNED NOT NULL,
    PRIMARY KEY (IDlivre,IDcontributeur)
    ) ENGINE=INNODB; 
     
    /*on ajoute les clefs secondaires*/
    /*Sur la table livre_contributeur cardianlité (1,1) on importe les clefs etrangeres */
    /*contributeur(1,N) --> (1,1)livre_contributeur*/
    ALTER TABLE livre_contributeur ADD CONSTRAINT FK_contribuer_1 FOREIGN KEY (IDcontributeur) REFERENCES contributeur(IDcontributeur);
     
    /*livre(1,N) --> (1,1)livre_contributeur*/
    ALTER TABLE livre_contributeur ADD CONSTRAINT FK_contribuer_2 FOREIGN KEY (IDlivre) REFERENCES livre(IDlivre);
    CODE 2 :
    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
    /* on créé la table livre_contributeur */
    CREATE TABLE IF NOT EXISTS livre_contributeur(
    IDlivre SMALLINT UNSIGNED NOT NULL ,
    IDcontributeur SMALLINT UNSIGNED NOT NULL
    ) ENGINE=INNODB; 
     
    /*on ajoute les clefs secondaires*/
    /*Sur la table livre_contributeur cardianlité (1,1) on importe les clefs etrangeres */
    /*contributeur(1,N) --> (1,1)livre_contributeur*/
    ALTER TABLE livre_contributeur ADD CONSTRAINT FK_contribuer_1 FOREIGN KEY (IDcontributeur) REFERENCES contributeur(IDcontributeur);
     
    /*livre(1,N) --> (1,1)livre_contributeur*/
    ALTER TABLE livre_contributeur ADD CONSTRAINT FK_contribuer_2 FOREIGN KEY (IDlivre) REFERENCES livre(IDlivre);
     
    /*on fait une clef primaire*/
     
    ALTER TABLE livre_contributeur ADD PRIMARY KEY (IDlivre,IDcontributeur);
    CD sudtek

    edit oublie d'une virgule dans le code !
    Images attachées Images attachées  

  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
    Fais un SHOW CREATE TABLE après les deux méthodes. Il y aura peut-être une différence car avec la création automatique par MySQL des index sur les colonnes portant les clés étrangères, peut-être qu'il va créer d'abord un index simple sur idLivre puis la clé primaire double, ce qui fait que la colonne idLivre sera indexée deux fois.

    Par contre, il est normal que ID Contributeur ait un index indépendant car dans la clé primaire cette colonne n'est indexée que relativement à IDLivre.

    Clé primaire :
    IDLivre / IDContributeur
    1 / 1
    1 / 2
    1 / 5
    2 / 1
    3 / 6
    3 / 8
    4 / 5
    4 / 6

    On voit que IDContributeur n'est pas trié tout seul mais pour chaque valeur de IDLivre.

    En toute rigueur, il faudrait dans l'ordre :
    1) Créer la table.
    2) Créer la clé primaire (je pense que l'index est automatique quel que soit le SGBD ?)
    3) Créer l'index sur IDContributeur.
    4) Créer les clés étrangères.
    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 averti
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 51
    Par défaut
    J'ai les même résultat, Je prends note de la méthode rigoureuse.
    CD sudtek.


    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    /*+++++++++++++++++++++++++++++++++  Code 1: ++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++++++++++++++++++++++  Code 1: ++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++++++++++++++++++++++  Code 1: ++++++++++++++++++++++++++++++++++++++++++++*/
     
    /* on créé la table livre_contributeur */
    CREATE TABLE IF NOT EXISTS livre_contributeur(
    IDlivre SMALLINT UNSIGNED NOT NULL ,
    IDcontributeur SMALLINT UNSIGNED NOT NULL,
    PRIMARY KEY (IDlivre,IDcontributeur)
    ) ENGINE=INNODB; 
     
     /*mysql> describe livre_contributeur;
    +----------------+----------------------+------+-----+---------+-------+
    | Field          | Type                 | Null | Key | Default | Extra |
    +----------------+----------------------+------+-----+---------+-------+
    | IDlivre        | smallint(5) unsigned | NO   | PRI | NULL    |       |
    | IDcontributeur | smallint(5) unsigned | NO   | PRI | NULL    |       |
    +----------------+----------------------+------+-----+---------+-------+
    2 rows in set (0.01 sec)
     
    mysql> show create table  livre_contributeur;
    +--------------------+-------------------------------------------------------------
    ----------------------------------+
    | Table              | Create Table
                                      |
    +--------------------+-------------------------------------------------------------
    ----------------------------------+
    | livre_contributeur | CREATE TABLE `livre_contributeur` (
      `IDlivre` smallint(5) unsigned NOT NULL,
      `IDcontributeur` smallint(5) unsigned NOT NULL,
      PRIMARY KEY (`IDlivre`,`IDcontributeur`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    +--------------------+-------------------------------------------------------------
    ----------------------------------+
    1 row in set (0.00 sec)*/
    /**/
     
    /*on ajoute les clefs secondaires*/
    /*Sur la table livre_contributeur cardianlité (1,1) on importe les clefs etrangeres */
    /*contributeur(1,N) --> (1,1)livre_contributeur*/
    ALTER TABLE livre_contributeur ADD CONSTRAINT FK_contribuer_1 FOREIGN KEY (IDcontributeur) REFERENCES contributeur(IDcontributeur);
     
     
    /*livre(1,N) --> (1,1)livre_contributeur*/
    ALTER TABLE livre_contributeur ADD CONSTRAINT FK_contribuer_2 FOREIGN KEY (IDlivre) REFERENCES livre(IDlivre);
     
    /*mysql> describe livre_contributeur;
    +----------------+----------------------+------+-----+---------+-------+
    | Field          | Type                 | Null | Key | Default | Extra |
    +----------------+----------------------+------+-----+---------+-------+
    | IDlivre        | smallint(5) unsigned | NO   | PRI | NULL    |       |
    | IDcontributeur | smallint(5) unsigned | NO   | PRI | NULL    |       |
    +----------------+----------------------+------+-----+---------+-------+
    2 rows in set (0.01 sec)
     
    mysql> show create table livre_contributeur;
    +--------------------+--------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------
    -------------------------------------------------------------------------+
    | Table              | Create Table
     
                                                                             |
    +--------------------+--------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------
    -------------------------------------------------------------------------+
    | livre_contributeur | CREATE TABLE `livre_contributeur` (
      `IDlivre` smallint(5) unsigned NOT NULL,
      `IDcontributeur` smallint(5) unsigned NOT NULL,
      PRIMARY KEY (`IDlivre`,`IDcontributeur`),
      KEY `FK_contribuer_1` (`IDcontributeur`),
      CONSTRAINT `FK_contribuer_1` FOREIGN KEY (`IDcontributeur`) REFERENCES `contributeur` (`IDcontributeur`),
      CONSTRAINT `FK_contribuer_2` FOREIGN KEY (`IDlivre`) REFERENCES `livre` (`IDlivre`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    +--------------------+--------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------
    -------------------------------------------------------------------------+
    1 row in set (0.00 sec)*/
     
    /*+++++++++++++++++++++++++++++++++  Code 2: ++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++++++++++++++++++++++  Code 2: ++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++++++++++++++++++++++  Code 2: ++++++++++++++++++++++++++++++++++++++++++++*/
    /*+++++++++++++++++++++++++++++++++  Code 2: ++++++++++++++++++++++++++++++++++++++++++++*/
    CREATE TABLE IF NOT EXISTS livre_contributeur(
    IDlivre SMALLINT UNSIGNED NOT NULL ,
    IDcontributeur SMALLINT UNSIGNED NOT NULL
     
    ) ENGINE=INNODB; 
     
    /*
    mysql> describe livre_contributeur;
    +----------------+----------------------+------+-----+---------+-------+
    | Field          | Type                 | Null | Key | Default | Extra |
    +----------------+----------------------+------+-----+---------+-------+
    | IDlivre        | smallint(5) unsigned | NO   |     | NULL    |       |
    | IDcontributeur | smallint(5) unsigned | NO   | MUL | NULL    |       |
    +----------------+----------------------+------+-----+---------+-------+
    2 rows in set (0.02 sec)
     
    mysql> show create table livre_contributeur;
    +--------------------+--------------------------------------------------------------
    ----------------------------------+
    | Table              | Create Table
                                      |
    +--------------------+--------------------------------------------------------------
    ----------------------------------+
    | livre_contributeur | CREATE TABLE `livre_contributeur` (
      `IDlivre` smallint(5) unsigned NOT NULL,
      `IDcontributeur` smallint(5) unsigned NOT NULL,
      KEY `FK_contribuer_1` (`IDcontributeur`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    +--------------------+--------------------------------------------------------------
    ----------------------------------+
    1 row in set (0.00 sec)*/
     
    /*on ajoute les clefs secondaires*/
    /*Sur la table livre_contributeur cardianlité (1,1) on importe les clefs etrangeres */
    /*contributeur(1,N) --> (1,1)livre_contributeur*/
    ALTER TABLE livre_contributeur ADD CONSTRAINT FK_contribuer_1 FOREIGN KEY (IDcontributeur) REFERENCES contributeur(IDcontributeur);
     
    /*livre(1,N) --> (1,1)livre_contributeur*/
    ALTER TABLE livre_contributeur ADD CONSTRAINT FK_contribuer_2 FOREIGN KEY (IDlivre) REFERENCES livre(IDlivre);
     
    /*on fait une clef primaire*/
     
    ALTER TABLE livre_contributeur ADD PRIMARY KEY (IDlivre,IDcontributeur);
     
    /*mysql> describe livre_contributeur;
    +----------------+----------------------+------+-----+---------+-------+
    | Field          | Type                 | Null | Key | Default | Extra |
    +----------------+----------------------+------+-----+---------+-------+
    | IDlivre        | smallint(5) unsigned | NO   | PRI | NULL    |       |
    | IDcontributeur | smallint(5) unsigned | NO   | PRI | NULL    |       |
    +----------------+----------------------+------+-----+---------+-------+
    2 rows in set (0.02 sec)
     
    mysql> show create table livre_contributeur;
    +--------------------+------------------------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------------------
    -------------------------------------------------------------------------+
    | Table              | Create Table
     
                                                                             |
    +--------------------+------------------------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------------------
    -------------------------------------------------------------------------+
    | livre_contributeur | CREATE TABLE `livre_contributeur` (
      `IDlivre` smallint(5) unsigned NOT NULL,
      `IDcontributeur` smallint(5) unsigned NOT NULL,
      PRIMARY KEY (`IDlivre`,`IDcontributeur`),
      KEY `FK_contribuer_1` (`IDcontributeur`),
      CONSTRAINT `FK_contribuer_1` FOREIGN KEY (`IDcontributeur`) REFERENCES `contributeur` (`IDcontributeur`),
      CONSTRAINT `FK_contribuer_2` FOREIGN KEY (`IDlivre`) REFERENCES `livre` (`IDlivre`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    +--------------------+------------------------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------------------
    -------------------------------------------------------------------------+
    1 row in set (0.00 sec)*/

  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
    Il y a un truc qui m'étonne dans ton script. Dans la seconde méthode, tu crées d'abord les colonnes de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE IF NOT EXISTS livre_contributeur(
    IDlivre SMALLINT UNSIGNED NOT NULL ,
    IDcontributeur SMALLINT UNSIGNED NOT NULL
     
    ) ENGINE=INNODB;
    => Pas d'index.

    Puis tu affiches la structure de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql> show create table livre_contributeur;
    Et le résultat donne un index (KEY) !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE `livre_contributeur` (
      `IDlivre` smallint(5) unsigned NOT NULL,
      `IDcontributeur` smallint(5) unsigned NOT NULL,
      KEY `FK_contribuer_1` (`IDcontributeur`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    Je viens d'essayer de faire pareil chez moi avec ton code et je n'ai pas cet index !

    Par contre, en créant d'abord la table puis les clés étrangères, les index sont créés automatiquement sur chacune des deux colonnes. Quand on ajoute la clé primaire, l'index individuel sur la première colonne de la clé primaire est supprimé automatiquement.
    Donc au final, les deux méthodes donnent le même résultat.

    Mais pas sûr que ça fonctionne pareil dans tous les SGBD alors retiens quand même la bonne méthode.
    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
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 51
    Par défaut
    Je viens de re-tester avec une BD vierge et effectivement je n'ai pas cette clef ... le fait de triturer cette pauvre base à une heure trop tardive --> boulette de ma part je ne pense pas qu'il faille chercher plus loin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mysql> SHOW CREATE TABLE livre_contributeur;
    +--------------------+----------------------------------------
    | Table              | Create Table
    +--------------------+----------------------------------------
    | livre_contributeur | CREATE TABLE `livre_contributeur` (
      `IDlivre` smallint(5) unsigned NOT NULL,
      `IDcontributeur` smallint(5) unsigned NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    +--------------------+----------------------------------------
    1 row in set (0.00 sec)

    Par contre, il est normal que ID Contributeur ait un index indépendant car dans la clé primaire cette colonne n'est indexée que relativement à IDLivre.

    Clé primaire :
    IDLivre / IDContributeur
    1 / 1
    1 / 2
    1 / 5
    2 / 1
    3 / 6
    3 / 8
    4 / 5
    4 / 6

    On voit que IDContributeur n'est pas trié tout seul mais pour chaque valeur de IDLivre.
    Mais du coup cela m'intrigue La clef primaire peut être de la forme (IDLivre ,IDContributeur) ou (IDContributeur,IDLivre) :


    IDLivre / IDContributeur ou IDContributeur /IDLivre
    1 / 1 __________________________________1 / 1
    1 / 2 __________________________________1 / 2
    1 / 5 __________________________________2 / 1
    2 / 1 __________________________________5 / 1
    3 / 6 __________________________________5 / 4
    3 / 8 __________________________________6 / 3
    4 / 5 __________________________________6 / 4
    4 / 6 __________________________________8 / 3

    note : la ligne de underscore me sert juste à tabuler...

    Le quel est le plus approprié car la J'ai 2 clefs mais quand il y en a n dans une Bd conséquente cela doit avoir un gros impact sur les requêtes que l'on désire favoriser ?

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 51
    Par défaut
    j'ai trouvé une partie de la réponse http://fluxbb.fr/aide/doku.php?id=mysql_et_index

    Il est donc recommandé de poser des index sur les colonnes fréquemment utilisées en recherche, et seulement sur celles-ci.
    Si je comprend bien ce qui est expliqué sur cette url cela répond à la question que je me posai sur windev et cette fameuse clefs composé IDlivre_contributeur dans le MLD windev --> ce n'est que la représentation graphique d'un index composé des deux clefs primaire à la sauce windev. http://www.developpez.net/forums/d12...t-equivalents/

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 09/05/2008, 08h32
  2. Table de vérité et remplissage d'une table associée
    Par Frog74 dans le forum VBA Access
    Réponses: 9
    Dernier message: 07/05/2008, 14h21
  3. [VBA]Création d'une table VBA est-ce possible?
    Par bacchus30 dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/03/2007, 14h44
  4. Recherche de donnee dans une table associée
    Par josoft dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/07/2003, 15h22

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