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

Développement SQL Server Discussion :

Clé primaire, étrangère et composite


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Par défaut Clé primaire, étrangère et composite
    Bonjour,

    Débutant dans le domaine des SGBDR, je rencontre un problème.
    Je dispose de 2 tables:
    Table Liste : ID_personne(PK) / nom / prenom / tel
    Table Metier : ID_metier(PK) / Metier

    il faudrait que je crée une table qui associerait à 1 personne, 1 ou plusieurs métiers.
    Je pensais en faire une qui n'aurait que 2 colonnes : ID_Metier / ID_Personne dont la clé primaire serait l'association des 2 colonnes. Mon idée est-elle bonne? Est-il possible de faire ça? (j'ai essayé mais je n'arrive pas à le spécifier).

    Merci,

    Ed.

    Edouard.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Je pensais en faire une qui n'aurait que 2 colonnes : ID_Metier / ID_Personne dont la clé primaire serait l'association des 2 colonnes. Mon idée est-elle bonne?
    Oui, puisque c'est une relation n à n.

    Est-il possible de faire ça?
    Il vous faut créer la table en mettant les contraintes de clé étrangère, et un spécifiant la clé primaire sur les deux colonnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE personne_metier
    (
    	ID_personne INT NOT NULL CONSTRAINT FK_personne_metier__ID_personne FOREIGN KEY (ID_personne) REFERENCES dbo.Liste
    	, ID_metier INT NOT NULL CONSTRAINT FK_personne_metier__ID_metier FOREIGN KEY (ID_metier) REFERENCES dbo.metier
    	, CONSTRAINT PK_personne_metier PRIMARY KEY (ID_personne, ID_metier)
    )
    Néanmoins comme je l'ai dit ici, il n'est pas très avantageux d'avoir une clé primaire composite.

    Si vous allez référencer cette table dans d'autres tables, vous avez tout intérêt à spécifier votre table comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE personne_metier
    (
    	ID_personne_metier INT NOT NULL IDENTITY CONSTRAINT PK_personne_metier PRIMARY KEY
    	, ID_personne INT NOT NULL CONSTRAINT FK_personne_metier__ID_personne FOREIGN KEY (ID_personne) REFERENCES dbo.Liste
    	, ID_metier INT NOT NULL CONSTRAINT FK_personne_metier__ID_metier FOREIGN KEY (ID_metier) REFERENCES dbo.metier
    	, CONSTRAINT UQ_personne_metier__ID_personne__ID_metier UNIQUE (ID_personne, ID_metier)
    )
    De cette façon vous n'avez plus qu'à référencer une seule colonne : ID_personne_metier.

    @++

  3. #3
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Par défaut
    Citation Envoyé par elsuket Voir le message

    Si vous allez référencer cette table dans d'autres tables, vous avez tout intérêt à spécifier votre table comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE personne_metier
    (
    	ID_personne_metier INT NOT NULL IDENTITY CONSTRAINT PK_personne_metier PRIMARY KEY
    	, ID_personne INT NOT NULL CONSTRAINT FK_personne_metier__ID_personne FOREIGN KEY (ID_personne) REFERENCES dbo.Liste
    	, ID_metier INT NOT NULL CONSTRAINT FK_personne_metier__ID_metier FOREIGN KEY (ID_metier) REFERENCES dbo.metier
    	, CONSTRAINT UQ_personne_metier__ID_personne__ID_metier UNIQUE (ID_personne, ID_metier)
    )
    De cette façon vous n'avez plus qu'à référencer une seule colonne : ID_personne_metier.

    @++
    Bonjour, merci pour le message. Mais j'avoue ne pas avoir compris cette deuxième solution, notamment "référencer cette table dans d'autres tables"...

    encore merci,

    Edouard.

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour, merci pour le message. Mais j'avoue ne pas avoir compris cette deuxième solution, notamment "référencer cette table dans d'autres tables"...
    Supposons que vous souhaitiez créer une table, que nous appelons formation_personne_metier, qui pour chaque métier exercé par une personne, stocke la liste des formations suivies.
    Pour ce faire vous devez donc référencer par une contrainte de clé étrangère la table personne_metier.

    Vous allez donc :

    - avec la première table personne_metier que je vous ai donné, devoir ajouter deux colonnes qui correspondent à la clé primaire de celle-ci dans la table formation_personne_metier
    - avec la seconde, seulement une colonne, puisque la clé primaire n'est composée que d'une seule colonne

    Cela permet donc :

    - d'avoir des tables moins larges (moins de colonnes), donc les pages de données de la table seront plus riches, donc vos requêtes plus rapides, d'autant que vos index seront moins larges et moins profonds
    - de simplifier vos jointures, puisqu'au lieu de devoir comparer deux entiers deux à deux entre ces deux tables (c'est à dire pour celle que je vous ai donné : 2 INT = 16 octets), vous n'en comparez qu'une seule (8 octets).
    Donc vous utilisez moins de puissance de calcul

    @++

  5. #5
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Par défaut
    Re,

    très bien, j'ai compris!
    merci beaucoup pour ces explications et de prendre un peu de votre temps pour les écrire.

    Edouard.

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Avec plaisir

    @++

Discussions similaires

  1. Problème modification clé primaire/étrangère (En cascade)
    Par nico.mathiss dans le forum Hibernate
    Réponses: 0
    Dernier message: 01/06/2013, 12h52
  2. Clés primaires/étrangères obligatoires?
    Par ganguill dans le forum SQL
    Réponses: 13
    Dernier message: 20/04/2010, 11h13
  3. clefs primaires/étrangères sous AS400
    Par kirua2150 dans le forum DB2
    Réponses: 5
    Dernier message: 04/09/2006, 15h12
  4. clefs primaires/étrangères sous AS400
    Par kirua2150 dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 15/07/2006, 21h22
  5. clé primaire composée de 2 clés étrangères
    Par Tigresse dans le forum Installation
    Réponses: 5
    Dernier message: 28/07/2003, 14h38

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