Bonjour,
Je me pose une question à propos d'un modèle des données.
Le modèle utilise des clés composées. En donnant l'exemple du modèle, j'ai réfléchi à l'intérêt de mettre des clé atomiques, ça ne change rien au problème, donc je laisse le modèle "tel quel".
J'ai trois tables :
TTI (Type de tiers)
typtie
typfam (type tiers de la famille) fk vers TTI.typtie
nom
FAM (Famille)
typtie (type de tiers)
codfam (code de la famille)
nom
TIE (Tiers)
id
typtie (type du tiers) fk vers TTI.typtie
codfam (code famille) => Comment faire la FK ?
Explication :
Un tiers de type "CLI" client doit être dans une famille de type "CLI" (client).
Un tiers de type "PRO" prospect doit être dans une famille de type... "CLI" (client).
C'est donc le sens du champ TTI.typfam.
Lorsque je crée un TIE (tiers) de typtie "PRO", alors je dois saisir une famille de typtie "CLI".
Comment matérialiser un contrôle simplement ?
Je peux le faire avec un trigger, mais c'est assez lourd.
N'existe-t-il pas un mécanisme entre la FK et le trigger, qui permette de faire une FK conditionnée par une fonction ou une requête ?
C'est à dire, au lieu d'avoir :
TIE.CODFAM references FAM.CODFAM
Avoir :
(TIE.TYPTIE, TIE.CODFAM) references (select tti.typtie, fam.codfam from tti inner join fam where fam.typtie = tti.typfam)
Ou un mécanisme du genre ?
La solution permettant d'avoir une FK serait de recopier le TYPFAM dans la table TIE, mais on va à l'encontre des bonnes pratiques de modélisation, puisqu'on duplique de l'information pour rien, et surtout, rien n'empêchera alors d'avoir un tiers qui est rattaché à un type de famille qui n'a rien à voir avec celui déclaré dans TTI...
Aussi, existe-t-il un mécanisme permettant de faire pointer une FK sur un champ d'une vue et non d'une table ? (champ non calculé, la vue servant juste de filtre)
Partager