Bonjour,

Je souhaite ajouter des tables à ma base pour faire des statistiques sur le nombre d'objets déduits ou stockés par année/mois/jour et par catégorie et sous-catégorie.
J'ai des catégories d'objets, qui peuvent posséder une sous-catégorie. Les sous-catégorie ne peuvent appartenir qu'à une catégorie.
ex:
- catégorie : outils
-> sous-catégorie : jardinage
-> sous-catégorie : maçonnerie

- catégorie : visserie (pas de sous catégorie).

ex de comptage réalisé :
40000 outils stocké et 100 détruits l'année dernière.

Sachant que je ne souhaite pas utiliser d'héritage, voici un MCD qui répond au besoin :


Le code DDL qui permet de créer les tables :
Code sql : 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
CREATE TABLE CATEGORIE
(
   id int,
   libelle VARCHAR(50) NOT NULL,
   CONSTRAINT CATEGORIE_PK PRIMARY KEY(id)
);
 
CREATE TABLE SOUS_CATEGORIE
(
   id INT,
   idCategorie INT NOT NULL,
   libelle VARCHAR(50) NOT NULL,
   CONSTRAINT SOUS_CATEGORIE_PK PRIMARY KEY(id),
   CONSTRAINT SOUS_CATEGORIE_CATEGORIE_FK FOREIGN KEY(idCategorie) 
       REFERENCES CATEGORIE(id)
);
 
CREATE TABLE COMPTAGE
(
   id INT,
   idCategorie,
   idSousCategorie,
   dateComptage DATE NOT NULL,
   nbDestructions INT NOT NULL,
   nbStockages INT NOT NULL,
   CONSTRAINT COMPTAGE_PK PRIMARY KEY(id),
   CONSTRAINT COMPTAGE_CATEGORIE_FK FOREIGN KEY(idCategorie) 
       REFERENCES CATEGORIE(id),
   CONSTRAINT COMPTAGE_SOUS_CATEGORIE_FK FOREIGN KEY(idSousCategorie) 
       REFERENCES SOUS_CATEGORIE(id)
);

Ma problématique est : pour faire les insertions dans la table COMPTAGE en respectant le modèle et notamment la contrainte d'exclusion, comment dois-je procéder ?

Par exemple, avec ces entrées en tables :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
INSERT INTO CATEGORIE VALUES (1, 'outillage');
INSERT INTO CATEGORIE VALUES (2, 'visserie');
 
INSERT INTO SOUS_CATEGORIE VALUES (1, 1, 'jardinage');
INSERT INTO SOUS_CATEGORIE VALUES (2, 1, 'maconnerie');

Est-ce que je peux faire les insertions en mettant à null la clés étrangères idSousCategorie quand il n'y a pas de sous catégorie et renseigner idCategorie et idSousCategorie quand la sous catégorie existe ?
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
INSERT INTO COMPTAGE VALUES (1, 1, 1, '20200612 01:23:09 PM', 10, 100);
INSERT INTO COMPTAGE VALUES (2, 1, 2, '20200612 01:30:00 PM', 0, 50);
INSERT INTO COMPTAGE VALUES (3, 2, null, '20200612 01:40:00 PM', 1000, 10000);

Ou est-ce que je dois faire les insertions en mettant à null la clé étrangère idSousCategorie quand la sous catégorie n'existe pas et mettre à null idCategorie quand la sous catégorie existe ?
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
INSERT INTO COMPTAGE VALUES (1, null, 1, '20200612 01:23:09 PM', 10, 100);
INSERT INTO COMPTAGE VALUES (2, null, 2, '20200612 01:30:00 PM', 0, 50);
INSERT INTO COMPTAGE VALUES (3, 2, null, '20200612 01:40:00 PM', 1000, 10000);

Merci d'avance pour votre aide et à bientôt.