Partage
  • Partager sur Facebook
  • Partager sur Twitter

Relation n:n grâce a une table

Clé primaire ? MySQLWorkBench

Sujet résolu
    2 décembre 2010 à 17:45:55

    Bonjour, voila je suis entrain de réaliser un mcd de ma future bdd.
    En ce qui concerne les relations de type n:n, j'ai un petit soucis.

    Normalement, dans une relation de type n:n, on crée une table qui permet la jointure entres les deux autres tables.
    Et si ma réflexion est bonne, normalement ce sont deux clés primaires.
    Voici mon schémas (concernant mp_participants)

    Image utilisateur

    Ce que je ne comprends pas, MYSQL WorkBench, me met les deux champs en clé primaire, mais en plus de ça, il me met membre_id en index... je ne comprends pas, et surtout je trouve que ça n'a aucun intérêt.

    Pourriez vous m'éclaircir sur ce point ?
    • Partager sur Facebook
    • Partager sur Twitter
      2 décembre 2010 à 18:21:56

      C'est pour accélérer la recherche. C'est pas le seul éditeur qui fait ça. Le mien crée aussi automatiquement un index sur une clé étrangère.
      • Partager sur Facebook
      • Partager sur Twitter
        2 décembre 2010 à 18:24:45

        mais une clé primaire = index + unique alors je ne comprends pas.
        Et pourquoi sur membre_id et pas messages_prives
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          2 décembre 2010 à 19:33:12

          Citation : Ghostaunt

          mais une clé primaire = index + unique alors je pige pas.


          Ce genre d'affirmation n'a aucun sens.

          Commence par essayer de comprendre ce qu'est une clé primaire, une clé unique et index.

          Une clé primaire peut être composée de plusieurs colonnes. C'est tout à fait normal.

          Citation


          Et pourquoi sur membre_id et pas messages_prives


          Parce-que MySQL Workbench doit certainement créer un index derrière chaque clé étrangère automatiquement.
          Certes ce n'est pas forcément utile.
          • Partager sur Facebook
          • Partager sur Twitter
            2 décembre 2010 à 19:43:19

            Citation : Cintre Sournois


            Parce-que MySQL Workbench doit certainement créer un index derrière chaque clé étrangère automatiquement.



            Si je suis ta logique, il est censé créer deux index, étant donné que j'ai deux relation sur deux clés étrangère.

            Image utilisateur

            Donne moi une explication compréhensible, si ce que je dit n'a aucun sens
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              2 décembre 2010 à 19:52:26

              Ce n'est pas ma "logique" c'est une supposition...

              Et si tu commençais par nous montrer le script SQL réellement générer par MySQL Workbench ???
              • Partager sur Facebook
              • Partager sur Twitter
                2 décembre 2010 à 20:01:59

                -- -----------------------------------------------------
                
                -- Table `mydb`.`membres`
                
                -- -----------------------------------------------------
                
                CREATE  TABLE IF NOT EXISTS `mydb`.`membres` (
                
                  `id` INT NOT NULL AUTO_INCREMENT ,
                
                  `pseudo` VARCHAR(45) NOT NULL ,
                
                  `password` VARCHAR(45) NOT NULL ,
                
                  `email` VARCHAR(255) NOT NULL ,
                
                  `avatar` VARCHAR(255) NULL ,
                
                  `signature` TEXT NULL ,
                
                  PRIMARY KEY (`id`) ,
                
                  UNIQUE INDEX `pseudo_UNIQUE` (`pseudo` ASC) )
                
                ENGINE = InnoDB;
                
                
                
                
                
                -- -----------------------------------------------------
                
                -- Table `mydb`.`news_cats`
                
                -- -----------------------------------------------------
                
                CREATE  TABLE IF NOT EXISTS `mydb`.`news_cats` (
                
                  `id` INT NOT NULL AUTO_INCREMENT ,
                
                  `nom` VARCHAR(255) NOT NULL ,
                
                  `description` VARCHAR(45) NOT NULL ,
                
                  `image` VARCHAR(45) NULL ,
                
                  PRIMARY KEY (`id`) )
                
                ENGINE = InnoDB;
                
                
                
                
                
                -- -----------------------------------------------------
                
                -- Table `mydb`.`news`
                
                -- -----------------------------------------------------
                
                CREATE  TABLE IF NOT EXISTS `mydb`.`news` (
                
                  `id` INT NOT NULL AUTO_INCREMENT ,
                
                  `titre` VARCHAR(255) NOT NULL ,
                
                  `contenu` TEXT NOT NULL ,
                
                  `date` DATETIME NOT NULL ,
                
                  `date_update` DATETIME NOT NULL ,
                
                  `news_cat_id` INT NOT NULL ,
                
                  `membres_id` INT NOT NULL ,
                
                  PRIMARY KEY (`id`) ,
                
                  INDEX `fk_news_news_cat` (`news_cat_id` ASC) ,
                
                  INDEX `fk_news_membres1` (`membres_id` ASC) ,
                
                  CONSTRAINT `fk_news_news_cat`
                
                    FOREIGN KEY (`news_cat_id` )
                
                    REFERENCES `mydb`.`news_cats` (`id` )
                
                    ON DELETE NO ACTION
                
                    ON UPDATE NO ACTION,
                
                  CONSTRAINT `fk_news_membres1`
                
                    FOREIGN KEY (`membres_id` )
                
                    REFERENCES `mydb`.`membres` (`id` )
                
                    ON DELETE NO ACTION
                
                    ON UPDATE NO ACTION)
                
                ENGINE = InnoDB;
                
                
                
                
                
                -- -----------------------------------------------------
                
                -- Table `mydb`.`membres_droits`
                
                -- -----------------------------------------------------
                
                CREATE  TABLE IF NOT EXISTS `mydb`.`membres_droits` (
                
                  `id` INT NOT NULL AUTO_INCREMENT ,
                
                  `nom` VARCHAR(45) NOT NULL ,
                
                  `droit` TINYINT NOT NULL ,
                
                  PRIMARY KEY (`id`) )
                
                ENGINE = InnoDB;
                
                
                
                
                
                -- -----------------------------------------------------
                
                -- Table `mydb`.`membres_droits_has_membres`
                
                -- -----------------------------------------------------
                
                CREATE  TABLE IF NOT EXISTS `mydb`.`membres_droits_has_membres` (
                
                  `membres_droits_id` INT NOT NULL ,
                
                  `membres_id` INT NOT NULL ,
                
                  PRIMARY KEY (`membres_droits_id`, `membres_id`) ,
                
                  INDEX `fk_membres_droits_has_membres_membres1` (`membres_id` ASC) ,
                
                  CONSTRAINT `fk_membres_droits_has_membres_membres_droits1`
                
                    FOREIGN KEY (`membres_droits_id` )
                
                    REFERENCES `mydb`.`membres_droits` (`id` )
                
                    ON DELETE NO ACTION
                
                    ON UPDATE NO ACTION,
                
                  CONSTRAINT `fk_membres_droits_has_membres_membres1`
                
                    FOREIGN KEY (`membres_id` )
                
                    REFERENCES `mydb`.`membres` (`id` )
                
                    ON DELETE NO ACTION
                
                    ON UPDATE NO ACTION)
                
                ENGINE = InnoDB;
                
                
                
                
                
                -- -----------------------------------------------------
                
                -- Table `mydb`.`messages_prives`
                
                -- -----------------------------------------------------
                
                CREATE  TABLE IF NOT EXISTS `mydb`.`messages_prives` (
                
                  `id` INT NOT NULL AUTO_INCREMENT ,
                
                  `sujet` VARCHAR(255) NOT NULL ,
                
                  `message` TEXT NOT NULL ,
                
                  `date` DATETIME NOT NULL ,
                
                  `auteur_id` INT NOT NULL ,
                
                  PRIMARY KEY (`id`) ,
                
                  INDEX `fk_messages_prives_membres1` (`auteur_id` ASC) ,
                
                  CONSTRAINT `fk_messages_prives_membres1`
                
                    FOREIGN KEY (`auteur_id` )
                
                    REFERENCES `mydb`.`membres` (`id` )
                
                    ON DELETE NO ACTION
                
                    ON UPDATE NO ACTION)
                
                ENGINE = InnoDB;
                
                
                
                
                
                -- -----------------------------------------------------
                
                -- Table `mydb`.`mp_participants`
                
                -- -----------------------------------------------------
                
                CREATE  TABLE IF NOT EXISTS `mydb`.`mp_participants` (
                
                  `messages_prives_id` INT NOT NULL ,
                
                  `membres_id` INT NOT NULL ,
                
                  PRIMARY KEY (`messages_prives_id`, `membres_id`) ,
                
                  INDEX `fk_mp_participants_membres1` (`membres_id` ASC) ,
                
                  CONSTRAINT `fk_mp_participants_messages_prives1`
                
                    FOREIGN KEY (`messages_prives_id` )
                
                    REFERENCES `mydb`.`messages_prives` (`id` )
                
                    ON DELETE NO ACTION
                
                    ON UPDATE NO ACTION,
                
                  CONSTRAINT `fk_mp_participants_membres1`
                
                    FOREIGN KEY (`membres_id` )
                
                    REFERENCES `mydb`.`membres` (`id` )
                
                    ON DELETE NO ACTION
                
                    ON UPDATE NO ACTION)
                
                ENGINE = InnoDB;
                


                En fait, je sais pas si tu as réellement compris ma question, je me suis peux être mal exprimé, j'aimerais comprendre pourquoi les relations dans une table avec plusieurs clés primaires, ne sont pas pris en compte "pour les relations" et obligatoirement les passer en "index".
                Pour la première clé étrangère, apparemment il n'y a pas besoin de le définir en INDEX, mais pour celle qui sont après, il le faut.
                • Partager sur Facebook
                • Partager sur Twitter

                Relation n:n grâce a une table

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown