Bonsoir,
Envoyé par
GuiDjad
Envoyé par
fsmrel
Pour mémoire, la notion de clé primaire a disparu de la théorie relationnelle (à juste titre, Guillaume d'Ockham a encore frappé)
J'avais étudié la théorie relationnelle, il y'a longtemps avant. Pourtant je trouvais cette notion intéressante... Je vais faire quelques recherches pour me mettre à jour.
Pour commencer, vous pouvez par exemple consulter le dictionnaire de Chris Date, The Relational Database Dictionary auquel fait par exemple référence le papier suivant : Oracle Database / Applications Tips.
L’article dans lequel Chris Date a montré que le concept de clé primaire état strictement inutile fut publié dans InfoDB : The Primacy of Primary Keys: An Investigation. InfoDB 7(3), Summer 1993. Cet article fut republié in C. J. Date, Relational Database Writings 1991-1994, Addison-Wesley, 1995. Date a même battu sa coulpe, car il conclut ainsi son article, je cite :
In a previous paper I criticized the SQL standard for permitting foreign keys to reference alternate keys as well as primary keys. As this paper shows, I no longer feel that such criticism is valid, and I hereby withdraw it, with apologies.
Ainsi, Chris Date dut se résoudre à rendre caduques des contraintes formelles qu’il avait défendues pendant plus de vingt ans, essentiellement les suivantes et qu’il a reconnues comme arbitraires :
- Pour chaque variable relationnelle (table en SQL) on doit privilégier une des clés candidates, que l’on appellera clé primaire.
- Chaque clé étrangère fera exclusivement référence à une clé primaire.
=> Évolution mais pas révolution.
Envoyé par
GuiDjad
Je ne comprends pas à quoi sert l'attribut MbrId dans votre table. Un membre ne peut t'il pas être désigné par son Pseudonyme (ou son AdrCouriel)? J'ai supposé que c'était pour avoir une clé primaire plus simple d'où mon interprétation.
Du strict point de vue théorique, l’attribut MbrId ne se justifie pas. D’un point de vue pratique il en va autrement. Je fais référence une fois de plus à une expérience que j’ai vécue il y a quinze ans et que je rapporte de temps en temps chez DVP :
Les concepteurs d’une grande banque française avaient retenu le numéro Siren des entreprises pour identifier celles-ci (attribut NoSiren de la table Entreprise). Par le jeu des liens clé primaire - clé étrangère, l’attribut NoSiren se propageait dans une trentaine de tables. Balek ! Le numéro Siren est établi par un organisme extérieur à la banque, à savoir l’INSEE. J’avais fait observer qu’il n’était pas raisonnable de bâtir une clé primaire sur une donnée dont on ne maitrise pas la stabilité. De fait, l’INSEE envoyait tous les mois les nombreux correctifs modifiant le Siren des nouvelles entreprises (10% d’entre elles à peu près) et, vu le nombre de tables touchées (une trentaine) et leur volumétrie (plusieurs millions de lignes chacune), cela pouvait fortement pénaliser la production informatique (batchs de nuit). Une trentaine de tables à mettre à jour quant à leur valeur de clé primaire et/ou étrangère induit une activité physique intense (nombre excessif d'écritures sur le disque), outre un ordonnancement délicat. A ma demande, l’identifiant conceptuel de l’entreprise fit donc l’objet d’un nouvel attribut, non porteur d’information, artificiel et invariant, EntrepriseId, destiné à représenter la clé primaire de la table Entreprise et 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 impactait la seule table Entreprise au lieu d’une trentaine. Tandis qu'il n'avait pas connaissance de l'existence de l'attribut EntrepriseId, l’utilisateur Tartempion avait bien évidemment toujours accès au numéro Siren, devenu clé alternative pour la table Entreprise (et n’ayant donc pas perdu sa propriété d’unicité), modifiable sans que cela pose quelque problème que ce soit. Du point de vue technique, l’organisation des relations entre les clés primaires et étrangères avaient lieu sous le capot, sans que les modifications dues à l’INSEE aient un quelconque impact. Last but not least, les informaticiens de la banque avaient prévu un package, une usine à gaz de programmes pour s’assurer que le numéro Siren était cohérent dans toutes les tables où on le retrouvait : ce monstre ne vit évidemment pas le jour.
En corollaire, pour la nième fois je cite le grand Yves Tabourier qui écrivait il y a trente ans dans le contexte Merise (De l’autre côté de MERISE page 81) :
« ... la fonction d’une propriété est de décrire les objets (et les rencontres), alors que l’identifiant ne décrit rien. Son rôle fondamental est d’être sûr de distinguer deux jumeaux parfaits, malgré des descriptions identiques.
L’expérience montre d’ailleurs que l’usage des “identifiants significatifs” (ou “codes significatifs”) a pu provoquer des dégâts tellement coûteux que la sagesse est d’éviter avec le plus grand soin de construire des identifiants décrivant les objets ou, pis encore, leurs liens avec d’autres objets... »
Considérez la recommandation de Tabourier comme une règle d’or qui n’a pas vieilli.
Exemple d’organisation des tables :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| CREATE TABLE Entreprise
( EntrepriseId ...
, EntrepriseSiren ...
, EntrepriseNom ...
...
, CONSTRAINT Entreprise_PK PRIMARY KEY (EntrepriseId)
, CONSTRAINT Entreprise_AK UNIQUE (EntrepriseSiren)
... ) ;
CREATE TABLE Collaborateur
( CollaborateurId ...
, CollaborateurNom ...
, EnrepriseId ...
, CONSTRAINT Coll_PK PRIMARY KEY (CollaborateurId)
, CONSTRAINT Coll_FK FOREIGN KEY (EnrepriseId)
References Entreprise (EnrepriseId) ...) ; |
Selon la théorie relationnelle :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
VAR Entreprise BASE RELATION
{ EntrepriseId ...
, EntrepriseSiren ...
, EntrepriseNom ... }
KEY {EntrepriseId}
KEY {EntrepriseSiren} ;
VAR Collaborateur BASE RELATION
{ CollaborateurId ...
, CollaborateurNom ...
, EnrepriseId ... }
KEY {CollaborateurId}
FOREIGN KEY {EnrepriseId}
REFERENCES Entreprise {EntrepriseId} ... ; |
Notez la symétrie qui transparaît dans cette notation. Par contre, dans le cas de la notation SQL, la clé primaire peut être disqualifiée pour manque de stabilité et être remplacée par sa dauphine. Tant qu'on ne les aura pas chargées, cela restera transparent vu de la table Collaborateur et de la trentaine des autres tables impliquées (ouf !) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
CREATE TABLE Entreprise
( EntrepriseId ...
, EntrepriseSiren ...
, EntrepriseNom ...
...
, CONSTRAINT Entreprise_PK PRIMARY KEY (EntrepriseSiren) -- bof...
, CONSTRAINT Entreprise_AK UNIQUE (EntrepriseId)
... ) ;
CREATE TABLE Collaborateur
( CollaborateurId ...
, CollaborateurNom ...
, EnrepriseId ...
, CONSTRAINT Coll_PK PRIMARY KEY (CollaborateurId)
, CONSTRAINT Coll_FK FOREIGN KEY (EnrepriseId)
References Entreprise (EnrepriseId) ...) ; |
Ai-je répondu à votre question ?
Partager