Vous n'êtes pas identifié(e).

#1 06/02/2020 11:21:51

Geo-x
Membre

Clé primaire ET clé étrangère ?

Bonjour à tous.

J'ai une question d'architecture sur mes bases Postgres.

J'ai les tables suivantes :

Table A {ID / Libelle}
Table B {ID / Libelle}

Un lien est possible entre les deux tables car les identifiants (ID) peuvent être identiques.
Comme dois-je déclarer mes contraintes ? Actuellement j'ai déclaré des clés primaires sur chacune des tables, mais en vérité, elles sont aussi les clés étrangères l'une de l'autre, est-ce possible de déclarer ces ID clés primaires et étrangères ?

Merci.

Geo-x

Hors ligne

#2 06/02/2020 12:24:11

rjuju
Administrateur

Re : Clé primaire ET clé étrangère ?

les identifiants (ID) peuvent être identiques


Cela me semble incompatible avec le principe de clé étrangère ?

Hors ligne

#3 06/02/2020 12:30:08

Geo-x
Membre

Re : Clé primaire ET clé étrangère ?

Ok merci, c'est ce qu'il me semblait.

Geo-x

Hors ligne

#4 06/02/2020 21:06:57

Marc Cousin
Membre

Re : Clé primaire ET clé étrangère ?

J'ai l'impression d'un quiproquo...

Je pense que la phrase voulait dire les identifiants (ID) peuvent être identiques entre les deux tables.

Dans ce cas, aucune impossibilité à avoir ID en PK sur les deux tables, et en FK référençant l'autre table. La seule difficulté en faisant ça, c'est de réussir à insérer des données (mettre les contraintes en deferrable initially deferred par exemple).

Par contre, une FK ce n'est pas "peuvent être identiques", mais "doivent être identiques". Si une table peut contenir des id qui ne sont pas dans l'autre, il n'y a plus de lien de FK dans ce sens.


Marc.

Hors ligne

#5 16/03/2020 17:09:13

SQLpro
Membre

Re : Clé primaire ET clé étrangère ?

Si tel est le cas votre modèle est mal fait. En effet ce que vous indiquez correspond à une association de type 1 à 1 dans un MCD, comme :
Homme <--> (marié) <--> femme
Dans un tel cas, le MPD correspondant est le suivant :

CREATE TABLE A (A_ID INT PRIMARY KEY, A_LIBELLE VARCHAR(32));
CREATE TABLE B (B_ID INT PRIMARY KEY, B_LIBELLE VARCHAR(32), A_ID INT REFERENCES A (A_ID));
ALTER TABLE A ADD B_ID INT REFERENCES B (B_ID);

Avec en sus 2 déclencheurs obligeant les couples A_ID et B_ID des deux tables d'avoir une correspondances absolue.

A +


Frédéric Brouard, alias SQLpro,  ARCHITECTE DE DONNÉES,  Expert langage SQL
Le site sur les SGBD relationnel et langage SQL   : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA, ISEN Toulon,  CESI Aix en Provence  * * * * *

Hors ligne

Pied de page des forums