Bonjour,
Envoyé par
Miko95
pourquoi il n'y a pas de nom pour l'association entre Facture et LigneFactureSoin ?
Il n’y a pas de nom parce que je vous laisse choisir celui qui vous fait plaisir. L’objet de mes remarques ne porte pas sur la façon de nommer les associations-types.
Envoyé par
Miko95
LigneFactureSoin est a définir comme une entité ou comme une association? Je vois que vous faites la différence entre [] et (). Le premier c'est pour l’entité et le deuxième pour l'association, c'est ça?
J’ai utilisé des crochets pour les entités-types et des parenthèses pour les associations-types. Maintenant, les deux entités-types LigneFactureProduit et LigneFactureSoin sont parfaitement hypothétiques, je les ai utilisées uniquement pour exposer un problème concernant l’entité-type ESProduit. Cela dit, si l’on mettait réellement en œuvre l’entité-type LigneFactureProduit, il faudrait l’identifier relativement à l’entité-type Facture, en mettant entre parenthèses la cardinalité 1, 1 dans le style Power AMC :
[Facture]--0,N--()--(1,1)--[LigneFactureProduit(LigneFactureProduitId, Quantite)]--1,1--()--0,N--[Produit]
A vous de voir si vous préférez cette façon de faire ou si vous préférez utiliser une association-type :
[Facture]--0,N--(LigneFactureProduit(Quantite))-- 0,N--[Produit]
Même principe pour LigneFactureSoin.
Envoyé par
Miko95
J'ai pense a l'historisation après avoir lu ce sujet sur le forum, j'attendais la fin pour voir ça. Dans ce cas, comment mettre en place l'historisation dans le MCD?
Il y a plusieurs écoles. Pour ma part, j’adhère à la théorie des données intervallaires de Date, Darwen et Lorentzos, et j’isole les données actives des données historisées. Prenons le cas des produits :
On a une entité-type PRODUIT qui permet de connaître le prix en vigueur pour chaque produit (attribut PrixProduitHT) et la date depuis laquelle ce prix est en vigueur (attribut PrixProduitDepuis) :
PRODUIT {IdProduit, NomProduit, PrixProduitDepuis, PrixProduitHT}
(Vous noterez en passant que je ne retiens pas l’attribut QuantStockProd : au nom de l’urbanisation, il devrait de préférence dégager dans une entité-type croupion, concernant disons la tenue des stocks, mais si vous tenez à le conserver tel quel, à vous de voir).
On a par ailleurs une entité-type où l’on conserve le passé :
PRODUIT_HISTO {IdProduit, DateDebutPrix, DateFinPrix, PrixProduitHT}
L’idéal étant d’utiliser des périodes (attribut PeriodePrix) :
PRODUIT_HISTO {IdProduit, PeriodePrix, PrixProduitHT}
Mais le plus souvent, les SGBD dits relationnels ne proposent ni ne permettent de définir le type Periode.
Quoi qu’il en soit, Le MCD devient :
[PRODUIT]--0,N--(HistoriserPrixProduit)--(1,1)--[PRODUIT_HISTO]
Au niveau tabulaire, du point de vue théorique, la clé de la table PRODUIT_HISTO est la suivante :
{IdProduit, PeriodePrix}
Si l’on ne peut pas utiliser le type Periode, la clé de la table PRODUIT_HISTO est la suivante :
{IdProduit, DateDebutPrix}
Mais c’est vraiment pour la forme. En effet, dans tous les cas de figure il faudra prévoir des contraintes pour s’assurer que les périodes ne se recouvrent pas et plus généralement, il faudra garantir le respect des Nine requirements décrits dans l’ouvrage que j’ai cité (vous pouvez aussi consulter à ce sujet le support de cours de Hugh Darwen).
Attention : si des produits sont historisés mais ne font plus partie des produits en activité, au niveau du MLD on ne peut plus établir de contrainte référentielle entre les tables PRODUIT et PRODUIT_HISTO, en conséquence de quoi au niveau MCD, le lien entre PRODUIT et PRODUIT_HISTO disparaît. Pour éviter cela, on peut mettre en œuvre une entité-type supplémentaire, ayant la même structure que PRODUIT_HISTO, appelons-la par exemple PRODUIT ARCHIVÉ, donnant lieu à une table dans laquelle iront loger les produits qui n’ont plus cours mais dont on veut garder une trace (à l’intention des fouilleurs du XXIIe siècle...)
Envoyé par
Miko95
J'ai pense utiliser les packages a partir du moment ou j'ai vu qu'au niveau de l'image ça devenait "flou" (zoom arrière trop grand). C'est vrai que c'est pas trop évident de choisir quels entités/associations mettre dans chaque package. Pouvez vous m'indiquer quoi mettre dans chaque package de sorte a mettre un peu d'ordre dans les diagrammes?
Je vous ai dit que je n’utilisais pas les packages mais les vues. En tout cas je vous laisse réfléchir au rôle attribué à chaque sous-domaine, je vous ai donné des pistes. Pour chaque attribut de chaque entité-type, posez-vous déjà la question : Cet attribut concerne-t-il les ventes aux clients ? Les achats ? Les deux ?
Envoyé par
Miko95
ça se passera au niveau du MPD, c'est bien ça? (pas tous les SGBD supportent les triggers, MySQL par exemple pour les INSTEAD OF)
Au sens Power AMC, ça se passe au niveau MLD/MPD. Mais l’important est que la contrainte fasse l’objet d’une assertion au sens de la norme SQL (donc d’un trigger pour les SGBD qui ne proposent pas l’instruction CREATE ASSERTION).
Exemple d’assertion mettant en jeu les tables issues des entités-types hypothétiques LigneFactureProduit et LigneFactureSoin, à traduire en trigger en fonction de votre SGBD :
1 2 3 4 5 6 7 8 9 10 11 12 13
| CREATE ASSERTION AssertFacture01
CHECK (NOT EXISTS
(SELECT FactureId
FROM Facture AS x
WHERE NOT EXISTS
(SELECT *
FROM LigneFactureProduit AS y
WHERE x.FactureId = y.FactureId)
AND NOT EXISTS
(SELECT *
FROM LigneFactureSoin AS y
WHERE x.FactureId = y.FactureId)
)) ; |
Partager