Bonjour,
Je butte depuis plusieurs jours sur la conception d'une base de données. Voici en quelques mots la problématique (simplifiée) :
Des personnes font des demandes pour consulter plusieurs articles sur plusieurs années. (Les articles sont à prendre dans le sens "catalogue" du terme : un article est identique sur plusieurs année.)
Particularité : ces demandes sont nombreuses et très souvent identiques : elles concernent toutes généralement les trois dernières années, et les articles demandés sont très souvent les mêmes (généralement 5 articles).
Je vous détaille les différentes solutions qui me sont venues à l'esprit.
Dans un premier temps (assez court), j'ai envisagé de tout mettre dans la même table DEMANDE (id, n°_demande, id_personne, annee, id_article) : exemple d'une demande de id_personne=1, concernant les articles 15 à 19 pour les années 2008 et 2009 :
table DEMANDE
Pour une demande, j'ai 10 lignes ! La table grossit donc très vite (en moyenne 15 lignes par demande !).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 id | n°_demande | id_personne | annee | id_article --------------------------------------------------- 1 | 1 | 1 | 2008 | 15 2 | 1 | 1 | 2008 | 16 3 | 1 | 1 | 2008 | 17 4 | 1 | 1 | 2008 | 18 5 | 1 | 1 | 2008 | 19 6 | 1 | 1 | 2009 | 15 7 | 1 | 1 | 2009 | 16 8 | 1 | 1 | 2009 | 17 9 | 1 | 1 | 2009 | 18 10 | 1 | 1 | 2009 | 19
Et si une autre personne (id_personne = 2) fait la même demande que la personne (id_personne = 1), ce qui dans mon cas est extrèmement fréquent, j'ai une forte redondance d'informations :
table DEMANDE
Bref, j'ai écarté cette solution, et j'ai créé une table "cascadée", REQUETE (id, id_lot_requete, annee, id_article), afin de ne garder qu'une ligne par demande et de limiter la redondance :
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 id | n°_demande | id_personne | annee | id_article --------------------------------------------- 1 | 1 | 1 | 2008 | 15 2 | 1 | 1 | 2008 | 16 ...| 1 | 1 | 2008 | 17 | 1 | 1 | 2008 | 18 | 1 | 1 | 2008 | 19 | 1 | 1 | 2009 | 15 | 1 | 1 | 2009 | 16 | 1 | 1 | 2009 | 17 | 1 | 1 | 2009 | 18 | 1 | 1 | 2009 | 19 --------------------------------------------- | 2 | 2 | 2008 | 15 | 2 | 2 | 2008 | 16 | 2 | 2 | 2008 | 17 | 2 | 2 | 2008 | 18 | 2 | 2 | 2008 | 19 | 2 | 2 | 2009 | 15 | 2 | 2 | 2009 | 16 | 2 | 2 | 2009 | 17 | 2 | 2 | 2009 | 18 | 2 | 2 | 2009 | 19
table DEMANDE
table REQUETE
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 id_demande | id_personne | id_lot_requete ----------------------------------------- 1 | 1 | 1
(Le champ id n'est qu'un identifiant technique, je ne les ai pas tous écrits.)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 id | id_lot_req | annee | id_article ------------------------------------ 1 | 1 | 2008 | 15 2 | 1 | 2008 | 16 3 | 1 | 2008 | 17 4 | 1 | 2008 | 18 5 | 1 | 2008 | 19 5 | 1 | 2009 | 15 6 | 1 | 2009 | 16 7 | 1 | 2009 | 17 ...| 1 | 2009 | 18 | 1 | 2009 | 19
Avantage : si une deuxième personne fait la même requête, la table REQUETE ne bouge pas, et la table DEMANDE ne prend qu'une ligne, avec une "pointeur" sur l'id_lot_req = 1
table DEMANDE
Problème : je trouve que cette cascade complique pas mal les futures insertions de demande : il va falloir que je parcours la table REQUETE à chaque fois, pour voir si la requête n'a pas déjà été soumise.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 id_demande | id_personne | id_lot_req ------------------------------------- 1 | 1 | 1 2 | 2 | 1
Et pour être franc, je ne vois pas comment je peux faire ce genre d'insertion.
Par ailleurs, la table REQUETE repète pas mal d'info (la liste des articles). J'hésite à refaire une "cascade", avec une table LOT_ARTICLE du genre :
table LOT_ARTICLE
La table REQUETE deviendrait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 id | id_lot_art | id_article ---------------------------- 1 | 1 | 15 2 | 1 | 16 3 | 1 | 17 4 | 1 | 18 5 | 1 | 19
table REQUETE
Problème : les insertions deviennent encore plus compliquées !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 id | id_lot_req | annee | id_lot_art ------------------------------------ 1 | 1 | 2008 | 1 2 | 1 | 2009 | 1
Bref, je me demande si je suis sur la bonne piste, avec cette idée de "lots". Voyez-vous une autre façon de concevoir cette base de données (quitte à tout remettre en question) ? Voire à remettre en question les fondements des bases de données relationnelles (mettre la liste des articles dans un même champ "15-16-17-18-19") ?
Merci pour votre aide !
Partager