Bonjour,
J'ai rédigé ce qui suit avant de voir votre 2e message. Je regarderai celui-ci plus tard.
Envoyé par
pfortin
Je travaille sur un sujet plutôt simple à exposer mais générateur de discorde (type ORM impedence mismatch...).
Au moins ça occupe...
Envoyé par
pfortin
peut-on accepter le null dans les dates ?
Vous connaissez le point de vue des Relationlanders : le bonhomme Null est définitivement interdit de séjour.
A ce propos, dans votre MLD, l’attribut Valeur doit être déclaré NOT NULL (table Ent_Dap).
Envoyé par
pfortin
la relation vers la période suivante est-elle désirable ?
La réponse est négative dans la mesure où la date de fin de la dernière période n’est pas connue, auquel cas le bonhomme Null ne manquerait pas de se manifester.
Envoyé par
pfortin
faut-il stocker date de début ET date de fin (debut_suiv) ?
Si la dernière période est connue (donc la date de fin qui la caractérise), c’est ce que l’on doit faire en théorie (cf. Temporal Data and The Relational Model), mais on doit disposer du générateur de type INTERVAL. A défaut, ce type est à définir soi-même, ce qu’il faut faire quand votre SGBD vous le permet, conformément à la norme SQL. Mais si, par exemple, vous utilisez SQL Server, alors you can always run...
Supposons que vous ne puissiez pas disposer d’un type PERIODE (défini disons à l’aide du générateur INTERVAL).
Si la dernière période est connue (c'est-à-dire la date de fin), votre MLD convient, mais à condition de faire la chasse au bonhomme Null (attribut Debut_Suiv à déclarer NOT NULL). En outre, il faut déclarer une clé alternative {Id_Entite, Debut_Suiv}, sinon on pourrait trouver un tuple <e1, 2011-01-01, 2011-03-01, valeur1> et un autre tuple <e1, 2011-05-01, 2011-03-01, valeur2>. Le support commis par Darwen et auquel je vous renvoie décrit les concepts qui doivent être pris en compte par les SGBD et ayant pour objet qu'ils nous déchargent de l’intégrité des données. A défaut, à vous d’assumer. Par exemple, s’assurer du non chevauchement des périodes, de leur continuité stricte (l’auto-référence de votre MLD devant disparaître) : il y a donc des triggers en perspective...
Si la date de fin n’est pas connue, la date de début (attribut Debut) et la valeur (attribut Valeur) doivent en théorie faire partie de la structure de la table ENTITE. On est alors dans la logique du « SINCE/DURING » dont fait état Darwen : depuis tel jour (SINCE), la valeur est celle-ci. Durant (DURING) les périodes qui précédèrent, les valeurs furent celles-là (aspect historique des données).
Toujours si la date de fin n’est pas connue, vous pouvez aussi faire l’économie de l’attribut Debut_Suiv. L’inconvénient est que pour déterminer la date de fin d’une période dont la date de début est d1, il faut mettre en œuvre une requête impliquant une thêta-jointure qui permette de retrouver dans la table Ent_Dap la plus petite des dates supérieures à d1. En contrepartie, pas de clé alternative et pas de triggers de contrôle du recouvrement des périodes, etc.
Envoyé par
pfortin
sachant qu'une date peut changer (correction), faut-il introduire une surrogate key ?
Stricto sensu, oui puisqu’en principe une valeur de clé primaire est de préférence invariante. Mais le respect de l’invariance vaut fondamentalement quand une clé peut être référencée par une clé étrangère.
Une fois encore, je reprends ici ce que j’ai écrit à diverses reprises :
Les concepteurs d’un projet d’une grande banque avaient retenu le numéro Siren des entreprises pour identifier celles-ci (attribut NoSiren de l’entité-type Entreprise). Au niveau SGBD, par le jeu des liens inter-tables (clé primaire - clé étrangère), le numéro Siren se propageait dans de nombreuses tables. Or, ce numéro est fourni par l’INSEE, lequel envoyait tous les mois les correctifs modifiant le Siren des nouvelles entreprises (10% d’entre elles à peu près). Les concepteurs en avaient tenu compte et me montrèrent le modèle correspondant à la mise à jour des tables impliquées : une usine à gaz ! J’avais fait observer que, vu le nombre de tables touchées et leur volumétrie (plusieurs millions de lignes chacune), cela pouvait faire exploser la production informatique (batchs de nuit), du fait d’une activité de mise à jour excessive et en plus, délicate à ordonnancer. Sans que j'ai eu à le leur demander, les concepteurs définirent une nouvelle propriété, non porteuse d’information, artificielle et invariante, destinée à être l’attribut composant la clé primaire de la table Entreprise, propagé en conséquence dans les autres tables, en lieu et place de l’attribut NoSiren. A partir de là, modifier un numéro de Siren n’impactait plus que la seule table Entreprise, les utilisateurs ayant bien évidemment toujours accès au contenu de l’attribut NoSiren, devenu clé alternative (et n’ayant donc pas perdu sa propriété d’unicité).
Si donc vos dates ne font pas (ou ne feront pas) l’objet de références par d’autres tables, inutile de définir une clé supplémentaire. Si vous craignez que cela puisse se produire, définissez cette clé.
Envoyé par
pfortin
question subsidiaire : Y a-t-il des préconisations issues de la 6NF (que je ne connais que de nom) ?
Que oui ! Mais en fait, c’est la 6NF elle-même qui est quelque part la conséquence des « Nine requirements » décrits dans le support de Darwen.
Envoyé par
pfortin
question bonus : comment convaincre un analyste-concepteur UML que la base doit aussi implémenter des contraintes métiers ?
Les contraintes doivent faire partie de la base de données, coller aux données elles-mêmes et ne pas être éparpillées dans des programmes qui en sont éloignés au sein de différentes couches. Je pense que SQLpro a pas mal développé le thème (Bases de données épaisses).
Partager