Bonjour,
Je tiens à signaler, avant de commencer à exposer mon problème, que mes connaissances théoriques en matière relationnelle ne sont pas très développées.
Je demanderais donc votre indulgence quand à l'utilisation de mauvais termes
Je rencontre quelques difficultés à créer un schéma de base de données qui répondent aux problématiques suivante:
J'ai quatre entités A, B, C et D, dont les relations sont définit comme suit:
A -> B
A -> C
D -> B
que je représenterais ainsi en SQL
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 CREATE TABLE A ( id INTEGER, PRIMARY KEY(id) ); CREATE TABLE B ( id INTEGER, a_id INTEGER, PRIMARY KEY(id) FOREIGN KEY(a_id) REFERENCES A(id) ); CREATE TABLE C ( id INTEGER, a_id INTEGER, PRIMARY KEY(id) FOREIGN KEY(a_id) REFERENCES A(id) ); CREATE TABLE D ( id INTEGER, b_id INTEGER, PRIMARY KEY(id) FOREIGN KEY(b_id) REFERENCES B(id) );
Je souhaite crée une nouvelle relation entre C et D
Le problème, c'est que cette table permet des relations incohérentes. En effet, cette relation ne doit se limiter qu'aux entités partageant la même relation avec A.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE TABLE E ( c_id INTEGER, d_id INTEGER, PRIMARY KEY(c_id, d_id), FOREIGN KEY(c_id) REFERENCES C(id) FOREIGN KEY(d_id) REFERENCES D(id) );
Il faudrait donc rajouter un champ a_id, et modifier les clef étrangères en conséquences.
Seulement voilà, l'entité D ne dispose pas de relation direct avec A ! (sa relation avec A est indirect, et passe par B)
Du coups, je corrigerais ainsi:
Mais là, je ne respecte plus la deuxième forme normale, car j'ai un élément non clef (b_id) qui dépend d'une partie de la clef (a_id).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 CREATE TABLE E ( c_id INTEGER, d_id INTEGER, a_id INTEGER, b_id INTEGER, PRIMARY KEY(c_id, d_id, a_id), FOREIGN KEY(c_id, a_id) REFERENCES C(id, a_id), FOREIGN KEY(d_id, b_id) REFERENCES D(id, b_id), FOREIGN KEY(b_id, a_id) REFERENCES B(id, a_id) );
Avez vous des suggestions pour à la fois limiter les incohérences fonctionnelles, et respecter au moins les trois premières formes normales ?
Partager