Conception

MCD et MLD [10 min]

L'association MediaTek fait appel à vous afin d'automatiser ses tâches de marketing (analyse des ventes, analyse des profils des clients) et commerciales (facturation). L'objectif est de réaliser une base de données permettant de gérer les clients, produits, et factures.

Les règles suivantes doivent être respectées dans la conception du schéma :

  • Une facture comporte un ou plusieurs produits.

  • Un produit peut paraître dans plusieurs factures.

  • Une facture est associée à un seul client.

  • Un client peut établir plusieurs factures.

Question

Le MCD E-A vous est fourni par un collègue, faites la traduction en UML.

Schéma E-A de MediaTek

Solution

Schéma UML de de MediaTek

Question

Dériver le modèle relationnel.

Solution

1
Client (#num:integer, nom:string, prenom:string, adresse:string, date_nais:date, tel:string, sexe:char={'m','f'}) 
2
Produit (#num:integer, designation:string, prix:float, stock:integer) 
3
Facture (#num:integer, date_etabli:date, client=>Client(num)) 
4
Ligne_Fact (#facture=>Facture(num), #produit=>Produit(num), qte:integer)

Implémentation [10 min]

Vous demandez à un collègue de réaliser pour vous les instructions de création et d'initialisation des tables, sur la base des données Oracle dont vous disposez.

1
-- CREATE TABLE
2
3
create table CLIENT (
4
	num number,
5
	nom varchar(20),
6
	prenom varchar(20),
7
	adresse varchar(128),
8
	date_nais date,
9
	tel varchar(20),
10
	sexe char check (sexe in ('m','f')),
11
	constraint PK_CLIENT primary key (num)
12
);
13
14
create table FACTURE (
15
	num number,
16
	date_etabli date,
17
	client number,
18
	constraint PK_FACTURE primary key (num),
19
	constraint FK_FACTURE_CLIENT foreign key (client) references CLIENT(num)
20
);
21
22
create table PRODUIT (
23
	num number,
24
	designation varchar(128),
25
	prix number,
26
	stock number,
27
	constraint PK_PRODUIT primary key (num)
28
);
29
30
create table LIGNE_FACT (
31
	facture number,
32
	produit number,
33
	qte number,
34
	constraint FK_LIGNE_FACT_FACTURE foreign key (facture) references FACTURE(num),
35
	constraint FK_LIGNE_FACT_PRODUIT foreign key (produit) references PRODUIT(num),
36
	constraint PK_LIGNE_FACT primary key (facture, produit)
37
);
1
-- INSERT INTO CLIENT
2
3
insert into CLIENT(num, nom, prenom, adresse, date_nais, tel, sexe) values (
4
	1,
5
	'coulomb',
6
	'francois',
7
	'4, rue liberte',
8
	to_date('02121980','DDMMYYYY'),
9
	'06456780',
10
	'm'
11
);
12
13
insert into CLIENT(num, nom, prenom, adresse, date_nais, tel, sexe) values (
14
	2,
15
	'morin',
16
	'bernard',
17
	'120, square zola',
18
	to_date('19081972','DDMMYYYY'),
19
	'01345678',
20
	'm'
21
);
22
23
insert into CLIENT(num, nom, prenom, adresse, date_nais, tel, sexe) values (
24
	3,
25
	'corday',
26
	'charlotte',
27
	'66, bv napoleon III',
28
	to_date('02101977','DDMMYYYY'),
29
	'06455790',
30
	'f'
31
);
32
33
insert into CLIENT(num, nom, prenom, adresse, date_nais, tel, sexe) values (
34
	4,
35
	'pierre',
36
	'alexandre',
37
	'1, place des martyres',
38
	to_date('19081972','DDMMYYYY'),
39
	'01645870',
40
	'f'
41
);
42
43
commit;
1
-- INSERT INTO PRODUIT
2
3
insert into PRODUIT(num, designation, prix, stock) values(
4
	1,
5
	'Matrix',
6
	23.5,
7
	100
8
);
9
10
insert into PRODUIT(num, designation, prix, stock) values(
11
	2,
12
	'Seigneur des anneaux',
13
	49.30,
14
	100
15
);
16
17
insert into PRODUIT(num, designation, prix, stock) values(
18
	3,
19
	'Mistral Gagnant',
20
	25.9,
21
	100
22
);
23
24
commit;
1
-- INSERT INTO FACTURE, LIGNE_FACT
2
3
-- Facture 1
4
5
insert into FACTURE(num, client, date_etabli) values(
6
	1,
7
	2,
8
	to_date('20122000','DDMMYYYY')
9
);
10
11
insert into LIGNE_FACT(facture, produit, qte) values(
12
	1,
13
	1,
14
	1
15
);
16
17
insert into LIGNE_FACT(facture, produit, qte) values(
18
	1,
19
	2,
20
	2
21
);
22
23
-- Facture 2
24
25
insert into FACTURE(num, client, date_etabli) values(
26
	2,
27
	2,
28
	to_date('01012001','DDMMYYYY')
29
);
30
31
insert into LIGNE_FACT(facture, produit, qte) values(
32
	2,
33
	1,
34
	2
35
);
36
37
insert into LIGNE_FACT(facture, produit, qte) values(
38
	2,
39
	3,
40
	1
41
);
42
43
insert into LIGNE_FACT(facture, produit, qte) values(
44
	2,
45
	2,
46
	2
47
);
48
49
-- Facture 3
50
51
insert into FACTURE(num, client, date_etabli) values(
52
	3,
53
	2,
54
	to_date('17112004','DDMMYYYY')
55
);
56
57
insert into LIGNE_FACT(facture, produit, qte) values(
58
	3,
59
	1,
60
	2
61
);
62
63
insert into LIGNE_FACT(facture, produit, qte) values(
64
	3,
65
	2,
66
	4
67
);
68
69
insert into LIGNE_FACT(facture, produit, qte) values(
70
	3,
71
	3,
72
	1
73
);
74
75
-- Facture 4
76
77
insert into FACTURE(num, client, date_etabli) values(
78
	4,
79
	3,
80
	to_date('14012004','DDMMYYYY')
81
);
82
83
insert into LIGNE_FACT(facture, produit, qte) values(
84
	4,
85
	2,
86
	1
87
);
88
89
insert into LIGNE_FACT(facture, produit, qte) values(
90
	4,
91
	3,
92
	1
93
);
94
95
-- Facture 5
96
97
insert into FACTURE(num, client, date_etabli) values(
98
	5,
99
	4,
100
	to_date('19022004','DDMMYYYY')
101
);
102
103
insert into LIGNE_FACT(facture, produit, qte) values(
104
	5,
105
	1,
106
	2
107
);
108
109
insert into LIGNE_FACT(facture, produit, qte) values(
110
	5,
111
	3,
112
	3
113
);
114
115
insert into LIGNE_FACT(facture, produit, qte) values(
116
	5,
117
	2,
118
	4
119
);
120
121
-- Facture 6
122
123
insert into FACTURE(num, client, date_etabli) values(
124
	6,
125
	4,
126
	to_date('17032004','DDMMYYYY')
127
);
128
129
insert into LIGNE_FACT(facture, produit, qte) values(
130
	6,
131
	1,
132
	7
133
);
134
135
insert into LIGNE_FACT(facture, produit, qte) values(
136
	6,
137
	2,
138
	3
139
);
140
141
insert into LIGNE_FACT(facture, produit, qte) values(
142
	6,
143
	3,
144
	1
145
);
146
147
commit;

Question

Exécuter le code de votre collègue et vérifier que tout fonctionne.

Solution

Les scripts sont corrects.

Questions de base [10 min]

Écrivez et exécutez les requêtes SELECT suivantes permettant de vérifier le contenu de la base de données.

Question

Écrivez et exécutez la requête permettant d'afficher toutes les lignes de facture, avec pour chacune :

  • le numéro de la facture,

  • les nom et prénom du client,

  • la désignation et le prix du produit,

  • et la quantité achetée.

Indice

Il faut joindre toutes les tables de la base de données.

Solution

1
SELECT f.num, c.nom, c.prenom, p.designation, p.prix, lf.qte
2
FROM client c, produit p, facture f, ligne_fact lf
3
WHERE p.num=lf.produit
4
AND lf.facture=f.num
5
AND f.client=c.num
6
ORDER BY f.num

Question

Écrivez la requête permettant de calculer le chiffre d'affaire, c'est à dire le nombre de produits achetés multiplié par leur prix, pour chaque facture.

Solution

1
SELECT f.num, f.date_etabli, sum(p.prix*lf.qte) CA
2
FROM produit p, facture f, ligne_fact lf
3
WHERE p.num=lf.produit
4
AND lf.facture=f.num
5
GROUP BY f.num, f.date_etabli
6
ORDER BY f.num