Bonsoir Zizoua,
![Citation](https://forum.developpez.be/images/misc/quote_icon.png)
Envoyé par
Zizoua
Dites moi ce qui vous ai permis de mettre les commissions dans les associations de cardinalité 0,N et 0,1, étant donné que la cardinalité la plus forte doit migrer vers celle qui est la plus faible.
Des personnes sans doute compétentes en modélisation conceptuelle, c'est-à-dire en production de modèles conceptuels des données (MCD), mais ignorants de la théorie relationnelle, ont énoncé des règles trop simples (donc qui ne fonctionnent pas), ou bien ont simplement colporté la légende à laquelle vous faites allusion, sans en vérifier le bien fondé, mesuré les conséquences fâcheuses, et seraient bien inspirés de méditer la proposition 7 de Wittgenstein...
Dans la série des règles trop simples, on trouve par exemple ceci (cf. Comprendre Merise : outils conceptuels et organisationnels de J.-P. Matheron) :
Objectons que :
(1) Certaines entités-types ne deviennent pas des relations (tables dans le contexte SQL) mais donnent lieu seulement à des attributs dans les tables supposées les référencer, cas notamment de l’entité-type DATE ;
(2) Si l’association R de l’exemple ci-dessus disparaît, alors c’est l’arrivée en force du bonhomme Null, hors-la-loi en ce qui concerne la théorie relationnelle, et accepté, hélas ! en SQL.
Par contre, DB-MAIN génère un MLD correct, les associations CTR_APP er CTR_COUR donnent évidemment lieu à des tables :
D’où le script SQL de création des tables (MySQL) :
create table APPORTEUR (
id_apporteur int not null,
constraint APPORTEUR_PK primary key (id_apporteur));
create table ASSURE (
id_assure int not null,
date_naissance date not null,
num_assure char(12) not null,
constraint ASSURE_PK primary key (id_assure),
constraint ASSURE_AK unique (num_assure));
create table CONTRAT (
id_police int not null,
num_police char(12) not null,
id_assure int not null,
date_effet date not null,
id_producteur int not null,
constraint CONTRAT_PK primary key (id_police),
constraint CONTRAT_AK unique (num_police));
create table COURTIER (
id_courtier int not null,
constraint COURTIER_PK primary key (id_courtier));
create table CTR_APP (
id_police int not null,
id_apporteur int not null,
mt_commission int not null,
constraint CTR_APP_PK primary key (id_police));
create table CTR_COUR (
id_police int not null,
id_courtier int not null,
mt_commission int not null,
constraint CTR_COUR_PK primary key (id_police));
create table NON_COURTIER (
id_personne int not null,
constraint NON_COURTIER_PK primary key (id_personne));
create table PRODUCTEUR (
id_producteur int not null,
constraint PRODUCTEUR_PK primary key (id_producteur));
create table PROFESSIONNEL (
id_personne int not null,
constraint PROFESSIONNEL_PK primary key (id_personne));
create table SOUSCRIPTEUR (
id_personne int not null,
nom_personne varchar(32) not null,
tel_personne varchar(20) not null,
etc varchar(32) not null,
constraint SOUSCRIPTEUR_PK primary key (id_personne));
alter table APPORTEUR add constraint APPORTEUR_NON_COURTIER_FK
foreign key (id_apporteur)
references NON_COURTIER (id_personne);
alter table ASSURE add constraint ASSURE_SOUSCRIPTEUR_FK
foreign key (id_assure)
references SOUSCRIPTEUR (id_personne);
alter table CONTRAT add constraint CONTRAT_PRODUCTEUR_FK
foreign key (id_producteur)
references PRODUCTEUR (id_producteur);
alter table CONTRAT add constraint CONTRAT_ASSURE_FK
foreign key (id_assure)
references ASSURE (id_assure);
alter table COURTIER add constraint COURTIER_PROFESSIONNEL_FK
foreign key (id_courtier)
references PROFESSIONNEL (id_personne);
alter table CTR_APP add constraint CTR_APP_CONTRAT_FK
foreign key (id_police)
references CONTRAT (id_police);
alter table CTR_APP add constraint CTR_APP_APPORTEUR_FK
foreign key (id_apporteur)
references APPORTEUR (id_apporteur);
alter table CTR_COUR add constraint CTR_COUR_COURTIER_FK
foreign key (id_courtier)
references COURTIER (id_courtier);
alter table CTR_COUR add constraint CTR_COUR_CONTRAT_FK
foreign key (id_police)
references CONTRAT (id_police);
alter table NON_COURTIER add constraint NON_COURTIER_PROFESSIONNEL_FK
foreign key (id_personne)
references PROFESSIONNEL (id_personne);
alter table PRODUCTEUR add constraint PRODUCTEUR_NON_COURTIER_FK
foreign key (id_producteur)
references NON_COURTIER (id_personne);
alter table PROFESSIONNEL add constraint PROFESSIONNEL_SOUSCRIPTEUR_FK
foreign key (id_personne)
references SOUSCRIPTEUR (id_personne);
![Citation](https://forum.developpez.be/images/misc/quote_icon.png)
Envoyé par
Zizoua
dans votre diagramme, je n'ai pas vu où il faut mettre la commission si condition remplie
Dans le MCD, le montant de la commission d’un apporteur fait l’objet d’un attribut mt_commission de l’association CTR_APP. Le montant de la commission d’un courtier fait l’objet d’un attribut mt_commission de l’association CTR_COUR.
Dans le MLD, le montant de la commission d’un apporteur fait l’objet d’un attribut mt_commission de la table CTR_APP. Le montant de la commission d’un courtier fait l’objet d’un attribut mt_commission de la table CTR_COUR.
Dans le script SQL, le montant de la commission d’un apporteur fait l’objet d’un attribut mt_commission de la table CTR_APP. Le montant de la commission d’un courtier fait l’objet d’un attribut mt_commission de la table CTR_COUR.
En ce qui concerne les producteurs, s’ils ont des commissions, c’est qu’ils sont en même temps apporteurs, ces commissions figurent donc dans la table CTR_APP.
![Citation](https://forum.developpez.be/images/misc/quote_icon.png)
Envoyé par
Zizoua
On peut décomposer les différentes adresses suivantes: Assuré, Professionnel, Courtier, Non_Courtier, Producteur et Souscripteur de la même manière?
Pourquoi décomposer ? Si un souscripteur est un courtier, alors ses adresses figurent dans la table adresse même chose pour un apporteur, etc.
Supposons que la table ADRESSE ait été définie ainsi (à compléter...) :
CREATE TABLE ADRESSE
(
id_personne INT NOT NULL
, id_adresse INT NOT NULL
, adresse VARCHAR(32) NOT NULL
, CONSTRAINT ADRESSE_PK PRIMARY KEY (id_personne, id_adresse)
, CONSTRAINT ADRESSE_SOUSCRIPTEUR_FK FOREIGN KEY (id_personne)
REFERENCES SOUSCRIPTEUR (id_personne)
) ;
Par exemple, si on cherche les adresses de l’assuré dont le numéro d’assuré (attribut num_assure de la table ASSURE) est égal à "123456", on exécute la requête SQL suivante :
SELECT adresse
FROM ASSURE join ADRESSE on ASSURE.id_assure = ADRESSE.id_personne
WHERE num_assure = '123456'
;
Pour les médailles, vous cliquez sur le lien suivant : médailles et ensuite sur les médailles que vous voulez.
Partager