© Your Copyright
Dans le cas de relations binaires, il existe seize cas possibles d’association suivant la cardinalité de la relation entre les deux ensembles.
Dans cette partie nous étudions les différents cas possibles ainsi que leur traduction sous forme de tables à l’aide de clés étrangères et de tables associatives.
Pour représenter sous forme de table les ensembles (A,B
) on représentera les clés primaires en soulignant les attributs appartenant à la clé :
- \(A (\underline{a\_id},...)\)
Les associations entre les entités seront représentées par des clés étrangères symbolisées par un hashtag préfixant le nom de l’attribut référençant la clé primaire de la table associée :
- \(B (\underline{b\_id},..., \# a\_id)\)
Il existe 16 possibilités d’association entre deux entités \((A,B)\) :
- (0..1)—(0..1) : au plus un \(A\) peut être associé à au plus un \(B\)
- (0..1)—(1..1) : au plus un \(A\) est associé à un et un seul \(B\)
- (0..1)—(0..*) : au plus un \(A\) peut être associé à un ou plusieurs \(B\)
- (0..1)—(1..*) : au plus un \(A\) est associé à au moins un \(B\)
- (1..1)—(0..1) : un et un seul \(A\) peut être associé à au plus un \(B\)
- (1..1)—(1..1) : un et un seul \(A\) est associé à un et un seul \(B\)
- (1..1)—(0..*) : un et un seul \(A\) peut être associé à un ou plusieurs \(B\)
- (1..1)—(1..*) : un et un seul \(A\) est associé à au moins un \(B\)
- (0..*)—(0..1) : un ou plusieurs \(A\) peuvent être associé à au plus un \(B\)
- (0..*)—(1..1) : un ou plusieurs \(A\) peuvent être associé à un et un seul \(B\)
- (0..*)—(0..*) : un ou plusieurs \(A\) peuvent être associé à un ou plusieurs \(B\)
- (0..*)—(1..*) : un ou plusieurs \(A\) peuvent être associé à au moins un \(B\)
- (1..*)—(0..1) : au moins un \(A\) est associé à au plus un \(B\)
- (1..*)—(1..1) : au moins un \(A\) est associé à un et un seul \(B\)
- (1..*)—(0..*) : au moins un \(A\) peut être associé à un ou plusieurs \(B\)
- (1..*)—(1..*) : au moins un \(A\) est associé à au moins un \(B\)
Les cardinalités symétriques entre les entités \((A,B)\) relèvent du même type d’association.
Par exemple :
- (0..1)—(1..1) : au plus un \(A\) est associé à un et un seul \(B\)
- (1..1)—(0..1) : un et un seul \(A\) peut être associé à au plus un \(B\)
Il reste donc les 10 associations possibles :
- (0..1)—(0..1) : au plus un \(A\) peut être associé à au plus un \(B\)
- (0..1)—(1..1) : au plus un \(A\) est associé à un et un seul \(B\)
- (0..1)—(0..*) : au plus un \(A\) peut être associé à un ou plusieurs \(B\)
- (0..1)—(1..*) : au plus un \(A\) est associé à au moins un \(B\)
- (1..1)—(1..1) : un et un seul \(A\) est associé à un et un seul \(B\)
- (1..1)—(0..*) : un et un seul \(A\) peut être associé à un ou plusieurs \(B\)
- (1..1)—(1..*) : un et un seul \(A\) est associé à au moins un \(B\)
- (0..*)—(0..*) : un ou plusieurs \(A\) peuvent être associé à un ou plusieurs \(B\)
- (0..*)—(1..*) : un ou plusieurs \(A\) peuvent être associé à au moins un \(B\)
- (1..*)—(1..*) : au moins un \(A\) est associé à au moins un \(B\)
Le cas des 3 associations plusieurs à plusieurs :
- (0..*)—(0..*) : un ou plusieurs \(A\) peuvent être associé à un ou plusieurs \(B\)
- (0..*)—(1..*) : un ou plusieurs \(A\) peuvent être associé à au moins un \(B\)
- (1..*)—(1..*) : au moins un \(A\) est associé à au moins un \(B\)
nécessiteront de créer une table associative avec des clés étrangères référençant les clés primaires des deux entités (tables) en relation :
- \(A (\underline{a\_id},...)\)
- \(B (\underline{b\_id},...)\)
- \(AB (\underline{\# a\_id,\# b\_id},...)\)
La clé primaire de la table associative pourra être défini par les deux clés étrangères, soulignées dans la représentation de la table \(AB\).
Les 4 associations un à plusieurs :
- (0..1)—(0..*) : au plus un \(A\) peut être associé à un ou plusieurs \(B\)
- (0..1)—(1..*) : au plus un \(A\) est associé à au moins un \(B\)
- (1..1)—(0..*) : un et un seul \(A\) peut être associé à un ou plusieurs \(B\)
- (1..1)—(1..*) : un et un seul \(A\) est associé à au moins un \(B\)
nécessiteront une clé étrangère du côté plusieurs (côté fils) de l’association.
- \(A (\underline{a\_id},...)\)
- \(B (\underline{b\_id},..., \# a\_id)\)
Pour les 2 associations un à un :
- (0..1)—(0..1) : au plus un \(A\) peut être associé à au plus un \(B\)
- (0..1)—(1..1) : au plus un \(A\) est associé à un et un seul \(B\)
On utilisera une clé étrangère d’un des côtés de cardinalité minimale 0.
Dans le premier cas :
- \(A (\underline{a\_id},...)\)
- \(B (\underline{b\_id},..., \# a\_id)\)
ou bien :
- \(A (\underline{a\_id},..., \# b\_id)\)
- \(B (\underline{b\_id},...)\)
Dans le deuxième cas :
- \(A (\underline{a\_id},..., \# b\_id)\)
- \(B (\underline{b\_id},...)\)
Pour la dernière association un à un :
- (1..1)—(1..1) : un et un seul \(A\) est associé à un et un seul \(B\)
On utilisera une clé étrangère d’un des côtés de l’association.
- \(A (\underline{a\_id},...)\)
- \(B (\underline{b\_id},..., \# a\_id)\) avec la contrainte
UNIQUE
sur l’attribut \(\# a\_id\)
ou bien :
- \(A (\underline{a\_id},..., \# b\_id)\) avec la contrainte
UNIQUE
sur l’attribut \(\# b\_id\)- \(B (\underline{b\_id},...)\)
Pour ce dernier cas d’association un à un il sera sans doute envisageable de fusionner les deux entités en une seule table en choisissant comme clé celle d’une des deux entités.
La clé candidate de l’autre entité deviendra un attribut à valeur unique.
- \(A (\underline{a\_id},...,b\_id,...)\) avec la contrainte
UNIQUE
sur l’attribut \(b\_id\)
ou bien :
- \(B (\underline{b\_id},..., a\_id,...)\) avec la contrainte
UNIQUE
sur l’attribut \(a\_id\)
créer en SQL une association plusieurs à plusieurs entre deux tables \(A(a_id,nom),B(b_id,nom)\)
Insérer les enregistrements :
A(1,'a1'),A(2,'a2'), B(1,'b1'), b(2,'b2')
Associer A(1,'a1') et `B(1,'b2')
Associer tous les A
avec B(1,'b1')
Utiliser l’interpréteur ci-dessous pour répondre.
Dans une association plusieurs à plusieurs entre deux tables :
il faut nécessairement créer une table associative :
DROP TABLE IF EXISTS AB;
DROP TABLE IF EXISTS A;
DROP TABLE IF EXISTS B;
CREATE TABLE A(nom text);
CREATE TABLE B(nom text);
CREATE TABLE AB(
a_id INTEGER NOT NULL,
b_id INTEGER NOT NULL,
PRIMARY KEY(a_id,b_id),
FOREIGN KEY(a_id) REFERENCES A(rowid),
FOREIGN KEY(b_id) REFERENCES B(rowid)
);
INSERT INTO A(nom) VALUES ('a1');
INSERT INTO A(nom) VALUES ('a2');
INSERT INTO A(nom) VALUES ('a3');
INSERT INTO B(nom) VALUES ('b1');
INSERT INTO B(nom) VALUES ('b2');
INSERT INTO AB(A_id,B_id) SELECT a.rowid, b.rowid FROM A a, B b WHERE b.rowid=1 AND b.nom='b1';
INSERT INTO AB(A_id,B_id) SELECT a.rowid, b.rowid FROM A a, B b WHERE a.nom='a1' AND b.nom='b2';
SELECT * FROM A;
SELECT * FROM B;
SELECT * FROM AB;
Modéliser les associations suivantes :
- un candidat dont on connait le nom du parti politique qui est un citoyen dont on connait le nom, le prénom et la ville où il habite.
- une personne dont on connait le nom, le prénom et la ville où il réside et qui peut posséder un livret A dont on connait le numéro et le solde.
- un médecin dont on connait le nom et la spécialité qui a des patients dont on connait le numéro de sécurité sociale. Chaque patient peut être suivi par plusieurs spécialistes.
- un client dont on connait le nom, le prénom et le solde de son compte qui habite à une adresse dont on connait le numero et le nom de la rue et le code postal de la ville où elle se trouve.
- un client dont on connait le nom, le prénom et le solde de son compte qui fait des commandes dont on connait la date et le montant.
- une commande dont on connait la date et le montant et qui est constitué de plusieurs produits dont on connait le nom et le prix unitaire. Chaque produit peut apparaître dans des commandes différentes.
Pour chacun des modèles proposés, représentez les tables correspondantes.
Regrouper les trois derniers cas pour proposer une structuration (les tables) d’une base de données qui permettrait à une entreprise de gérer des clients dont on connait l’adresse et qui passent des commandes constituées de plusieurs produits.