Bonsoir,
Bienvenue à toi Clément.
Envoyé par
clement.bouillier
Mon dilemme est que 2) fait qu'on met de la "neige" (terme utilisé par fsmrel...François si tu me reconnais) et qu'on "galère" un peu pour récupérer la BusinessLine...et que 1) fait que j'ai l'impression qu'on duplique de la donnée...
De fait, dans le 1er cas on produit de la redondance et ça mérite a priori une petite punition, tandis que dans le 2e cas le Bonhomme Null fait son apparition, ce qui vaut d’être traduit devant le Tribunal Relationnel...
Envoyé par
Oishiiii
Vous pourriez peut-être opter pour un MLD comme celui-ci:
BusinessLine(id)
ProductLine(id, id_businessLine)
CommercialInformation(id)
InfoProduct(id_productLine, id_commercialInformation)
InfoBusiness(id_business, id_commercialInformation)
Tout risque d'enneigement et ainsi écarté au niveau des tables.
Mais il faudra quand même passer par une vue si vous voulez à tout pris une représentation de ce type : Information(Id,IdBL,IdPL).
Hugh ! Oishiiii a bien parlé, puisqu’on évite le Bonhomme Null.
N.B. La clé primaire de la table InfoProduct est réductible, puisqu’il existe la dépendance fonctionnelle :
id_commercialInformation → id_productLine
Même chose pour la table InfoBusiness :
id_commercialInformation → id_business
=>
BusinessLine(id)
ProductLine(id, id_businessLine)
CommercialInformation(id)
InfoProduct(id_commercialInformation, id_productLine)
InfoBusiness(id_commercialInformation, id_businessLine)
Envoyé par
clement.bouillier
mettre contrainte d'exclusion entre InfoProduct et InfoBusiness (c'est l'un ou l'autre ou aucun) et déplacer le problème dans la(les) vue(s)...c'est une solution que j'ai déjà expérimenté et j'en suis moyennement content car les requêtes peuvent devenir plus complexes...
Il est un fait que l’utilisation d’une vue conduit à la mise en œuvre d’un trigger d’exclusion. On peut donc chercher plus simple. Dans la mesure où, par trigger, on insère une ligne dans la table InfoBusiness lors de l’insert d’une ligne dans la table InfoProduct, certes on produit de la redondance, mais il n’y a pas péril en la demeure, puisque le SGBD contrôle totalement les opérations.
Exemple avec SQL Server (cas de l’INSERT) :
1 2 3 4 5 6 7 8 9 10
| CREATE TRIGGER Cial_Prod_1 ON InfoProduct INSTEAD OF INSERT AS
INSERT INTO InfoProduct
SELECT id_commercialInformation, id_productLine
FROM inserted
;
INSERT INTO InfoBusiness
SELECT x.id_commercialInformation, y.id_businessLine
FROM inserted as x JOIN ProductLine as y
ON x.id_productLine = y.id_productLine
; |
Mais il ne faudra pas oublier de traiter du cas de l’UPDATE et du DELETE.
A noter que si l’on cherche à insérer une clé en double dans la table InfoBusiness (via le trigger ou en direct), on aura droit à un code retour de la part du SGBD, ce qui est la moindre des choses...
Partager