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

PostgreSQL Discussion :

Conception: contrainte unique sur un champ parent de la table


Sujet :

PostgreSQL

  1. #1
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut Conception: contrainte unique sur un champ parent de la table
    Bonjour,

    J'ai une question conceptuelle. Je vais essayer d'illustrer la chose avec un exemple simple:

    J'ai 3 tables:
    ENTREPRISE (clé primaire NUM_ENTREPRISE)
    SERVICE (clé primaire NUM_SERVICE, clé étrangère NUM_ENTREPRISE)
    SALARIE (clé primaire NUM_SALARIE, clé étrangère NUM_SERVICE, NUMERO_CARTE )

    Un salarié fait partis d'un service, qui fait partis d'une entreprise. Un salarié à un numéro de carte.

    Mon problème est le suivant: je souhaite avoir un numéro de carte unique par entreprise.
    Le problème, c'est que si dans ma table SALARIE je met une contrainte d'unicité sur [NUM_SERVICE+NUMERO_CARTE], ça me garantira un numéro unique par service, mais pas par entreprise.
    La solution serait de créer une contrainte unique dans la table SALARIE sur le champ NUMERO_CARTE et sur le champ parent NUM_ENTREPRISE, mais c'est bien évidemment impossible.

    Une solution simple serait d'ajouter le champ NUM_ENTREPRISE dans la table SALARIE, mais ça ferait double emploi et je ne le souhaite pas.

    Avez-vous une idée?

    Merci d'avance!

    PS: Ma structure est bien évidemment beaucoup plus complexe, il s'agit là d'un exemple pour illustrer le problème.
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,


    D'un point de vue conception, un service n'a pas lieu d'exister sans entreprise.

    De ce fait il peut être considéré comme une entité faible. http://fsmrel.developpez.com/basesre...h/?page=1#L1.3

    Entreprise-0,n---Possede----(1,1)-Service

    Quand on passe vers le MPD, la clef primaire de la table entreprise deviendra de ce fait aussi une partie de la clef primaire du service.


    Du coup, vous aurez dans votre table salarié le couple id_ent / id_ser et celui_ci sera ok d'un point de vue intégrité.



    Une autre approche :

    De mon point de vue ce n'est pas l'employé qui détermine un numéro de carte.
    Mais c'est l'entreprise qui possède 0 à n numéro de carte.

    Ce couple est ensuite associé à un employé.

    Le numéro de carte étant juste un numéro je ne vois pas l'intérêt de générer une table quand on passe au MPD.

    On gardera juste la table d'association découlant de :
    Entreprise-0,n-----associé-----0,n-Numéro_carte

    il reste à placer nos employés la dedans tout en évitant le cycle que cela induit (entre employé et la table d'association)


    R_ENT_CARTE(#ENTREPRISE_ID, NUM_CARTE, #SALARIE_ID)
    (en gras les clef primaires, #pour les clefs étrangères)

    Le numéro de carte est donc supprimé de la table des salariés.



    Vous pourriez avoir des réponses plus pertinente en postant ici : http://www.developpez.net/forums/f62...sation/schema/

  3. #3
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Merci, je vais étudier tout ça!
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    Sinon, rien n'empêche d'implémenter un curseur qui vérifiera l'unicité lors des mises à jour INSERT et UPDATE sur les deux tables.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. Condition UNIQUE sur plusieurs champs
    Par knolz dans le forum SQL
    Réponses: 4
    Dernier message: 31/01/2013, 04h06
  2. Une contrainte "unique" sur une clé primaire
    Par Invité1 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/04/2010, 21h11
  3. liste unique sur plusieurs champs
    Par nicolas.poulain dans le forum Requêtes
    Réponses: 3
    Dernier message: 22/01/2009, 08h47
  4. Couple unique sur 2 champs
    Par creale10 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 11/09/2007, 16h54
  5. [TopCased] contrainte {unique} sur une composition
    Par big x dans le forum Diagrammes de Classes
    Réponses: 3
    Dernier message: 03/07/2007, 14h04

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