Bonsoir,
Envoyé par
petitediablesse
je n'ai pas pu voir comment préciser les clés primaires sous Visio.
D’accord. Cela dit, le terme clé primaire ne fait pas partie du vocabulaire UML dans le contexte des diagrammes de classes, mais du vocabulaire SQL. On parlera plutôt d’identifiant. Toutefois, comme vous évoquez le SGBD Oracle, on parlera de tables et de clés au moment opportun.
Envoyé par
fsmrel
Bien qu’une classe ne soit pas astreinte à être dotée d’un quelconque attribut identifiant (contrairement aux entités-types merisiennes), si la base de données cible est de type SQL ou relationnel, pour éviter de faire du rapiéçage après coup, autant faire figurer et mettre en évidence au plus tôt ce genre d’attribut (qui donnera lieu a clé), invariant et dépourvu de toute signification.
Dans cette partie j’ai précisé (en gras) qu’un identifiant est invariant et dépourvu de toute signification. Le code apporteur, le RIB sont des données qui n’offrent pas ces garanties dans la mesure où ils ont été conçus indépendamment de votre système, c'est-à-dire inventés par l’utilisateur (code apporteur) où issus d’un système externe à l’entreprise (RIB). Lisez avec attention ce qui est écrit ici. Le code apporteur et le RIB sont des identifiants naturels, non artificiels, ils conservent leur propriété d’unicité et restent bien sûr les points d’entrée dans le système pour l’utilisateur, mais en vertu de ce que j’appelle le principe Tabourier, les associations entre classes se font uniquement par le canal des identifiants artificiels ({ApporteurId} par exemple).
Envoyé par
petitediablesse
Pour les informations qu'il faut historiser, par exemple pour la table ' Apporteur ', il faut garder une trace d'une modification de l'une de ces informations : RIB , Bareme , Date debut bareme , date fin bareme.
Puisque vous utilisez le terme « table » au lieu de « classe », on va le conserver, ça sera peut-être plus simple.
Pour le RIB, je vous renvoie à mon message précédent. Pour les autres attributs, le principe est le même (notez l’ajout entre autres de l’attribut ApporteurDepuis, permettant de savoir depuis quand une personne est apporteur) :
La table APPORTEUR caractérise l’état actuel d’un apporteur :
APPORTEUR
{
ApporteurId,
ApporteurDepuis,
CodeApporteur,
NomApporteur,
MailApporteur,
Domiciliation,
NumeroCompte,
CodeBanque,
CodeAgence,
CleRIB,
RIBDepuis,
Bareme,
BaremeDepuis,
BaremeDebut,
BaremeDebutDepuis,
BaremeFin
BaremeFinDepuis
} ;
La table APPORTEUR_HISTO caractérise le passé d’un apporteur juste avant sa suppression. Les données non nommément historisées y seront accessibles, alors que les données nommément historisées (RIB, barème, dates du barème seront accessibles par le canal des tables APPORTEUR_RIB_HISTO, APPORTEUR_BAREME_HISTO, APPORTEUR_DEBUT_BAREME_HISTO, APPORTEUR_FIN_BAREME_HISTO). L’attribut ApporteurDurant caractérise la période pendant laquelle l’apporteur a été actif avant d’être supprimé :
APPORTEUR_HISTO
{
ApporteurId,
ApporteurDurant,
CodeApporteur,
NomApporteur,
MailApporteur,
Domiciliation
} ;
La table APPORTEUR_RIB_HISTO permet de conserver l’historique de chaque RIB de chaque apporteur dans les conditions suivantes : modification du RIB ou suppression de l’apporteur :
APPORTEUR_RIB_HISTO
{
ApporteurId,
RIBDurant,
NumeroCompte,
CodeBanque,
CodeAgence
} ;
La table APPORTEUR_BAREME_HISTO permet de conserver l’historique de chaque barème de chaque apporteur dans les conditions suivantes : changement du barème ou suppression de l’apporteur :
APPORTEUR_BAREME_HISTO
{
ApporteurId,
BaremeDurant,
Bareme
} ;
La table APPORTEUR_DEBUT_BAREME_HISTO permet de conserver l’historique de la date de début de chaque barème de chaque apporteur dans les conditions suivantes : changement de la date de début du barème en cours ou suppression de l’apporteur :
APPORTEUR_DEBUT_BAREME_HISTO
{
ApporteurId,
BaremeDebutDurant,
BaremeDebut
} ;
La table APPORTEUR_FIN_BAREME_HISTO permet de conserver l’historique de la date de fin de chaque barème de chaque apporteur dans les conditions suivantes : changement de la date de fin du barème en cours ou suppression de l’apporteur :
APPORTEUR_FIN_BAREME_HISTO
{
ApporteurId,
BaremeFinDurant,
BaremeFin
} ;
Concernant les barèmes, j’ai supposé que :
(R1) La date de début d’un barème en cours d’utilisation pour un apporteur peut être modifiée indépendamment de la date de fin, ce qui justifie la table APPORTEUR_DEBUT_BAREME_HISTO ;
(R2) La date de fin d’un barème en cours d’utilisation pour un apporteur peut être modifiée indépendamment de la date de début, ce qui justifie la table APPORTEUR_FIN_BAREME_HISTO ;
(R3) Le barème utilisé pour un apporteur peut être remplacé par un autre barème, ce qui justifie la table APPORTEUR_BAREME_HISTO.
A noter que les en-têtes des tables sont en fait des prédicats. Par exemple pour la table APPORTEUR :
Depuis le ApporteurDepuis, l’apporteur ApporteurId a pour code CodeApporteur, il a pour nom NomApporteur, pour adresse de courrier électronique MailApporteur, pour domicile Domiciliation, pour numéro de compte NumeroCompte, au guichet CodeAgence de la banque CodeBanque, la clé du RIB est CleRIB, son RIB est en cours depuis le RIBDepuis, son barème en cours est Bareme depuis le BaremeDepuis, la date BaremeDebut de début du barème vaut depuis le BaremeDebutDepuis, la date BaremeFin de fin du barème vaut depuis le BaremeFinDepuis.
N.B. Dans ce prédicat, j’ai utilisé le mot « domicile », mais je pose à nouveau la question : qu’en est-il de l’attribut Domiciliation : s’agit-il de l’adresse de l'apporteur ? de sa domiciliation bancaire ?
Prédicat de la table APPORTEUR_HISTO :
Durant la période ApporteurDurant, l’apporteur ApporteurId avait pour nom NomApporteur, pour adresse de courrier électronique MailApporteur et pour domicile Domiciliation.
Prédicat de la table APPORTEUR_RIB_HISTO :
Durant la période RIBDurant, l’apporteur ApporteurId avait pour numéro de compte NumeroCompte, au guichet CodeAgence de la banque CodeBanque.
Prédicat de la table APPORTEUR_BAREME_HISTO :
Durant la période BaremeDurant, le barème utilisé par l’apporteur ApporteurId avait été le barème Bareme.
Prédicat de la table APPORTEUR_DEBUT_BAREME_HISTO :
Durant la période BaremeDebutDurant, la date de début du barème utilisé par l’apporteur ApporteurId avait été BaremeDebut.
Prédicat de la table APPORTEUR_FIN_BAREME_HISTO :
Durant la période BaremeFinDurant, la date de fin du barème utilisé par l’apporteur ApporteurId avait été BaremeFin.
Envoyé par
petitediablesse
garder toujours une trace lors de la suppression d'un apporteur ( la date de suppression par rapport à cet apporteur.)
La table APPORTEUR_HISTO sert à cela, ainsi que les tables APPORTEUR_RIB_HISTO, APPORTEUR_BAREME_HISTO, APPORTEUR_DEBUT_BAREME_HISTO, APPORTEUR_FIN_BAREME_HISTO :
Quand on supprime un apporteur, les données actives CodeApporteur, NomApporteur, MailApporteur, Domiciliation sont hébergées par la table APPORTEUR_HISTO et les autres données actives sont hébergées dans les tables dédiées APPORTEUR_RIB_HISTO, APPORTEUR_BAREME_HISTO, APPORTEUR_DEBUT_BAREME_HISTO, APPORTEUR_FIN_BAREME_HISTO.
Cela dit, si votre règle de gestion de suppression est claire et simple, elle est dévastatrice ! En effet, les données actives ne sont pas limitées à celles dont je viens de parler, les commissions et les dérogations sont elles aussi à historiser dans leurs propres tables d'historisation...
Dans ce système, conforme à la théorie développée dans les ouvrages dont j’ai fait mention le 15 dernier, l’intégrité référentielle n’est pas implantable par le mécanisme des clés étrangères, mais en échange on développe les contraintes nécessaires et suffisantes, décrites dans ces ouvrages. En langage D ceci n’est pas un problème, mais avec SQL c’est une gageure (pour rester poli), avec à la clé des paquets de triggers. Aussi je propose de faire une entorse à la théorie : Quand on supprime un apporteur, on met à jour comme il se doit les tables d’historisation que je viens d’énumérer (sans oublier bien sûr les commissions et dérogations), mais au lieu de supprimer « physiquement » l’apporteur, on le supprimera « logiquement » en faisant passer un indicateur de la valeur « actif » à la valeur « supprimé » dans la table APPORTEUR, tandis que l’attribut ApporteurDepuis prendra comme valeur la date de suppression. On peut nommer StatutApporteur cet indicateur, et la structure devient :
APPORTEUR
{
ApporteurId,
ApporteurDepuis,
StatutApporteur,
CodeApporteur,
NomApporteur,
MailApporteur,
Domiciliation,
NumeroCompte,
CodeBanque,
CodeAgence,
CleRIB,
RIBDepuis,
Bareme,
BaremeDepuis,
BaremeDebut,
BaremeDebutDepuis,
BaremeFin,
BaremeFinDepuis
} ;
Et au lieu de développer des triggers SQL pour garantir l’intégrité référentielle, on sous-traite celle-ci au SGBD au moyen des clés étrangères :
Exemple, en Tutorial D :
VAR APPORTEUR BASE RELATION
{
ApporteurId,
ApporteurDepuis,
StatutApporteur,
CodeApporteur,
NomApporteur,
MailApporteur,
Domiciliation,
NumeroCompte,
CodeBanque,
CodeAgence,
CleRIB,
RIBDepuis,
Bareme,
BaremeDepuis,
BaremeDebut,
BaremeDebutDepuis,
BaremeFin,
BaremeFinDepuis
}
KEY {ApporteurId}
KEY {CodeApporteur} ;
VAR APPORTEUR_HISTO BASE RELATION
{
ApporteurId,
ApporteurDurant,
CodeApporteur,
NomApporteur,
MailApporteur,
Domiciliation
}
KEY {ApporteurId, ApporteurDurant}
KEY {CodeApporteur, ApporteurDurant}
FOREIGN KEY {ApporteurId} REFERENCES APPORTEUR ;
Etc.
Il y a des représentations alternatives (et préférables) pour ce système, mais je ne voudrais pas vous traumatiser (si ce n’est déjà fait)...
J’ai encore des choses à dire, notamment au sujet des redondances, mais pour ce soir on en restera là.
Envoyé par
petitediablesse
merci bcp
Eu égard à la charte DVP, il est préférable que vous écriviez en français (ils pourraient vous coller un mauvais point ).
Partager