Bonjour,
Le projet consiste à modéliser le site d'un fabricant de matériel.
Par commodité, le projet a été découpé en plusieurs étapes, ajoutant des sections (avec leurs fonctionnalités spécifiques) à chaque itération. Le découpage est le suivant :
1 - réalisation de la section catalogue des produits
2 - réalisation de la section listant les revendeurs du matériel produit par le fabricant
3 - réalisation de la section de support technique, incluant les modes d'emploi, des how-tos, etc.
Il n'est pas prévu de système de commande en ligne mais, si la modélisation est suffisamment modulaire, il ne devrait pas être compliqué de l'ajouter par la suite.
Modélisation du catalogue des produits
J'ai essayé de suivre la méthodologie classique proposée par les membres aguerris du forum et par Patrick Bergougnoux (@Paprick) dans son livre. Les modèles ont été réalisés avec Looping.
1 - Dictionnaire des données
Suite à une analyse du système à modéliser, j'ai tenté de lister les différentes rubriques à insérer dans le modèle. Paprick suggère, dans son livre, d'analyser les flux d'information pour en extraire les rubriques. Dans mon cas, ce n'est pas très facile car il n'y a pas de flux à proprement parlé, juste des entités. J'ai donc listé les entités et extrait les rubriques.
Voici le tableau que j'obtiens
n° Libellé Primaire/Calculable 1 Nom du produit P 2 Référence du produit P 3 Date de mise sur le marché du produit P 4 Date de retrait du marché du produit P 5 Image du produit P 6 Descriptif du produit P 7 Nom du fabricant du produit P 8 Nom de la gamme de produits P 9 Image de la gamme de produits P 10 Descriptif de la gamme de produits P 11 Nom de la catégorie P 12 Image de la catégorie P 13 Descriptif de la catégorie P 14 Contenu du produit P
Je n'ai pas considéré la rubrique 7 (Nom du fabricant du produit) comme un paramètre car, dans l'étape 3 du projet, il est prévu de mettre en place un système permettant de lister et d'expliquer le montage d'accessoires d'autres marques sur le matériel du fabricant. Par conséquent, j'ai préféré anticiper pour ne pas avoir à modifier le modèle à l'étape 3.
De ce tableau découlent les entités suivantes :
- Marque
- Produit
- Gamme
- Catégorie
Je n'ai pas rédigé de glossaire car les termes utilisés dans ce projet sont triviaux (catégorie, produit, gamme de produits, etc.).
2 - Règles de gestion
Voici les règles de gestion qui s'appliquent au système modélisé.
Marque :
RM01 : Une marque fabrique au moins un produit
RM02 : Un produit n'appartient qu'à une seule marque
Produit :
RP01 : Un produit peut posséder la même référence qu'un autre
RP02 : Un produit possède une date de mise sur le marché et une date de retrait du marché
RP03 : Le nom d'un produit peut être traduit dans une ou plusieurs langues
RP04 : Pour chaque langue, le produit porte un seul nom.
RP05 : Un produit peut contenir zéro, un ou plusieurs autres produits.
RP06 : Le contenu d'un produit est d'un seul type* : pack, contenu ou accessoire.
RP07 : Un produit est décrit par zéro, un ou plusieurs descriptifs de produit (descriptif complet, résumé, etc.)
RP08 : Un descriptif de produit décrit un seul produit
RP09 : Un descriptif de produit peut être traduit dans plusieurs langues
RP10 : Un produit est représenté par une ou plusieurs images
RP11 : Chaque produit possède une image par défaut
Gamme :
RG01 : Une gamme contient au moins un produit
RG02 : Un produit appartient à zéro, une ou plusieurs gammes
RG03 : Pour chaque langue, la gamme porte un seul nom
RG04 : Une gamme est décrite par zéro, un ou plusieurs descriptifs de gamme (descriptif complet, résumé, etc.)
RG05 : Un descriptif de gamme décrit une seule gamme
RG06 : Un descriptif de gamme peut être traduit dans une ou plusieurs langues
RG07 : Une gamme est représentée par une ou plusieurs images
RG08 : Chaque gamme possède une image par défaut
Catégorie :
RC01 : Une catégorie possède zéro, un ou plusieurs produits
RC02 : Une catégorie possède zéro, une ou plusieurs catégories filles
RC03 : Une catégorie possède une ou plusieurs catégories parentes
RC04 : Le nom d'une catégorie peut être traduit dans une ou plusieurs langues
RC05 : Pour chaque langue, la catégorie porte un seul nom
RC06 : Une catégorie est décrite par zéro, un ou plusieurs descriptifs de catégorie (descriptif complet, résumé, etc.)
RC07 : Un descriptif de catégorie décrit une seule catégorie
RC08 : Un descriptif de catégorie peut être traduit dans une ou plusieurs langues
RC09 : Une catégorie est représentée par une seule image
* Précisions sur les types de contenu d'un produit :
- Un pack est un groupe de produits qui sont proposés ensemble de façon occasionnelle. Il est possible de séparer les éléments du pack sans ouvrir le carton d'emballage.
- Un contenu est l'ensemble des produits individuels qui sont inclus dans le carton d'emballage du produit parent mais qui ne sont pas montés sur le produit parent. Il est possible de séparer les éléments du contenu uniquement en ouvrant le carton.
- Un accessoire est un produit individuel inclus dans le carton d'emballage et monté sur le produit parent. Il n'est possible de retirer un accessoire qu'en ouvrant le carton et en démontant le produit parent.
3 - Modèle Conceptuel des Données
Suite à plusieurs discussions avec fsmrel sur les approches de modélisation des catégories (arbre hiérarchique) et d'internationalisation des noms et des descriptifs, j'obtiens le MCD suivant, réalisé sous Looping :
- Le slug est un champ "technique" contenant l'URL unique et explicite utilisé pour le référencement naturel par les moteurs de recherche. Il n'est utilisé que pour les liens vers les pages de catégorie, de gamme et de produit. Le slug est généré automatiquement à partir du nom dans la langue concernée ; tee-shirt bleu à manches longues devient tee-shirt-bleu-a-manches-longues, par exemple.
- Les champs booléens supplémentaires (est_actif, est_affiche) sont destinés à masquer rapidement et facilement les entités dans le site. Ils permettront d'éditer le contenu en toute sécurité avant publication.
- Les champs est_special et est_produit de Categorie sont destinés aux menus et aux règles d'affichage du contenu des catégories. Il m'a paru plus judicieux d'intégrer ce type de flag dans la base plutôt que de rédiger du code tarabiscoté chargé de gérer les exceptions de formatage.
- Le type dans la relation contenir reliant les produits à eux-mêmes sera géré par une énumération.
Voici le code SQL généré par Looping :
Avant d'avancer dans les autres scripts de la base de données (vues, procédures stockées ou déclencheurs) ou d'envisager d'optimiser le MPD, je souhaiterai savoir si mon MCD vous paraît pertinent.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191 CREATE TABLE catalogue_langue( id_langue COUNTER, nom_langue VARCHAR(100) NOT NULL, code_langue_iso2 VARCHAR(2) NOT NULL, code_langue_iso3 VARCHAR(3) NOT NULL, est_actif LOGICAL NOT NULL DEFAULT=false, est_affiche LOGICAL NOT NULL DEFAULT=false, PRIMARY KEY(id_langue) ); CREATE TABLE catalogue_marque( id_marque COUNTER, nom VARCHAR(100) NOT NULL, est_active LOGICAL NOT NULL DEFAULT=false, est_affichee LOGICAL NOT NULL DEFAULT=false, PRIMARY KEY(id_marque), UNIQUE(nom) ); CREATE TABLE catalogue_produit( id_produit COUNTER, reference VARCHAR(16) NOT NULL, date_creation DATETIME NOT NULL, date_disparition DATETIME, est_actif LOGICAL NOT NULL DEFAULT=false, est_affiche LOGICAL NOT NULL DEFAULT=false, id_marque INT NOT NULL, PRIMARY KEY(id_produit), FOREIGN KEY(id_marque) REFERENCES catalogue_marque(id_marque) ); CREATE TABLE catalogue_categorie( id_categorie VARCHAR(50), est_actif LOGICAL NOT NULL DEFAULT=false, est_affiche LOGICAL NOT NULL DEFAULT=false, est_special LOGICAL NOT NULL DEFAULT=false, est_produit LOGICAL NOT NULL DEFAULT=false, PRIMARY KEY(id_categorie) ); CREATE TABLE catalogue_gamme( id_gamme COUNTER, est_actif LOGICAL NOT NULL DEFAULT=false, est_affiche LOGICAL NOT NULL DEFAULT=false, PRIMARY KEY(id_gamme) ); CREATE TABLE catalogue_nom( id_nom COUNTER, nom VARCHAR(150) NOT NULL, slug VARCHAR(150) NOT NULL, id_langue INT NOT NULL, PRIMARY KEY(id_nom), UNIQUE(slug), FOREIGN KEY(id_langue) REFERENCES catalogue_langue(id_langue) ); CREATE TABLE catalogue_descriptif( id_descriptif COUNTER, descriptif TEXT NOT NULL, derniere_modification DATETIME NOT NULL DEFAULT = now(), est_active LOGICAL NOT NULL DEFAULT=false, est_affichee LOGICAL NOT NULL DEFAULT = now(), id_langue INT NOT NULL, PRIMARY KEY(id_descriptif), FOREIGN KEY(id_langue) REFERENCES catalogue_langue(id_langue) ); CREATE TABLE catalogue_image( id_image COUNTER, nom_image VARCHAR(150) NOT NULL, est_active LOGICAL NOT NULL DEFAULT=false, est_affichee LOGICAL NOT NULL DEFAULT=false, PRIMARY KEY(id_image) ); CREATE TABLE catalogue_contenu_categorie( id_categorie_EnfantId VARCHAR(50), id_categorie_ParentId VARCHAR(50) NOT NULL, PRIMARY KEY(id_categorie_EnfantId), FOREIGN KEY(id_categorie_EnfantId) REFERENCES catalogue_categorie(id_categorie), FOREIGN KEY(id_categorie_ParentId) REFERENCES catalogue_categorie(id_categorie) ); CREATE TABLE catalogue_contenu_produit( id_produit_ItemId INT, type VARCHAR(50) NOT NULL, id_produit INT NOT NULL, PRIMARY KEY(id_produit_ItemId), FOREIGN KEY(id_produit_ItemId) REFERENCES catalogue_produit(id_produit), FOREIGN KEY(id_produit) REFERENCES catalogue_produit(id_produit) ); CREATE TABLE catalogue_gamme_produit( id_gamme INT, id_produit INT, PRIMARY KEY(id_gamme, id_produit), FOREIGN KEY(id_gamme) REFERENCES catalogue_gamme(id_gamme), FOREIGN KEY(id_produit) REFERENCES catalogue_produit(id_produit) ); CREATE TABLE catalogue_categorie_produit( id_produit INT, id_categorie VARCHAR(50), PRIMARY KEY(id_produit, id_categorie), FOREIGN KEY(id_produit) REFERENCES catalogue_produit(id_produit), FOREIGN KEY(id_categorie) REFERENCES catalogue_categorie(id_categorie) ); CREATE TABLE catalogue_nom_produit( id_produit INT, id_nom INT, PRIMARY KEY(id_produit, id_nom), FOREIGN KEY(id_produit) REFERENCES catalogue_produit(id_produit), FOREIGN KEY(id_nom) REFERENCES catalogue_nom(id_nom) ); CREATE TABLE catalogue_nom_gamme( id_gamme INT, id_nom INT, PRIMARY KEY(id_gamme, id_nom), FOREIGN KEY(id_gamme) REFERENCES catalogue_gamme(id_gamme), FOREIGN KEY(id_nom) REFERENCES catalogue_nom(id_nom) ); CREATE TABLE catalogue_nom_categorie( id_categorie VARCHAR(50), id_nom INT, PRIMARY KEY(id_categorie, id_nom), FOREIGN KEY(id_categorie) REFERENCES catalogue_categorie(id_categorie), FOREIGN KEY(id_nom) REFERENCES catalogue_nom(id_nom) ); CREATE TABLE catalogue_description_categorie( id_categorie VARCHAR(50), id_descriptif INT, PRIMARY KEY(id_categorie, id_descriptif), FOREIGN KEY(id_categorie) REFERENCES catalogue_categorie(id_categorie), FOREIGN KEY(id_descriptif) REFERENCES catalogue_descriptif(id_descriptif) ); CREATE TABLE catalogue_description_produit( id_produit INT, id_descriptif INT, PRIMARY KEY(id_produit, id_descriptif), FOREIGN KEY(id_produit) REFERENCES catalogue_produit(id_produit), FOREIGN KEY(id_descriptif) REFERENCES catalogue_descriptif(id_descriptif) ); CREATE TABLE catalogue_description_gamme( id_gamme INT, id_descriptif INT, PRIMARY KEY(id_gamme, id_descriptif), FOREIGN KEY(id_gamme) REFERENCES catalogue_gamme(id_gamme), FOREIGN KEY(id_descriptif) REFERENCES catalogue_descriptif(id_descriptif) ); CREATE TABLE catalogue_image_categorie( id_categorie VARCHAR(50), id_image INT, PRIMARY KEY(id_categorie, id_image), FOREIGN KEY(id_categorie) REFERENCES catalogue_categorie(id_categorie), FOREIGN KEY(id_image) REFERENCES catalogue_image(id_image) ); CREATE TABLE catalogue_image_produit( id_produit INT, id_image INT, par_defaut LOGICAL NOT NULL, PRIMARY KEY(id_produit, id_image), FOREIGN KEY(id_produit) REFERENCES catalogue_produit(id_produit), FOREIGN KEY(id_image) REFERENCES catalogue_image(id_image) ); CREATE TABLE catalogue_image_gamme( id_gamme INT, id_image INT, par_defaut LOGICAL NOT NULL, PRIMARY KEY(id_gamme, id_image), FOREIGN KEY(id_gamme) REFERENCES catalogue_gamme(id_gamme), FOREIGN KEY(id_image) REFERENCES catalogue_image(id_image) ); CREATE TABLE catalogue_image_description( id_descriptif INT, id_image INT, PRIMARY KEY(id_descriptif, id_image), FOREIGN KEY(id_descriptif) REFERENCES catalogue_descriptif(id_descriptif), FOREIGN KEY(id_image) REFERENCES catalogue_image(id_image) );
Merci par avance,
Vincent
Partager