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

Schéma Discussion :

Relations bidirectionnelles entre 3 tables


Sujet :

Schéma

  1. #1
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut Relations bidirectionnelles entre 3 tables
    Bonjour,

    je dois faire évoluer la base (simplifiée) suivante :
    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
    -- ----------------------------------------------------------------------------------
    -- T_GROUPE
    -- ----------------------------------------------------------------------------------
    CREATE TABLE `t_groupe` (
      `id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
      `nom` VARCHAR(100) NOT NULL,
      PRIMARY KEY (`id`),
      INDEX (`nom`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO `t_groupe` (`id`, `nom`) VALUES
    (1, "Groupe 1"),
    (2, "Groupe 2");
    
    -- ----------------------------------------------------------------------------------
    -- T_ETABLISSEMENT
    -- ----------------------------------------------------------------------------------
    CREATE TABLE `t_etablissement` (
      `id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
      `nom` VARCHAR(100) NOT NULL,
      `id_groupe` SMALLINT(5) UNSIGNED,
      PRIMARY KEY (`id`),
      INDEX (`nom`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO `t_etablissement` (`id`, `nom`, `id_groupe`) VALUES
    (1, "Etablissement 1", 1),
    (2, "Etablissement 2", 1),
    (3, "Etablissement 3", NULL),
    (4, "Etablissement 4", 2);
    
    -- ----------------------------------------------------------------------------------
    -- T_PERSONNE
    -- ----------------------------------------------------------------------------------
    CREATE TABLE `t_personne` (
      `id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
      `civilite` ENUM("","Mr","Mme","Mlle") NOT NULL,
      `nom` VARCHAR(255) NOT NULL,
      PRIMARY KEY  (`id`),
      KEY (`nom`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO `t_personne` (`id`, `civilite`, `nom`)
    VALUES
    (1, "Mr", "AA"),
    (2, "Mr", "BB"),
    (3, "Mme", "CC"),
    (4, "Mme", "DD"),
    (5, "Mr", "EE");
    
    -- ----------------------------------------------------------------------------------
    -- T_APPARTENANCE
    -- ----------------------------------------------------------------------------------
    CREATE TABLE `t_appartenance` (
      `id_personne` SMALLINT(5) UNSIGNED NOT NULL,
      `id_etablissement` SMALLINT(5) UNSIGNED NOT NULL,
      PRIMARY KEY  (`id_personne`, `id_etablissement`),
      FOREIGN KEY (`id_personne`) REFERENCES `t_personne` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      FOREIGN KEY (`id_etablissement`) REFERENCES `t_etablissement` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO `t_appartenance` (`id_personne`, `id_etablissement`)
    VALUES
    (3, 1), -- CC appartient à l'établissement 1 du groupe 1
    (3, 2), -- CC appartient à l'établissement 2 du groupe 1
    (4, 1), -- DD appartient à l'établissement 1 du groupe 1
    (5, 3); -- EE appartient à l'établissement 3
    Explications :
    - une personne appartient à 0 ou plusieurs établissements
    - un établissement fait parti ou non d'un groupe

    Jeu d'essais :
    - la personne 3 (CC) appartient à l'établissement 1 du groupe 1
    - la personne 3 (CC) appartient à l'établissement 2 du groupe 1
    - la personne 4 (DD) appartient à l'établissement 1 du groupe 1
    - la personne 5 (EE) appartient à l'établissement 3

    A présent, j'aimerais rajouter la notion "en relation avec" (rien a avoir avec la notion d'appartenance montrée plus haut), c'est à dire enregistrer dans la base les relations bidirectionnelles entre les 3 entités principales (groupe, établissement et personne).

    J'aimerais par exemple, enregistrer le fait que :
    - la personne 1 (AA) est en relation avec l'établissement 4
    - l'établissement 2 est en relation à l'établissement 3
    - la groupe 1 est en relation avec la personne 2 (BB)

    En fait, il faudra mettre en relation les 3 entités G, E et P sans restriction...

    En espérant avoir été suffisamment clair, pourriez-vous m'indiquer la manière de faire SVP ?
    Un GRAND merci d'avance !

    @ bientôt

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Pour commencer, pourquoi n'y a t-il pas de contrainte de clé étrangère dans la table t_etablissement ?

    Maintenant sur la question posée :
    A présent, j'aimerais rajouter la notion "en relation avec" (rien a avoir avec la notion d'appartenance montrée plus haut), c'est à dire enregistrer dans la base les relations bidirectionnelles entre les 3 entités principales (groupe, établissement et personne).

    J'aimerais par exemple, enregistrer le fait que :
    - la personne 1 (AA) est en relation avec l'établissement 4
    - l'établissement 2 est en relation à l'établissement 3
    - la groupe 1 est en relation avec la personne 2 (BB)

    En fait, il faudra mettre en relation les 3 entités G, E et P sans restriction...
    Si je comprends bien, tu auras 3 associations supplémentaires dans ton MCD :
    Groupe -0,n----EtreEnRelation1----0,n- Etablissement
    Etablissement -0,n----EtreEnRelation2----0,n- Personne
    Personne -0,n----EtreEnRelation3----0,n- Groupe

    Et donc il y aura 3 tables associatives.

    En plus, d'après cette phrase :
    - l'établissement 2 est en relation à l'établissement 3
    Il faut aussi des associations réflexives sur les 3 tables :
    Groupe -0,n----EtreEnRelation4----0,n- Groupe
    Etablissement -0,n----EtreEnRelation5----0,n- Etablissement
    Personne -0,n----EtreEnRelation6----0,n- Personne

    Donc encore trois tables associatives supplémentaires.

    Bon courage !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    effectivement, il manque une clé étrangère à t_etablissement de ma base simplifiée...
    correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE `t_etablissement` (
      `id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
      `nom` VARCHAR(100) NOT NULL,
      `id_groupe` SMALLINT(5) UNSIGNED,
      PRIMARY KEY (`id`),
      INDEX (`nom`),
      FOREIGN KEY (`id_groupe`) REFERENCES `t_groupe` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    donc comme je le craignait... y a pas de méthode simple.

    J'avais bien vu les 3 associations entre les 3 entités mais j'avais pas pensé à la réflexivité... ce qui donne 6 tables supplémentaires si je ne m'abuse (pluss que le schéma de base !)

    Je vais voir ce que je trouve sur la réflexivité sous MySQL 5 et je reviens.
    Merci pour ton aide CinePhil !

    @+

Discussions similaires

  1. Relation Simple entre 2 tables
    Par tidou95220 dans le forum Modélisation
    Réponses: 12
    Dernier message: 12/12/2011, 17h31
  2. [AC-2007] Relation cyclique entre deux tables
    Par GonzooJC dans le forum Access
    Réponses: 9
    Dernier message: 09/11/2011, 14h36
  3. [SQL] Relations complexes entre deux tables
    Par simonoche dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/06/2007, 00h23
  4. [novice] relation fk entre deux tables
    Par localhost dans le forum Langage SQL
    Réponses: 1
    Dernier message: 30/10/2005, 06h33
  5. relation double entre deux tables
    Par thibautche dans le forum Langage SQL
    Réponses: 6
    Dernier message: 04/05/2005, 11h31

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