Bonsoir,
J’ai oublié de répondre au sujet des clés primaires, c’est peut-être un peu tard, mais bon...
Je ne suis pas sûr de comprendre exactement le sens de votre question. Je vais donc traiter des clés et pour illustrer je me servirai de la table SOCIETE_CLIENTE.
Une clé primaire est un ensemble (au sens de la théorie des ensembles). Dans le cas de la table SOCIETE_CLIENTE, cet ensemble K a pour éléments les noms des attributs de la table faisant que les deux contraintes suivantes sont garanties :
1. Unicité. Deux lignes distinctes de la table ne peuvent avoir simultanément la même valeur pour K.Supposons que les clients soient les suivants :
2. Irréductibilité. Il n’existe pas de sous-ensemble strict K´ de K garantissant lui aussi la contrainte d’unicité.
Ets NaudinLa structure de votre table SOCIETE_CLIENTE est la suivante :
Volfoni Frères
...
SOCIETE_CLIENTE {SocieteId, Nom, SIREN}Son extension (contenu) est aussi un ensemble (de lignes) :
Il faut interdire la présence de doublons (les doublons n’ont pas de sens dans un ensemble) tels qu’ici :SocieteId Nom SIREN --------- --------------- -------------- 1 Ets Naudin 123456782 2 Volfoni Frères 234567899 ... ... ...
Apprendre deux fois que les établissements Naudin ont 123456782 pour numéro de SIREN et 1 pour SocieteId n’apporte vraiment rien, sinon un dysfonctionnement de l’algèbre relationnelle...SocieteId Nom SIREN --------- --------------- -------------- 1 Ets Naudin 123456782 1 Ets Naudin 123456782 2 Volfoni Frères 234567899 ... ...
C’est pour cela qu’on déclare une clé primaire (voire des clés alternatives). Supposons que l’on retienne pour clé primaire le triplet :
{SocieteId, Nom, SIREN}Alors le SGBD refusera la 2e ligne <1, Ets Naudin, 123456782> et la situation restera la suivante :
Tant mieux pour l’algèbre... Néanmoins, à SocieteId = 1 ne doit correspondre qu’un client, mais vu sa constitution (triplet {SocieteId, Nom, SIREN}), la clé n’interdit pas la situation suivante :SocieteId Nom SIREN --------- --------------- -------------- 1 Ets Naudin 123456782 2 Volfoni Frères 234567899 ... ... ...
En effet, à SocieteId = 1 correspondent manifestement deux noms (et deux SIREN).SocieteId Nom SIREN --------- --------------- -------------- 1 Ets Naudin 123456782 1 Duchesne & Cie 987654324 2 Volfoni Frères 234567899 ... ... ...
On dit que la clé est réductible. Le triplet {SocieteId, Nom, SIREN} doit en fait être remplacé par le singleton {SocieteId} (notez en passant l’utilisation des accolades, puisque les clés sont des ensembles). Dans ces conditions, quand l’attribut SocieteId prend la valeur 1, un seul nom et un seul SIREN sont possibles :
Il est évident que les paires {SocieteId, Nom} et {SocieteId, SIREN} ne constituent pas des clés, puisque réductibles à {SocieteId}.SocieteId Nom SIREN --------- --------------- -------------- 1 Ets Naudin 123456782 2 Volfoni Frères 234567899 ... ... ...
La paire {Nom, SIREN} représente un cas intéressant. Peut-elle constituer une clé ? En fait, comme deux sociétés (personnes juridiques) ne peuvent avoir le même SIREN (SIRET si on parlait des établissements), le singleton {SIREN} constitue une clé à lui seul. Pour distinguer celle-ci de la clé primaire, on dit qu’il s’agit d’une clé alternative (clause UNIQUE en SQL).
Déclaration en SQL :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CREATE TABLE SOCIETE_CLIENTE ( SocieteId INT NOT NULL , Nom VARCHAR(64) NOT NULL , SIREN INT NOT NULL , CONSTRAINT SOCIETE_CLIENT_PK PRIMARY KEY (SocieteId) , CONSTRAINT SOCIETE_CLIENT_AK UNIQUE (SIREN) ) ;
Des sociétés différentes peuvent généralement avoir même nom, mais si cela ne devait pas être le cas, alors l’attribut Nom ferait lui aussi l’objet d’une clé alternative (clause UNIQUE).
Venons-en à la table de jonction EQUIPE_CLIENT (on utilise plutôt le terme jointure, mais jonction est tout à fait acceptable).
Partons de la situation suivante :
Table SOCIETE_CLIENTE (clé primaire {SocieteId})
Table PROJET (clé primaire {ProjetId})SocieteId Nom SIREN --------- --------------- -------------- 1 Ets Naudin 123456782 2 Volfoni Frères 234567899 ... ... ...
Table CONTACT_CLIENT (clé primaire {ContactId})ProjetId Description SocieteId ... -------- ----------------- --------- --- 1 Contrats 1 ... 2 Appros 1 ... 3 Commandes 1 ... 4 En-cours 2 ... 5 Commandes 2 ... 6 Facturation 2 ... 7 Catalogue Produits 2 ...
L’en-tête (liste des attributs) de la table EQUIPE_CLIENT est constitué de la paire de noms d’attributs (quand je change les noms, ne vous sentez pas obligé d’en faire autant !) :ContactId Nom SocieteId ... --------- -------- --------- --- 1 Fernand 1 ... 2 Jean 1 ... 3 Raoul 2 ... 4 Paul 2 ... 5 Pascal 2 ... 6 Bastien 2 ...
{ProjetId, ContactId}Je rappelle qu’il s’agit d’un ensemble (d’où les accolades).
Cette paire a-t-elle les propriétés d’une clé primaire ? Comme à un projet peuvent participer plusieurs contacts et qu’un contact peut participer à plusieurs projets, si l'on retient comme clé primaire la paire {ProjetId, ContactId}, la situation suivante est tout à fait légale et légitime, il n’y a pas de doublons :
Du fait de la présence de la clé, les doublons {ProjetId, ContactId} sont impossibles : la clé garantit la propriété d’unicité. Mais qu'en est-il de l'irréductibilité ?ProjetId ContactId -------- --------- 1 1 (Fernand participe au projet Contrats des établissements Naudin dont il fait partie) 3 1 (Fernand participe au projet Commandes des établissements Naudin dont il fait partie) 2 2 (Jean participe au projet Appros des établissements Naudin dont il fait partie) 3 2 (Jean participe au projet Commandes des établissements Naudin dont il fait partie)
Prenons le cas du singleton {ProjetId}. S’il constituait une clé, alors la ligne <3, 2> serait illégale, le projet 3 étant déjà présent (ligne <3, 1>) ; cela reviendrait à dire qu’à un projet donné n’aurait droit de participer qu’un seul contact, ce qui est évidemment contraire à ce que dit votre thésaurus de règles de gestion.
De la même façon si le singleton {ContactId} était déclaré comme clé primaire, cela reviendrait à dire qu’un contact donné ne pourrait participer qu’à un seul projet, ce qui une fois de plus serait contraire à ce que dit votre thésaurus de règles de gestion.
=> La clé de la table EQUIPE_CLIENT est bien la paire {ProjetId, ContactId}.
Je ne sais pas si j’ai répondu à votre question, n’hésitez pas à bombarder si des points restent obsurs...
Je reviendrai sur l'utilisation de l'identification relative, mais à toutes fins utiles j'en ai déjà parlé ici, et de son rôle pour éviter les erreurs d'affectation des contacts aux projets.
J’envoie déjà ce message, je vais regarder la suite.
Partager