Bonsoir bensam1,
Envoyé par
fsmrel
Le quadruplet <d1, ca1 c1, s1> est absent de CC_AFF_CA_STR, mais le SGBD exige cette fois-ci sa présence à cause de l’intégrité référentielle : du coup le contrôle de la contrainte de chemin fonctionne.
Ma phrase est incomplète, il faut lire :
Le quadruplet <d1, ca1 c1, s1> est absent de CC_AFF_CA_STR, mais du fait de la mise en oeuvre de CC_AFF_CA_STR_DRA, le SGBD exige cette fois-ci la présence du quadruplet à cause de l’intégrité référentielle : du coup le contrôle de la contrainte de chemin fonctionne.
En l’absence de CC_AFF_CA_STR_DRA, c'est-à-dire si on utilise votre MCD, le quadruplet <d1, ca1 c1, s1> peut être absent à tort de CC_AFF_CA_STR :
Légalement il n’y a pas de problème à ce que par le chemin (c1) on aboutisse à la structure s1 tandis que par le chemin (c2) on aboutisse à la structure s2 :
CC_AFFECTATION_CA
id_domaine id_ca id_cc
d1 ca1 cc1
CC_AFF_CA_STR
id_domaine id_ca id_cc id_structure
d1 ca1 cc1 s2
STRUCTURE_DRA
id_domaine id_structure
d1 s1
d1 s2
DRA
id_domaine id_structure id_dra
d1 s1 a1
OPERATION_DRA
id_domaine id_structure id_dra id_operation
d1 s1 a1 o1
DEPENSE_DRA
id_domaine id_structure id_dra id_operation id_ca id_cc
d1 s1 a1 o1 ca1 cc1
Ainsi, par le chemin (c1) DEPENSE_DRA > OPERATION_DRA > DRA > STRUCTURE_DRA, pour la dépense DRA <d1, a1, o1, s1> on atteint la structure DRA s1, tandis que par le chemin (c2) DEPENSE_DRA > CC_AFFECTATION_CA > CC_AFF_CA_STR > STRUCTURE_DRA, on atteint la structure DRA s2.
Conclusion : la contrainte de chemin n’est pas garantie, aussi est-il nécessaire de remplacer l’association CONTENIR connectant DEPENSE_DRA et CC_AFFECTATION_CA, par l’association CC_AFF_CA_STR_DRA connectant DEPENSE_DRA et CC_AFF_CA_STR.
Si on conserve l’association CONTENIR, la structure tabulaire est la suivante :
CREATE TABLE DOMAINE
(
Id_domaine INT NOT NULL,
code_domaine VARCHAR(64) NOT NULL,
CONSTRAINT DOMAINE_PK PRIMARY KEY (Id_domaine),
CONSTRAINT DOMAINE_AK UNIQUE (code_domaine)
) ;
CREATE TABLE COMPTE_ANALYTIQUE
(
Id_domaine INT NOT NULL,
Id_compte_analytique INT NOT NULL,
Compte_analytique CHAR(16) NOT NULL,
CONSTRAINT COMPTE_ANALYTIQUE_PK PRIMARY KEY (Id_domaine, Id_compte_analytique),
CONSTRAINT COMPTE_ANALYTIQUE_AK UNIQUE (Compte_analytique),
CONSTRAINT COMPTE_ANALYTIQUE_DOMAINE_FK FOREIGN KEY (Id_domaine)
REFERENCES DOMAINE (Id_domaine)
) ;
CREATE TABLE COMPTE_CHARGE
(
Id_compte_charge INT NOT NULL,
Compte_charge CHAR(10) NOT NULL,
CONSTRAINT COMPTE_CHARGE_PK PRIMARY KEY (Id_compte_charge),
CONSTRAINT COMPTE_CHARGE_AK UNIQUE (Compte_charge)
) ;
CREATE TABLE COMPTE_CHARGE_AVEC_CA
(
Id_compte_charge INT NOT NULL,
CONSTRAINT COMPTE_CHARGE_AVEC_CA_PK PRIMARY KEY (Id_compte_charge),
CONSTRAINT COMPTE_CHARGE_AVEC_CA_COMPTE_CHARGE_FK FOREIGN KEY (Id_compte_charge)
REFERENCES COMPTE_CHARGE (Id_compte_charge)
) ;
CREATE TABLE CC_AFFECTATION_CA
(
Id_domaine INT NOT NULL,
Id_compte_analytique INT NOT NULL,
Id_compte_charge INT NOT NULL,
CONSTRAINT CC_AFFECTATION_CA_PK PRIMARY KEY (Id_domaine, Id_compte_analytique, Id_compte_charge),
CONSTRAINT CC_AFFECTATION_CA_COMPTE_ANALYTIQUE_FK FOREIGN KEY (Id_domaine, Id_compte_analytique)
REFERENCES COMPTE_ANALYTIQUE (Id_domaine, Id_compte_analytique),
CONSTRAINT CC_AFFECTATION_CA_COMPTE_CHARGE_AVEC_CA_FK FOREIGN KEY (Id_compte_charge)
REFERENCES COMPTE_CHARGE_AVEC_CA (Id_compte_charge)
) ;
CREATE TABLE STRUCTURE_REGIONALE
(
Id_domaine INT NOT NULL,
id_structure INT NOT NULL,
code_structure VARCHAR(64) NOT NULL,
CONSTRAINT STRUCTURE_REGIONALE_PK PRIMARY KEY (Id_domaine, id_structure),
CONSTRAINT STRUCTURE_REGIONALE_AK UNIQUE (code_structure),
CONSTRAINT STRUCTURE_REGIONALE_DOMAINE_FK FOREIGN KEY (Id_domaine)
REFERENCES DOMAINE (Id_domaine)
) ;
CREATE TABLE STRUCTURE_DRA
(
Id_domaine INT NOT NULL,
id_structure INT NOT NULL,
CONSTRAINT STRUCTURE_DRA_PK PRIMARY KEY (Id_domaine, id_structure),
CONSTRAINT STRUCTURE_DRA_STRUCTURE_REGIONALE_FK FOREIGN KEY (Id_domaine, id_structure)
REFERENCES STRUCTURE_REGIONALE (Id_domaine, id_structure)
) ;
CREATE TABLE CC_AFF_CA_STR
(
Id_domaine INT NOT NULL,
id_structure INT NOT NULL,
Id_compte_analytique INT NOT NULL,
Id_compte_charge INT NOT NULL,
CONSTRAINT CC_AFF_CA_STR_PK PRIMARY KEY (Id_domaine, id_structure, Id_compte_analytique, Id_compte_charge),
CONSTRAINT CC_AFF_CA_STR_STRUCTURE_DRA_FK FOREIGN KEY (Id_domaine, id_structure)
REFERENCES STRUCTURE_DRA (Id_domaine, id_structure),
CONSTRAINT CC_AFF_CA_STR_CC_AFFECTATION_CA_FK FOREIGN KEY (Id_domaine, Id_compte_analytique, Id_compte_charge)
REFERENCES CC_AFFECTATION_CA (Id_domaine, Id_compte_analytique, Id_compte_charge)
) ;
CREATE TABLE COMPTE_CHARGE_SANS_CA
(
Id_compte_charge INT NOT NULL,
Id_domaine INT NOT NULL,
CONSTRAINT COMPTE_CHARGE_SANS_CA_PK PRIMARY KEY (Id_compte_charge),
CONSTRAINT COMPTE_CHARGE_SANS_CA_DOMAINE_FK FOREIGN KEY (Id_domaine)
REFERENCES DOMAINE (Id_domaine),
CONSTRAINT COMPTE_CHARGE_SANS_CA_COMPTE_CHARGE_FK FOREIGN KEY (Id_compte_charge)
REFERENCES COMPTE_CHARGE (Id_compte_charge)
) ;
CREATE TABLE DRA
(
Id_domaine INT NOT NULL,
id_structure INT NOT NULL,
id_dra INT NOT NULL,
CONSTRAINT DRA_PK PRIMARY KEY (Id_domaine, id_structure, id_dra),
CONSTRAINT DRA_STRUCTURE_DRA_FK FOREIGN KEY (Id_domaine, id_structure)
REFERENCES STRUCTURE_DRA (Id_domaine, id_structure)
) ;
CREATE TABLE OPERATION_DRA
(
Id_domaine INT NOT NULL,
id_structure INT NOT NULL,
id_dra INT NOT NULL,
id_operation INT NOT NULL,
CONSTRAINT OPERATION_DRA_PK PRIMARY KEY (Id_domaine, id_structure, id_dra, id_operation),
CONSTRAINT OPERATION_DRA_DRA_FK FOREIGN KEY (Id_domaine, id_structure, id_dra)
REFERENCES DRA (Id_domaine, id_structure, id_dra)
) ;
CREATE TABLE DEPENSE_DRA
(
Id_domaine INT NOT NULL,
id_structure INT NOT NULL,
id_dra INT NOT NULL,
id_operation INT NOT NULL,
Id_compte_analytique INT NOT NULL,
Id_compte_charge INT NOT NULL,
CONSTRAINT DEPENSE_DRA_PK PRIMARY KEY (Id_domaine, id_structure, id_dra, id_operation),
CONSTRAINT DEPENSE_DRA_CC_AFFECTATION_CA_FK FOREIGN KEY (Id_domaine, Id_compte_analytique, Id_compte_charge)
REFERENCES CC_AFFECTATION_CA (Id_domaine, Id_compte_analytique, Id_compte_charge),
CONSTRAINT DEPENSE_DRA_OPERATION_DRA_FK FOREIGN KEY (Id_domaine, id_structure, id_dra, id_operation)
REFERENCES OPERATION_DRA (Id_domaine, id_structure, id_dra, id_operation)
) ;
CREATE TABLE OPER_SPEC_DRA
(
Id_domaine INT NOT NULL,
id_structure INT NOT NULL,
id_dra INT NOT NULL,
id_operation INT NOT NULL,
CONSTRAINT OPER_SPEC_DRA_PK PRIMARY KEY (Id_domaine, id_structure, id_dra, id_operation),
CONSTRAINT OPER_SPEC_DRA_OPERATION_DRA_FK FOREIGN KEY (Id_domaine, id_structure, id_dra, id_operation)
REFERENCES OPERATION_DRA (Id_domaine, id_structure, id_dra, id_operation)
) ;
Un début de jeu d’essai :
INSERT INTO DOMAINE (Id_domaine, code_domaine) VALUES (1, 'd1') ;
INSERT INTO COMPTE_ANALYTIQUE (Id_domaine, Id_compte_analytique, Compte_analytique) VALUES (1, 1, 'ca1') ;
INSERT INTO COMPTE_CHARGE (Id_compte_charge, Compte_charge) VALUES (1, 'cc1') ;
INSERT INTO COMPTE_CHARGE_AVEC_CA (Id_compte_charge) VALUES (1) ;
INSERT INTO CC_AFFECTATION_CA (Id_domaine, Id_compte_analytique, Id_compte_charge) VALUES (1, 1, 1) ;
INSERT INTO STRUCTURE_REGIONALE (Id_domaine, id_structure, code_structure) VALUES (1, 1, 's1'), (1, 2, 's2') ;
INSERT INTO STRUCTURE_DRA (Id_domaine, id_structure) VALUES (1, 1), (1, 2) ;
INSERT INTO CC_AFF_CA_STR (Id_domaine, id_structure, Id_compte_analytique, Id_compte_charge) VALUES (1, 2, 1, 1) ;
INSERT INTO DRA (Id_domaine, id_structure, id_dra) VALUES (1, 1, 1) ;
INSERT INTO OPERATION_DRA (Id_domaine, id_structure, id_dra, id_operation) VALUES (1, 1, 1, 1) ;
INSERT INTO DEPENSE_DRA (Id_domaine, id_structure, id_dra, id_operation, Id_compte_analytique, Id_compte_charge) VALUES (1, 1, 1, 1, 1, 1) ;
Quel est le nom de la structure pour chaque dépense DRA du domaine d1, pour le compte analytique ca1 et le compte de charge cc1 ?
SELECT code_structure
FROM DEPENSE_DRA AS x JOIN CC_AFF_CA_STR AS y ON x.Id_domaine = y.Id_domaine AND x.id_structure = y.id_structure
AND x.Id_compte_analytique = y.Id_compte_analytique
AND x.Id_compte_charge = y.Id_compte_charge
JOIN STRUCTURE_REGIONALE AS z ON y.Id_domaine = z.Id_domaine AND y.id_structure = z.id_structure
WHERE x.Id_domaine = 1 AND x.Id_compte_analytique = 1 AND x.Id_compte_charge = 1
;
Le résultat est vide, mais aucune erreur n’est signalée.
Si pour la table DEPENSE_DRA on remplace l’association CONTENIR par l’association CC_AFF_CA_STR_DRA, cette fois-ci le SGBD déclenchera une erreur d’intégrité référentielle, au motif que le quadruplet <d1, s1, ca1, cc1> est absent de la table de référence CC_AFF_CA_STR :
CREATE TABLE DEPENSE_DRA
(
Id_domaine INT NOT NULL,
id_structure INT NOT NULL,
id_dra INT NOT NULL,
id_operation INT NOT NULL,
Id_compte_analytique INT NOT NULL,
Id_compte_charge INT NOT NULL,
CONSTRAINT DEPENSE_DRA_PK PRIMARY KEY (Id_domaine, id_structure, id_dra, id_operation),
CONSTRAINT DEPENSE_DRA_CC_AFFECTATION_CA_FK FOREIGN KEY (Id_domaine, Id_compte_analytique, Id_compte_charge)
REFERENCES CC_AFFECTATION_CA (Id_domaine, Id_compte_analytique, Id_compte_charge),
CONSTRAINT DEPENSE_DRA_OPERATION_DRA_FK FOREIGN KEY (Id_domaine, id_structure, id_dra, id_operation)
REFERENCES OPERATION_DRA (Id_domaine, id_structure, id_dra, id_operation)
) ;
Le SELECT => Boum !
Envoyé par
bensam1
Par exemple si <d1, ca1 cc1, s1> est présent au CC_AFF_CA_STR alors cc1 est le compte de charge spéciale qui est compte de visite médical. par l'intégrité référentiel, une Dépense DRA doit toujours contenir {cc1 ca1} a cause de la relation CC_AFF_CA_STR_DRA.
L’association CC_AFF_CA_STR_DRA, connectant DEPENSE_DRA et CC_AFF_CA_STR, est bien là pour garantir la contrainte de chemin, et éviter le fâcheux résultat précédent, provoqué par l’association de DEPENSE_DRA directement avec CC_AFFECTATION_CA (via CONTENIR), faisant que dans ce cas-là aucune erreur n’est signalée, hélas !
Envoyé par
bensam1
et cela que je veux éviter car je veux historier le solde
Qui dit historiser, dit prévoir la date dans la liste des attributs de la DRA. Cela dit, à quoi correspondent les attributs figurant dans l’association ETABLIR_SELON ?
Partager