Bonjour,
Si je comprends bien la question, on cherche à déduire les cardinalités du MCD à partir des clefs étrangères du modèle tabulaire.
Dans le modèle tabulaire les clefs étrangères sont faciles à repérer : elle font l'objet d'une contrainte de type référence codées sous la forme suivante dans le DDL de création de la table :
CONSTRAINT ma_colonne REFERENCES autre_table(autre_colonne) avec facultativement des actions ON DELETE ou ON UPDATE.
À partir de là, il faut d'abord vérifier si la table contenant ce type de colonnes est issue d'une entité ou d'une association du MCD.
En effet, quand on a une association dont une "patte" possède une cardinalité 0,1, il est possible de générer une table pour cette association afin d'éviter que la colonne soit "nullable".
- Si toutes les colonnes PK de la table concernée font l'objet dune contrainte de type référence, alors c'est une table issue d'une association (on parle alors de "table associative").
En ce cas les PK sont bien évidemment "not null" - c'est obligatoire pour une PK - mais c'est bien une table associative issue d'une cardinalité 0,1
- Si au contraire les colonnes PK de la table ne font pas l'objet de contrainte de type référence, alors c'est une table issue d'une entité du MCD.
En ce cas, si la colonne faisant l'objet d'une contrainte de type référence est "nullable", alors c'est qu'on avait une cardinalité 0,1 dans le MCD et si la contrainte de type réference porte sur une colonne "not null", alors c'est qu'on avait une cardinalité 1,1 dans le MCD
Voici un exemple de MCD avec des cardinalités 0,1 et 1,1
Si je décide de ne pas générer de table associative pour la cardinalité 0,1, alors le script DDL est généré ainsi (ici décliné pour SQL server) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| CREATE TABLE E1(
E1_ident INT IDENTITY,
E1_truc VARCHAR(50) NOT NULL,
PRIMARY KEY(E1_ident)
);
CREATE TABLE E2(
E2_ident INT IDENTITY,
E2_bidule CHAR(10) NOT NULL,
E1_ident INT NOT NULL,
PRIMARY KEY(E2_ident),
FOREIGN KEY(E1_ident) REFERENCES E1(E1_ident)
);
CREATE TABLE E3(
E3_ident INT IDENTITY,
E3_machin VARCHAR(50) NOT NULL,
E1_ident INT,
PRIMARY KEY(E3_ident),
FOREIGN KEY(E1_ident) REFERENCES E1(E1_ident)
); |
Si au contraire je décide de générer une table associative pour éviter les colonnes "nullables", alors le script DDL devient :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| CREATE TABLE E1(
E1_ident INT IDENTITY,
E1_truc VARCHAR(50) NOT NULL,
PRIMARY KEY(E1_ident)
);
CREATE TABLE E2(
E2_ident INT IDENTITY,
E2_bidule CHAR(10) NOT NULL,
E1_ident INT NOT NULL,
PRIMARY KEY(E2_ident),
FOREIGN KEY(E1_ident) REFERENCES E1(E1_ident)
);
CREATE TABLE E3(
E3_ident INT IDENTITY,
E3_machin VARCHAR(50) NOT NULL,
PRIMARY KEY(E3_ident)
);
CREATE TABLE E1_E3(
E3_ident INT,
E1_ident INT NOT NULL,
PRIMARY KEY(E3_ident),
FOREIGN KEY(E3_ident) REFERENCES E3(E3_ident),
FOREIGN KEY(E1_ident) REFERENCES E1(E1_ident)
);
] |
Partager