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 :

Une clé primaire commune entre deux tables, est-ce possible ? [8.3]


Sujet :

PostgreSQL

  1. #1
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 464
    Points : 203
    Points
    203
    Par défaut Une clé primaire commune entre deux tables, est-ce possible ?
    Salut tout le monde...
    je suis à la réalisation d'une application. Dans mon diagramme de classeq, j'ai la classe patient sportif qui hérite de la classe patient (non sportif).
    Sur PostgreSQL, j'ai créé mes deux tables patient et patientSportif et je veux qu'on ne trouve jamais un code du patient sportif égal à un code du patient ordinaire. C'est-à-dire que la clé primaire code, je veux qu'elle soit commune entre les deux tables...
    J'ai pensé à faire une table commune et autoriser les champs concernant le sportif à null, mais ça ne convient pas vraiment à mes besoins. Alors je veux deux tables avec une clé primaire.
    Si c'est possible, informez-moi s'il vous plaît.
    Merci d'avance

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Bien que ne connaissant pas particulièrement Postgre, je ne pense pas que mettre une clé primaire répartie sur 2 tables (ou plus) puisse être possible.

    A supposer même que seulement une règle d'unicité soit possible de la sorte, je pense que ça alourdirait pas mal la charge de travail du serveur.

    Je pense que tu pars sur une mauvaise modélisation.

    Soit tes tables Patient Sportif et Patient Non Sportif n'ont absolument rien en commun pour être dans des tables séparées, à ce moment là elles sont totalement indépendantes et vivent leur vie chacune de leur coté, soit elles beaucoup de points en commun (être des patients déjà), suffisamment pour que ces points en commun soient intégrés dans une table mère (une table Patient, voire une table Personne) dont les 2 hériteraient. Dans ce cas, la clé primaire de chaque table serait donc (héritage) une clé étrangère vers la primaire de la table mère. L'unicité se jouant alors ici directement dans la table mère.


    A noter que, si seulement peu de différences sépare les 2 tables Patient non sportif et Patient sportif, elles peuvent être combiné en une seule table avec une info (champ de type booléan par exemple) différenciant le type de patient.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 464
    Points : 203
    Points
    203
    Par défaut
    Merci beaucoup Yevs ...
    Pour le patient sportif, il a trois attributs en plus par rapport à un patient ordinaire... Je dois gérer chacun indépendamment de l'autre. Je vais gérer un centre médical qui était dédié seulement aux sportifs ayant une activité au sein du stade principal de ma wilaya. Après, ils ont autorisé les consultations des citoyens n'ayant aucune activité sportive. Alors il y a certaines statistiques qui ne se font que sur les patients sportifs...
    Je vais essayer de voir avec l'idée de la clé étrangère ,et j’espère m'y retrouver.

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Ok, en retournant les choses :

    - tu as une base existante de patients, considérés sportifs par défaut.
    - tu rajoute maintenant des patients qui ne sont pas sportifs.
    - ces patients n'ont que trois attributs en moins par rapports aux patients par défaut
    - et, implicitement, un attribut en plus, ils ne sont pas sportifs.

    Maintenant, les pistes à étudier :
    - Concernant les 3 attributs, il faut voir si cela peut poser problème dans la totalité du logiciel, qu'ils ne soient pas renseignés (patients non sportifs)
    - Concernant les stats et parties du programme, s'il est possible d'y apporter une modification enfin de prendre en compte (ou plutot ignorer ici) un certain nombre de patients selon un critère particulier, l'attribut "Non Sportif" justement.
    - Voir si la base est modifiable.

    Si tout cela ne pose pas de problème particulier, tu dois pouvoir utiliser la même table pour tous tes patients. Tu rajoute juste un champs, type bit/boolean/True-False, ... pour enregistrer l'information "Non Sportif" de tes patients.
    Ensuite il faut reprendre le(s) logiciel(s) consommant ces données là pour que, là ou la liste des patient était utilisée, désormais c'est la liste des patients ou l'attribut "Non Sportif" est à Faux qui soit utilisée.


    Maintenant, c'est toi qui a la problématique entre les mains, c'est toi qui connais la structure de tes données et de ton système, c'est à toi de voir si cette piste est convenable, ou s'il faut que tu passe par d'autres pistes (tables indépendantes, héritage avec clé étrangère, etc).
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  5. #5
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 464
    Points : 203
    Points
    203
    Par défaut merci
    J'ai bien réfléchi à ce que vous m'avez proposé, et je vois l'idée du booleen true pour sportif et false pour non sportif très intéressante et je vais l'utiliser.
    Je vous remercie beaucoup pour votre aide.
    Cordialement

  6. #6
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,
    pourquoi ne pas passer par l'héritage de table?

    patients (tu y définis les données communes)
    |
    +-sportifs (tu y définis les données spécifiques en plus)

    ça répondrait à ta problématique

    tu as des exemples dans la doc postgreSQL pour gérer une table ville et une table capitale qui hérite d'elle.
    l'avantage tu peux interroger la table globale (patients) ou seulement la table sportifs selon les besoins.

    et oui tu peux utiliser une séquence commune aux 2 tables pour garantir l'unicité des identifiants.
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  7. #7
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    C'est bien ce qui a été proposé, sachant que l'héritage ne se traduit pas forcément par des tables supplémentaires.

    Par exemple, si l'héritier n'a que peu d'attributs en plus, ou que même n'a pas d'attribut supplémentaire, un simple champ indiquant son status d'héritier (ici "EstSportif") suffit dans la table d'origine
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  8. #8
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    je n'ai pas dit le contraire, j'ai juste rajouté la version implémentée dans postgreSQL vu que tu n'en parles pas vraiment... alors que ça existe en natif

    après, c'est clair que ta solution est tout à fait un bon patch à son problème
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  9. #9
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Oui, je parlais en généralité, pas spécifiquement à un SGBD.

    D'ailleurs comme je l'ai dit, je ne connais pas (bien) PostgreSQL
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

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

Discussions similaires

  1. Cette requête sur deux tables est-elle possible ?
    Par Alain.g dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/04/2012, 03h31
  2. colonne commune entre deux tables
    Par mina-info dans le forum Sql Developer
    Réponses: 5
    Dernier message: 23/08/2011, 16h11
  3. Communication entre deux tables.
    Par betsprite dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 15/07/2010, 09h55
  4. comment trouve la difference dans un champ commun entre deux tables
    Par pmorth dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/02/2008, 06h04
  5. Cle etrangere entre deux schemas : est-ce possible ?
    Par fpoirier dans le forum Oracle
    Réponses: 2
    Dernier message: 13/09/2007, 14h16

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