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 :

WorkBench - Synchro Modele [MySQL-5.7]


Sujet :

MySQL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut WorkBench - Synchro Modele
    Bonjour,

    Je suis en train de modéliser ma base de données dans le WorkBench de MySQL.

    J'ai 2 tables suivantes :
    - USER (utilisateur)
    - ACTIVITE

    Une personne de la table USER peut avoir plusieurs enregistrements de la table activité. J'ai mis en place les relations suivantes :

    Nom : 2024-01-13_11h54_47.jpg
Affichages : 245
Taille : 79,2 Ko

    Les relations sont ainsi :

    Nom : 2024-01-13_11h55_18.jpg
Affichages : 243
Taille : 28,3 Ko

    Nom : 2024-01-13_11h55_25.jpg
Affichages : 237
Taille : 27,9 Ko

    Quand je synchronise le modèle, je bloque là dessus :

    Nom : 2024-01-13_11h57_23.jpg
Affichages : 241
Taille : 67,3 Ko

    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
    -- MySQL Workbench Synchronization
    -- Generated: 2024-01-13 11:57
    -- Model: New Model
    -- Version: 1.0
    -- Project: Name of the project
     
    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
    SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
     
    CREATE TABLE IF NOT EXISTS `crjour`.`USER` (
      `idUSER` INT(11) NOT NULL AUTO_INCREMENT,
      `USERlogin` VARCHAR(45) NOT NULL,
      `USERnom` VARCHAR(45) NOT NULL,
      `USERprenom` VARCHAR(45) NOT NULL,
      `USERmdp` VARCHAR(150) NOT NULL,
      `USERdetruit` CHAR(1) NOT NULL,
      PRIMARY KEY (`idUSER`),
      UNIQUE INDEX `idUSER_UNIQUE` (`idUSER` ASC) VISIBLE)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8;
     
    CREATE TABLE IF NOT EXISTS `crjour`.`ACTIVITE` (
      `idACTIVITE` INT(11) NOT NULL AUTO_INCREMENT,
      `ACTIVITEjour` DATE NOT NULL,
      `ACTIVITEmoment` VARCHAR(10) NOT NULL,
      `ACTIVITEreference` VARCHAR(10) NOT NULL,
      `ACTIVITEliaison` VARCHAR(10) NOT NULL,
      `ACTIVITEobs` LONGTEXT NOT NULL,
      `ACTIVITEenvoi` CHAR(1) NOT NULL,
      `ACTIVITEenvoidate` DATE NULL DEFAULT NULL,
      PRIMARY KEY (`idACTIVITE`))
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8;
     
    CREATE TABLE IF NOT EXISTS `crjour`.`USER_has_ACTIVITE` (
      `USER_idUSER` INT(11) NOT NULL,
      `ACTIVITE_idACTIVITE` INT(11) NOT NULL,
      PRIMARY KEY (`ACTIVITE_idACTIVITE`, `USER_idUSER`),
      INDEX `fk_USER_has_ACTIVITE_ACTIVITE1_idx` (`ACTIVITE_idACTIVITE` ASC) VISIBLE,
      INDEX `fk_USER_has_ACTIVITE_USER_idx` (`USER_idUSER` ASC) VISIBLE,
      CONSTRAINT `fk_USER_has_ACTIVITE_USER`
        FOREIGN KEY (`USER_idUSER`)
        REFERENCES `crjour`.`USER` (`idUSER`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION,
      CONSTRAINT `fk_USER_has_ACTIVITE_ACTIVITE1`
        FOREIGN KEY (`ACTIVITE_idACTIVITE`)
        REFERENCES `crjour`.`ACTIVITE` (`idACTIVITE`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8;
     
     
    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
    J'ai aussi tenté autre chose : ne pas avoir de table intermédiaire et ajouter la clé étrangère directement dans la table ACTIVITE :

    Nom : 2024-01-13_11h59_26.jpg
Affichages : 239
Taille : 42,6 Ko

    Même souci lors de la synchronisation du modèle :

    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
    -- MySQL Workbench Synchronization
    -- Generated: 2024-01-13 12:00
    -- Model: New Model
    -- Version: 1.0
    -- Project: Name of the project
     
    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
    SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
     
    CREATE TABLE IF NOT EXISTS `crjour`.`USER` (
      `idUSER` INT(11) NOT NULL AUTO_INCREMENT,
      `USERlogin` VARCHAR(45) NOT NULL,
      `USERnom` VARCHAR(45) NOT NULL,
      `USERprenom` VARCHAR(45) NOT NULL,
      `USERmdp` VARCHAR(150) NOT NULL,
      `USERdetruit` CHAR(1) NOT NULL,
      PRIMARY KEY (`idUSER`),
      UNIQUE INDEX `idUSER_UNIQUE` (`idUSER` ASC) VISIBLE)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8;
     
    CREATE TABLE IF NOT EXISTS `crjour`.`ACTIVITE` (
      `idACTIVITE` INT(11) NOT NULL AUTO_INCREMENT,
      `ACTIVITEjour` DATE NOT NULL,
      `ACTIVITEmoment` VARCHAR(10) NOT NULL,
      `ACTIVITEreference` VARCHAR(10) NOT NULL,
      `ACTIVITEliaison` VARCHAR(10) NOT NULL,
      `ACTIVITEobs` LONGTEXT NOT NULL,
      `ACTIVITEenvoi` CHAR(1) NOT NULL,
      `ACTIVITEenvoidate` DATE NULL DEFAULT NULL,
      `idUSER` INT(11) NOT NULL,
      PRIMARY KEY (`idACTIVITE`),
      INDEX `USER.idUSER_idx` (`idUSER` ASC) VISIBLE,
      CONSTRAINT `USER.idUSER`
        FOREIGN KEY (`idUSER`)
        REFERENCES `crjour`.`USER` (`idUSER`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8;
     
     
    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
    Nom : 2024-01-13_12h00_53.jpg
Affichages : 245
Taille : 58,2 Ko

    Je ne comprends pas ce qui ne va pas.

    Si on peut m'aiguiller ?

    Merci bcp.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    En fait, c'est l'index automatiquement ajouté quand j'ai renseigné en ajoutant ma clé étrangère :

    Nom : 2024-01-13_13h28_57.jpg
Affichages : 231
Taille : 57,7 Ko

    Nom : 2024-01-13_13h31_28.jpg
Affichages : 222
Taille : 69,1 Ko

    Nom : 2024-01-13_13h29_55.jpg
Affichages : 227
Taille : 37,9 Ko

    Je ne peux pas supprimer cet index vu qu'il est lié à la contrainte, sauf si je supprime ma clé étrangère.

    Je peux solutionner comment ce truc ?

    Merci

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 599
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    D'après votre modèle de données, une activité peut être pratiquée par plusieurs utilisateurs.
    Ce faisant, la colonne id_user n'a rien à faire dans la table ACTIVITE.
    Par ailleurs comme un utilisateur peut avoir plusieurs activités, on a donc une association n-aire qui justifie l'existence d'une table associative USER_has_ACTIVITE
    C'est dans cette table associative que doit se trouver la clef étranger id_user.
    Egalement, dans la table USER, comme id_user est la primary key, déclarer un index unique sur cette colonne est inutile : par définition, un clef primaire est obligatoirement unique.

    Pour éviter tous ces écueils, je vous recommande de ne pas utiliser workbench pour modéliser vos données, c'est un outil qui ne permet pas d'établir un MCD et donc qui ouvre la porte à pas mal d'erreur, dont celles que vous rencontrez.
    C'est une erreur de modéliser les données en se basant sur les tables, la bonne démarche c'est de poser le modèle conceptuel en fonction des règles de gestion, les tables ne doivent être qu'une conséquence de ces règles.
    Il existe des logiciels de modélisation, dont l'excellent Looping qui en plus est gratuit et que vous pouvez télécharger ICI

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    Merci beaucoup !

  5. #5
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 319
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 319
    Billets dans le blog
    17
    Par défaut
    Le serveur semble bloquer sur le mot-clef "VISIBLE".
    Par sûr que la visibilité des index soit supportée par MySQL 5 => Fais un simple CREATE TABLE à la main pour tester si c'est bien ça qui gêne, et oui, pas d'index UNIQUE à définir à la main sur la clef primaire, tu peux le supprimer
    Si oui il doit y avoir un paramètre quelque part sur Workbench pour préciser la version de serveur ciblée.

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

Discussions similaires

  1. [Entité-Association] Synchro entre MySQL Workbench et MariaDB
    Par CinePhil dans le forum Schéma
    Réponses: 1
    Dernier message: 28/02/2020, 20h33
  2. Réponses: 0
    Dernier message: 30/10/2012, 10h58
  3. Réponses: 0
    Dernier message: 08/07/2010, 22h09
  4. Réponses: 5
    Dernier message: 20/11/2009, 14h42
  5. programmation reseau - couche 2 du modele osi
    Par sahor dans le forum C++Builder
    Réponses: 3
    Dernier message: 06/11/2002, 18h33

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