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 :

Clé primaire multicolonne ou contrainte d'unicité multicolonne ?


Sujet :

Schéma

  1. #1
    Membre régulier
    Homme Profil pro
    Webmaster
    Inscrit en
    Septembre 2016
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2016
    Messages : 67
    Points : 90
    Points
    90
    Par défaut Clé primaire multicolonne ou contrainte d'unicité multicolonne ?
    Bonjour,

    J'ai une petite question concernant les associations plusieurs-à-plusieurs.
    Lorsque l'on souhaite avoir une contrainte d'unicité entre deux clés étrangères d'une association plusieurs-à-plusieurs, faut-il privilégier une clé primaire multicolonne ou une contrainte d'unicité multicolonne ?

    Par exemple, dans le cas de garnitures de pizzas :

    [PIZZA] 1,n --- (posséder) --- 1,n [GARNITURE]

    Je cherche à forcer l'unicité de l'association entre une garniture et une pizza. Une pizza ne peut pas avoir 2 éléments de garniture identiques (par exemple, 2 fois des anchois).

    je pourrai faire ceci (pour Postgresql) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE garniture_pizza(
        pizza_id BIGINT NOT NULL,
        garniture_id BIGINT NOT NULL
        CONSTRAINT pizza_garniture PRIMARY KEY (pizza_id, garniture_id)
    );
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE garniture_pizza(
        pizza_id BIGINT NOT NULL,
        garniture_id BIGINT NOT NULL,
        UNIQUE (pizza_id, garniture_id)
    );
    Dans ce dernier cas, il n'y a pas de clé primaire. Je peux ajouter des index sur chaque colonne, si nécessaire.

    Est-ce que ma réflexion est censée et quelle est la solution à privilégier ?

    Vincent

  2. #2
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 714
    Points : 2 915
    Points
    2 915
    Par défaut
    Bonsoir,

    Partons du MCD suivant :
    Nom : aras-vbo.jpg
Affichages : 106
Taille : 11,0 Ko
    Voici le MLD correspondant :
    Nom : aras-vbo-MLD.jpg
Affichages : 113
Taille : 10,4 Ko
    Et donc le LDD :
    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
    CREATE TABLE Pizza(
       Pizza_id BIGINT,
       Libellé VARCHAR(50),
       PRIMARY KEY(Pizza_id)
    );
    
    
    CREATE TABLE Garniture(
       Garniture_Id BIGINT,
       Description VARCHAR(50),
       PRIMARY KEY(Garniture_Id)
    );
    
    
    CREATE TABLE Posséder(
       Pizza_id BIGINT,
       Garniture_Id BIGINT,
       PRIMARY KEY(Pizza_id, Garniture_Id),
       FOREIGN KEY(Pizza_id) REFERENCES Pizza(Pizza_id),
       FOREIGN KEY(Garniture_Id) REFERENCES Garniture(Garniture_Id)
    );
    Bonne continuation !

  3. #3
    Membre régulier
    Homme Profil pro
    Webmaster
    Inscrit en
    Septembre 2016
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2016
    Messages : 67
    Points : 90
    Points
    90
    Par défaut
    Bonjour Paprick,

    Merci pour votre réponse.
    Oups ! j'avais oublié les 2 références aux clés étrangères dans mes scripts de création...

    Ceci dit, est-il possible de substituer la clé primaire (fk1, fk2) par une contrainte UNIQUE (fk1, fk2) tout en ajoutant des index sur fk1 et fk2 ?
    Est-ce que cela a seulement un intérêt ?

    Vincent

  4. #4
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 714
    Points : 2 915
    Points
    2 915
    Par défaut
    Bonjour,
    Citation Envoyé par aras-vbo Voir le message
    Ceci dit, est-il possible de substituer la clé primaire (fk1, fk2) par une contrainte UNIQUE (fk1, fk2) tout en ajoutant des index sur fk1 et fk2 ?
    Est-ce que cela a seulement un intérêt ? Vincent
    Je n'y vois clairement AUCUN intérêt : une clé primaire est naturellement UNIQUE et indexée ; de plus, la relation PK-FK est à la base du fonctionnement de tout SGBD relationnel.

Discussions similaires

  1. [AC-2003] Créer une contrainte d'unicité basé sur deux champs(hors clé primaire)
    Par adelcrb dans le forum Modélisation
    Réponses: 1
    Dernier message: 31/08/2013, 22h06
  2. Réponses: 5
    Dernier message: 17/07/2008, 12h40
  3. Réponses: 6
    Dernier message: 12/12/2006, 14h30
  4. gestion des contraintes d'unicité
    Par GMI3 dans le forum Oracle
    Réponses: 2
    Dernier message: 05/12/2006, 18h00
  5. contrainte d'unicité un peu spéciale....
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 23/11/2004, 18h54

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