Une clé étrangère provenant de deux tables?

Bonjour,

Je dois créer une base SQL dont une table possède des références à d’autres tables, références qui doivent donc être des clés. Seulement, il y a plusieurs tables à prendre en compte.
Quelqu’un sait comment faire???

CREATE TABLE Appart (num_appart varchar2(3) constraint k2 primary key,
		      nom_site varchar2(20),
		      code_cat varchar2(2),
			  constraint c2 check (nom_site in ('Valthoriaz 1600','Valthoriaz 1800','Valthoriaz 2000') and code_cat in ('T1','T2','T3','T4')));

CREATE TABLE Periode (num_sem number(2),
			annee number(4),
			constraint k3 primary key (num_sem,annee));

CREATE TABLE Reservation (id varchar2(3) constraint r5 references Client(id),
			   num_appart varchar2(3),
			   num_sem number(2),
			   annee number(4),
			   date_demande date,
			   arrhes number(1),
			   constraint k6 foreign key (num_appart) references Appart(num_appart),
			   constraint k7 foreign key (num_sem, annee) references Periode(num_sem,annee));

Le problème se situe sur les deux dernières lignes. Ce code s’exécute correctement, mais selon moi je crée deux clés différentes non?

Merci d’avance

Bonjour,

Ton problème n’est pas très claire. La clé primaire migre et devient une clé étrangère.
Donc, ta table recevra 2 clés étrangères.

Les 2 clés étrangères sont ton identifiant unique dans ton cas.
Tu peux crée une clé composé, qui ne sers a rien autrement si tu veux forcément 1 champ qui les concatène.
Edité le 29/12/2010 à 16:57

En fait la clé de la table doit être (num_appart, num_sem, annee). Selon toi ça marche ce code?

Heu si tu as besoin d’une clef étrangère entre deux tables, c’est que ton modèle est faux et archi faux … et ce n’est de toute façon pas possible (ouf).

Par contre, si tu fais références à N autres tables, tu auras N clefs étrangères. C’est tout.

Je pense cependant que tu confonds avec la clef primaire où là ça dépend simplement de ce que tu stockes dans la table, et si c’est logique ou non. Pour moi ton client peut réserver n’importe quand, la même chambre, mais pas deux fois à la même période. Du coup, il me semble logique que ta clef primaire soit (id, num_apprt, num_sem, annee).

Mais d’un autre côté, tu ne peux pas avoir deux clients dans le même appartement, donc tu peux aussi bien dire que la clef primaire c’est (num_appart, num_sem, annee) => ça interdit un appartement d’être réservé par plus d’un client sur la même période.

C’est à toi de décider si c’est logique ou non : on peut envisager que la chambre est partagée entre deux clients, et dans ce cas la première clef primaire est valide…

Braiffe.

Dans l’énoncé, il est écrit que la clé doit effectivement être (num_appart, num_sem, annee).
Dois-je rajouter en plus une clé primaire?

Une clef primaire, faut voir.

Au boulot, on fait assez souvent une clef primaire de type numérique et technique, et une clef fonctionnelle (un index + contrainte d’unicité). Personnellement, je n’ai rien contre mais dans ton cas, tu peux faire de (num_appart, num_sem, annee) la clef primaire sans problème.

Pour le reste, le fait que ces colonnes fassent partie de clefs étrangères est indépendant du fait que cela fasse partie de la clef primaire de la table :slight_smile:

D’accord, merci :slight_smile:

Moi, je voiot tojours pas ou est le problème :slight_smile:
C’est juste du merise, la relation est du 1,n / 1,n.
Un APPARTEMENT est RESERVER a une ou plusieurs DATE.
A une DATE, un ou plusieurs APPARTEMENT sont RESERVER.

Au passage du MLD au MCD l’association “Reserver” devient au table qui a pour clé primaire les clés étrangères qui migrent.
Donc la clé primaire est k6 ET k7, num_appart ET num_sem, annee

Un petit lien pour réviser: www.sam-mag.com…