Académique Documents
Professionnel Documents
Culture Documents
Guyot, Jacques - Des Bases de Données, de UML À SQL (Systèmes & Information, 2002)
Guyot, Jacques - Des Bases de Données, de UML À SQL (Systèmes & Information, 2002)
S)
Jointure naturelle
Les colonnes joIntes ont toujours un contenu IdentIque, on peut donc en
supprImer une (celle de la deuxIeme relatIon). 0ans ce cas, l'opratIon est
appele ]onture ncturelle , que l'on note F*S, Il faut cependant que les
constItuants joIndre portent le mme nom.
joInture naturelle : T=F * S
A 8 C 0
a b 1 d
a b 1 b
c b J e
Dn appelle chcrnre de R et S , l'IntersectIon de F
+
et S
+
note FS
+
SoIt les constItuants (IndIcs) S appartenant la charnIere :
SFS
+
=[C
S1
, C
S2
, ..., C
Sn
] et ceux de F FFS
+
=[C
F1
, C
F2
, ..., C
Fn
]
La joInture naturelle est quIvalente l'expressIon algbrIque:
F*S = (*(
C
F1
= C
S1
)(
C
F2
= C
S2
) ... (
C
Fn
= C
Sn
) (F
S))[(F
+
S
+
)SFS
+
]
Semi-jointure
0ans la joInture, les constItuants de F et de S sont prsents dans le rsultat,
dans la semIjoInture seuls ceux de F sont conservs, elle est note :
F
C
F
C
S
S
semIjoInture : T = F
C
F
= C
S
S
A 8 C
0e U|L SQL 141
a b 1
a b 1
c b J
La semIjoInture est quIvalente l'expressIon algbrIque:
F
C
F
C
S
S = (*
C
F
C
S
)(F
S)[F
+
]
Jointure externe
0ans la joInture, un certaIn nombre d'entIts ne sont pas prIses en
consIdratIon. La joInture externe permet de rajouter au rsultat les entIts
d'une des deux relatIons (cecI permet de travaIller avec des donnes
Incompletes ayant des valeurs nulles). Dn dIstInguera la ]onture externe
ycuche, note F= S quI ajoute les entIts de F compltes par des
valeurs nulles pour les constItuants de S; la ]onture externe drote, note F
= S quI ajoute les entIts de S compltes par des valeurs nulles pour
les constItuants de F et ]onture externe complte, note F= = S quI
ajoute les entIts de F et de S compltes par des valeurs nulles pour les
constItuants respectIfs nondfInIs.
semIjoInture gauche : T= F= S
A 8 C
F
C
S
0
a b 1 1 d
a b 1 1 b
c b J J e
d a 6
La joInture externe gauche est quIvalente l'expressIon algbrIque
9
:
F= S = ((*
C
F
= C
S
)(F
S)) F
S
Lxpression algebrique
Nous avons vu Isolment chaque opratIon, voyons maIntenant comment
nous pouvons former des expressIons. Nous donnons premIerement le
vocabulaIre de nos expressIons et ensuIte la dfInItIon d'expressIons
algbrIques bIen formes.
7ocabulaIre: troIs catgorIes de symboles apparaIssent dans les expressIons
algbrIques
I) les noms des relatIons appartenant la modlIsatIon
[F
1
, F
2
, ...,F
m
]= |d.
9
Pour dfInIr formellement cette opratIon, Il faut tendre la dfInItIon de l'unIon au
traItement des valeurs nulles. F
S
dnote la relatIon F tendue aux constItuants de S avec
des valeurs nulles.
142 Modeliser et realiser une BD
II) les noms des constItuants contenus dans F
I
+
, I=1..m
III) les formule F telle que:
1) les constantes et les noms de constItuants sont des atomes
2) la forme ( atome
a
atome) est une formule
ou
a
[,,=,=,...]
J) la forme ( formule
l
formule) est une formule
ou
l
[, ]
4) la forme ( formule) est une formule
5) rIen d'autre n'est une formule
F
+
dsIgne l'ensemble des constItuants utIlIss dans une formule F
Dn dIt qu'une expressIon (algbrIque) est bIen forme (ebf) sI elle est
obtenue par les regles suIvantes:
I) un nom de relatIon est une ebf.
II) sI E
1
et E
2
sont des ebf alors
1) (E
1
E
2
), (E
1
E
2
) et (E
1
E
2
) sont des ebf sI E
1
+
=E
2
+
2) (E
1
E
2
) est une ebf sI E
1
+
E
2
+
=
J) (E
1
(*F) E
2
) est une ebf sI F
+
E
1
+
E
2
+
et E
1
+
E
2
+
=
4) (E
1
[X]) est une ebf sI X E
1
+
5) ((*F)E
1
) est une ebf sI F
+
E
1
+
III) rIen d'autre n'est une ebf
Femarques:
Dn peut supprImer le test de l'IntersectIon vIde entre deux relatIons sI l'on
IndIce le nom de tous les constItuants d'une relatIon.
Dn peut supprImer des parentheses sI la smantIque de l'ebf est sans
ambIgut
Langage algebrique, un langage d'interrogation
Nous avons suggr que les expressIons algbrIques sont la reprsentatIon de
questIons que l'on peut formuler sur un champ d'applIcatIon. ExamInons le
processus d'InterrogatIon. 0ans l'Idal nous dIrIgerIons dIrectement vers le
champ d'applIcatIon notre InterrogatIon en vue d'obtenIr une rponse, maIs
la ralIt est relatIvement muette. Nous avons modlIs le champ
d'applIcatIon, en vue d'y effectuer des calculs symbolIques, Il faut donc
transformer notre InterrogatIon portant sur le champ d'applIcatIon en une
InterrogatIon portant sur la modlIsatIon. Cette InterrogatIon correspond
une expressIon algbrIque. l suffIt alors de concrtIser cette expressIon en
la calculant avec les valeurs des Instances de la base de donnes. le rsultat
est une Instance quI doIt tre Interprte comme la rponse de la questIon
InItIale sur le champ d'applIcatIon.
La qualIt de cette rponse dpend des troIs tapes suIvantes:
la modlIsatIon est fIdele dans le contexte de la questIon
0e U|L SQL 14J
les Instances des relatIons sont des InterprtatIons correctes du champ
d'applIcatIon
la formulatIon de l'InterrogatIon est smantIquement correcte. En
effet une expressIon algbrIque bIen forme correspond une
InterrogatIon, maIs pas forcment l'InterrogatIon InItIale.
Exemple d'InterrogatIon
Pour facIlIter la formulatIon des InterrogatIons, nous pouvons reprsenter
notre modlIsatIon graphIquement. 0eux types de nuds sont reprsents:
les constItuants et les relatIons. Les artes non orIentes lIent les
constItuants la relatIon dont Ils font partIe. Pour le champ d'applIcatIon
Hotel, nous obtenons le graphe de la FIgure 92.
FIgure 91 : InterrogatIon avec une expressIon algbrIque
Le processus de modlIsatIon de l'InterrogatIon suIt le schma suIvant:
spcIfIer les constItuants de la slectIon
spcIfIer les constItuants du rsultat (projectIon)
les tapes a) et b) dfInIssent les relatIons ImplIques dans l'expressIon
algbrIque.
dfInIr les joIntures entre les relatIons
1) Les chambres avec baIn et T7 :
iR1
...
iRn
Md
objets
du
C.A.
interrogation
rponse du CA
Formulation
expr. algbrique
rsultat
calcul avec
les instances
interprtation
144 Modeliser et realiser une BD
FIgure 92 :modlIsatIon graphIque d'HDTEL
Les InformatIons baIn et T7 appartIennent respectIvement aux domaInes des
constItuants Confort et EquIpement, le rsultat est dfInIt par les
constItuants de la relatIon Chambres. Seule la relatIon chambre est
ImplIque dans cette InterrogatIon, donc nous ne spcIfIons pas de joInture.
Nous obtenons donc l'expressIon suIvante:
(* ((Confort=baIn)(EquIpement=T7))) Chambres
2) Les numros des chambres et leur capacIt :
Seules les InformatIons sur les constItuants Numchambre et NbrPers, nous
Intressent. Nous obtenons donc l'expressIon suIvante:
(Chambres [NumChambre, NbrPers])
J) Les noms des clIents ayant rservs une chambre pour le 251289 :
La slectIon porte sur les constItuants 0ateArr et 0ate0ep de la relatIon
FservatIon. Le constItuant du rsultat Nom appartIent la relatIon ClIents.
l faut donc dfInIr le lIen entre les relatIons ClIent et FservatIon, nous
utIlIsons IcI la joInture naturelle portant sur le constItuant NumClIent
commun aux deux relatIons.
(*((0ateArr = 251289)(0ate0ep 251289))(ClIents*FservatIon))[Nom]
NOM
PRENOM
ADRESSE
NUMCLIENT
NUMCHAMBRE
PRIX
NBLIT
NBPERS
CONFORT
EQUIPEMENT
DATEDEP
DATEARR
CLIENTS
CHAMBRES
RESERVATION
0e U|L SQL 145
FIgure 9J :modlIsatIon graphIque de la questIon: Les noms des clIents
ayant rservs une chambre pour le 251289 :
4) Le nom des clIents et le confort des chambres qu'Ils ont rservs:
FIgure 94 :modlIsatIon graphIque de la questIon: Le nom des clIents et le
confort des chambres qu'Ils ont rservs:
Le constItuant du rsultat Nom appartIent la relatIon ClIents et le
constItuant Confort appartIent Chambres. l faut donc dfInIr le lIen entre
les relatIons ClIents et Chambres, pour cela Il faut aussI ImplIquer la relatIon
FservatIon. Nous utIlIsons IcI la joInture naturelle portant sur le constItuant
NumClIent commun aux relatIons ClIents et FservatIon, ensuIte,.nous
utIlIsons IcI la joInture naturelle portant sur le constItuant NumChambre
commun l'expressIon prcdemment calcule et la relatIon Chambres.
((ClIents * FservatIon) * Chambres)[Nom, Confort]
5) La capacIt thorIque d'accueIl de l'hotel :
Pour rpondre cette questIon, Il est ncessaIre d'effectuer la somme
de toutes les valeurs de NbrPers dfInIe pour chaque chambre. Notre
langage algbrIque, ne peut pas exprImer une telle expressIon.
L'expressIon de cette InterrogatIon est donc remIse au chapItre suIvant.
|NOM|
DATEDEP 25-12-89
DATEARR ~25-12-89
CLIENTS
RESERVATION
*
NUMCLIENT
|NOM|
|CONFORT|
CLIENTS
CHAMBRES
RESERVATION
*
NUMCLIENT
*
NUMCHAMBRE
146 Modeliser et realiser une BD
Lxercices
Questions sur 11
3
1) EtablIr le graphe de relatIons de la modlIsatIon de TT
J
2) ExprImer les InterrogatIons suIvantes avec une expressIon algbrIque, en
suIvant le schma dfInIt plushaut.
La zone ou est sItu le vhIcule ayant le no de chassIs J24.
Le plannIng du chauffeur nomm 0upont.
La lIste des entretIens effectus sur le vhIcule ayant le no de chassIs
J24.
La lIste des vhIcules dont le pleIn a t effectu avec un type de
carburant quI n'taIt pas celuI spcIfI par le modele du vhIcule.
La lIste des chauffeurs pouvant conduIre le vhIcule ayant le no de
chassIs J24.
La lIste des chauffeurs pouvant conduIre le vhIcule ayant le no de
chassIs J24 et quI appartIennent la mme statIon que ce vhIcule.
Reponses sur 11
3
graphe de relatIons de la modlIsatIon de TT
J
Nous avons regroup NoZone, Zone0e, ZoneA car Il s'agIt de synonymes
exprImant la mme notIon. Par contre, nous avons consIdr que NoJour quI
apparaIssaIt dans plusIeurs relatIons recouvraIt des notIons dIffrentes;
NoJour_du_pleIn, NoJour_de_l_entretIen, etc et que des joIntures naturelles
sur un tel constItuant ne donnaIent que des InformatIons faIblement
assocIes. En faIt, EntretIen * Carburant permutent tous les entretIens et
tous les pleIns effectus le mme jour.
ExpressIon algbrIque
a) La zone ou est sItu le vhIcule ayant le no de chassIs J24.
a1) (((*NochassIs=J24)7hIcule) * SItuatIon)[NoZone]
l est Intressant de voIr que par les proprIts de l'algebre relatIonnelle, la
slectIon peut tre place avant la joInture ou apres (a2) sans modIfIer le
rsultat
a2) ((*NochassIs=J24)(7hIcule * SItuatIon))[NoZone]
Une autre joInture (aJ) permet aussI d'assocIer les NoZone et les NoChassIs,
maIs le NoZone a un sens completement dIffrent, Il s'agIt de la zone du
vhIcule quand Il est gar sa statIon.
aJ) ((*NochassIs=J24)(7hIcule * StatIon))[NoZone]
b) Le plannIng du chauffeur nomm 0upont.
b1) ((*Nom='0upont')(Chauffeur * PlannIng))[PlannIng
+
]
0e U|L SQL 147
S'Il exIste plusIeurs 0upont dans la compagnIe, nous allons trouver les
plannIng des 0upont.
FIgure 95 :modlIsatIon TTJ
c) La lIste des vhIcules dont le pleIn a t effectu avec un type de
carburant quI n'taIt pas celuI spcIfI par le modele du vhIcule.
c1) ((*typecarburant
Carburant
=typecarburant
7hIcule
)
((Carburant * 7hIcule) * Type))[Carburant
+
]
d) La lIste des chauffeurs pouvant conduIre le vhIcule ayant le no de chassIs
J24
d1) ((*NochassIs=J24)
(((7hIcule*Type)* permIs)* Chauffeur))[Chauffeur
+
]
e) La lIste des chauffeurs pouvant conduIre le vhIcule ayant le no de chassIs
J24 et quI appartIennent la mme statIon que ce vhIcule
Pour rpondre cette questIon, Il faut spcIfIer une condItIon
supplmentaIre sur d1)
d1) ((*NochassIs=J24)(NoStatIon
7hIcule
=NoStatIon
Chauffeur
)
(((7hIcule*Type)* permIs)* Chauffeur))[Chauffeur
+
]
Vhicule
Type
Chauffeur
Station
Carburant Entretien
Permis
Planning
Situation
Distance
noChassis
modle
typeCarburant
noZone
zoneDe
zoneA
catgorie
noPlaque
miseEnService
nbPlaces
automatique
poids
nom
prnom
adresse
noJour
kilometrage
litre
noJour
description
noJour
trancheHoraire
heure
tempsParcours
noChauffeur
noStation
148 Modeliser et realiser une BD
F SELECT * FFD| F
F[X] SELECT C
1
,
C
2
, ..., C
n
FFD|
F
(*F)F SELECT * FFD| F WHEFE F
F S SELECT F.*,S.* FFD| F,S
F
C
F
C
S
S SELECT F.*,S.* FFD| F,S WHEFE
F.C
1
S.C
1
F S = SELECT * FFD| F unIon
SELECT * FFD| S
SELECT C1, C2, ..., Cm
FROM R1, R2, ... , Rn
WHERE F
J0. Interrogation en SQL
"Le jour l'aurore
les arbres tremblent
comme un dlire
le langage le monde
ne nous appartiennent pas"
Patrick Laupin - Le jour l'aurore
Nous allons tablIr la correspondance entre le langage algbrIque et les
dclaratIons de slectIon en SQL. CecI nous donnera un premIer modele
d'une machIne SQL quI calculeraIt le rsultat de la slectIon partIr des
tables. EnsuIte, nous examInerons la syntaxe complete de la slectIon en SQL
et au fur et mesure, nous tendrons le modele de la machIne SQL aux
dIffrentes clauses. La machIne SQL est un modele quI nous permet de
dtermIner de faon sure le rsultat d'une requte d'InterrogatIon.
Du langage algebrique SQL
La clause de la requte SQL est forme prIncIpalement de troIs mots cls
SELECT ... FPDh ... WHEPE ... Le premIer dtermIne les constItuants de la
table rsultat. Le second dtermIne les tables ImplIques dans la requte.
Le dernIer Impose une condItIon sur les entIts. Nous pouvons donc tablIr
les correspondances suIvantes entre les expressIons algbrIques et les
requtes SQL.
La relatIon F
La projectIon F[X] ou X=[C
1
,
C
2
, ..., C
n
]
La slectIon (*F)F
Le produIt F S
La joInture de F et S
L'unIon (IntersectIon, dIffrence) F S
0'une manIere gnrale, la requte SQL suIvante:
0e U|L SQL 149
(*F) F1 F2 ... Fn [C1,
C2, ..., Cm]
SELECT * FROM CHAMBRES
NUM_CHAMBRE PRIX NBR_LITS NBR_PERS CONFOR EQU
----------- ---------- ---------- ---------- ------ ---
10 80 1 2 WC NON
20 80 1 2 WC NON
30 80 1 2 WC NON
40 80 1 2 WC NON
11 90 2 2 WC NON
21 90 2 2 WC NON
31 90 2 2 WC NON
41 90 2 2 WC NON
12 100 2 2 DOUCHE NON
22 100 2 2 DOUCHE NON
32 100 2 2 DOUCHE NON
42 100 2 2 DOUCHE NON
13 120 1 2 BAIN NON
23 120 1 2 BAIN NON
33 120 1 2 BAIN NON
43 120 1 2 BAIN NON
14 140 2 2 BAIN TV
24 140 2 2 BAIN TV
est quIvalente l'expressIon algbrIque suIvante:
Ce rsultat nous donne le modele de la machIne SQL (FIgure 101):
faIre le produIt cartsIen de toutes les relatIons cItes apres le FRDM
slectIonner les entIts satIsfaIsant la condItIon dcrIte apres WHERE
projeter sur les constItuants cIts apres le SELECT
FIgure 101 :|odele , modele sImplIfI de la machIne SQL
Pour nos exemples, nous utIlIserons l'exemple Hotel avec les Instance
suIvantes des relatIons, que nous obtenons avec les requtes suIvantes:
R1 R2 ... Rn
From .... Produit catsien
Where .... prdicat
select .... projection
n-uplet
entit
relation
150 Modeliser et realiser une BD
34 140 2 2 BAIN TV
44 140 2 2 BAIN TV
15 180 3 4 BAIN TV
25 180 3 4 BAIN TV
35 180 3 4 BAIN TV
45 180 3 4 BAIN TV
SELECT * FROM CLIENTS
NUM_CLIENT NOM PRENOM ADRESSE
---------- ---------- ---------- --------------------------------
1000 GASCON GASTON 12 av. du Gnral 1239 ICI
1001 DUPONT PIERRE 12 ch. des hirondelles 1238 LABAS
1002 DUFOUR JEAN 10 av. de la gar 1300 AILLEURS
1003 ZORO DIEGO 10 ch des voleurs Los Angeles
1004 EINSTEIN ALBERT 10 rt la relativit 1004 PLUS-LOIN
1005 DUMAS ALEXANDRE 10 route du moulins LE-SUD
1007 NOBODY FRANCOISE 403 route de l inconnu 75000 Paris
1006 ROMULUS BERNADETTE 241 route de rome 1409 Lion
1009 AGDA BRUNO 10 route de l impossible 1508 TEXAS
1008 CHADOK AMELIE 25 rue de la rame 1456 Tombouctou
SELECT * FROM RESERVATIONS
(* ((Confort=baIn)(EquIpement=T7)) Chambres
devIent en SQL
SELECT *
FROM CHAMBRES
WHERE confort='BAIN' AND equipement='TV'
NUM_CHAMBRE PRIX NBR_LITS NBR_PERS CONFOR EQU
----------- ---------- ---------- ---------- ------ ---
14 140 2 2 BAIN TV
24 140 2 2 BAIN TV
34 140 2 2 BAIN TV
44 140 2 2 BAIN TV
15 180 3 4 BAIN TV
25 180 3 4 BAIN TV
35 180 3 4 BAIN TV
45 180 3 4 BAIN TV
(Chambres [NumChambre,
NUM_CLIENT NUM_CHAMBRE DATE_ARR DATE_DEP
---------- ----------- --------- ---------
1000 11 11-JAN-90 15-JAN-90
1001 21 10-JAN-90
1002 34 20-DEC-89 27-DEC-89
1003 44 24-DEC-89 27-DEC-89
1005 45 23-DEC-89 28-DEC-89
1006 14 01-DEC-89 28-DEC-89
1007 23 01-DEC-89 02-DEC-89
1007 23 08-DEC-89 09-DEC-89
1007 23 15-DEC-89 16-DEC-89
1007 23 22-DEC-89 23-DEC-89
1007 23 29-DEC-89 30-DEC-89
Feprenons les exemples du chapItre prcdent:
1) Les chambres avec baIn et T7 :
2) Les numros des chambres et leur capacIt :
0e U|L SQL 151
NbrPers])
devIent en SQL
SELECT Num_chambre, nbr_pers
FROM CHAMBRES
NUM_CHAMBRE NBR_PERS
----------- ----------
10 2
20 2
30 2
40 2
11 2
21 2
31 2
41 2
12 2
22 2
32 2
42 2
13 2
23 2
33 2
43 2
14 2
24 2
34 2
44 2
15 4
25 4
35 4
45 4
(*((0ateArr = 251289)(0ate0ep 251289))(ClIents*FservatIon))[Nom]
devIent en SQL
SELECT Nom
FROM CLIENTS,RESERVATIONS
WHERE Date_Arr<=to_date('25-dec-89')
AND Date_Dep> to_date('25-dec-89')
AND Clients.num_client=Reservations.num_client
NOM
--------------------
DUFOUR
ZORO
DUMAS
ROMULUS
Dn remarque que la joInture naturelle de l'expressIon est explIcIte dans la
requte SQL.
((ClIents * FservatIon) * Chambres)[Nom, Confort]
devIent en SQL
J) Les noms des clIents ayant rservs une chambre pour le 251289 :
4) Le nom des clIents et le confort des chambres qu'Ils ont rserves:
152 Modeliser et realiser une BD
SELECT Nom, Confort
FROM CHAMBRES, CLIENTS, RESERVATIONS
WHERE Clients.num_client=Reservations.num_client
AND Chambres.num_chambre=Reservations.num_chambre
NOM CONFOR
-------------------- ------
GASCON WC
ROMULUS BAIN
DUPONT WC
NOBODY BAIN
NOBODY BAIN
NOBODY BAIN
NOBODY BAIN
NOBODY BAIN
DUFOUR BAIN
ZORO BAIN
DUMAS BAIN
SELECT sum(nbr_pers)
FROM CHAMBRES
SUM(NBR_PERS)
-------------
56
Syntaxe des requtes SQL
Nous avons examIn la traductIon des expressIons algbrIques en SQL. Nous
allons examIner maIntenant systmatIquement toutes les regles de
l'expressIon de slectIon SQL.
Cette premIere regle est un peu comme une table des matIeres du SELECT
en SQL, nous y trouvons les partIes suIvantes:
dIspIayed coIumn : permet de spcIfIer la nature du rsultat (la
projectIon et les expressIons calcules)
seIected-tabIe : permet de spcIfIer les relatIons ImplIques dans la
requte (le produIt cartsIen)
CondItIon : permet de spcIfIer la condItIon de slectIon
Connect-CIause : permet de spcIfIer un parcours et une condItIon
arborescents
Croup-CIause : permet de spcIfIer les regroupements, pour le calculs
des fonctIons agrgatIves
Set-CIause: permet de spcIfIer les opratIons ensemblIstes
Drder-CIause : permet de spcIfIer les crIteres de trI sur le rsultat
Update-CIause: permet de spcIfIer les crIteres de verrouIllage pour la
concurrence
SELECTcommand
5) La capacIt thorIque d'accueIl de l'hotel :
Cette questIon, nonformulable avec les expressIons algbrIques trouve la
spcIfIcatIon suIvante:
0e U|L SQL 15J
Une des dIffrences entre la relatIon et la table (l'ImplantatIon InformatIque
de la relatIon) est que dans une relatIon une entIt ne peut tre prsente
qu'une foIs (par dfInItIon) alors que dans la table une range peut
apparatre plusIeurs foIs. Dn parle alors de doublons. Pour lImIner ces
doublons du rsultat d'une requte, on doIt le spcIfIer avec le mot rserv
dIstInct. Cette lImInatIon demande une comparaIson deux deux des
ranges du rsultat, on peut acclrer cette comparaIson en trIant les
ranges. Le cout de l'lImInatIon des doublons correspond donc celuI du trI
de la table du rsultat. 0ans l'exemple quI suIt, on veut tous les types de
chambres, c'est dIre les dIffrentes assocIatIons quI exIstent entre le
confort et les quIpements, en utIlIsant dIstInct, on lImIne les doublons.
SELECT confort, equipement
FROM CHAMBRES
CONFOR EQU
------ ---
WC NON
WC NON
WC NON
WC NON
WC NON
WC NON
WC NON
WC NON
DOUCHE NON
DOUCHE NON
DOUCHE NON
DOUCHE NON
BAIN NON
BAIN NON
BAIN NON
BAIN NON
BAIN TV
BAIN TV
BAIN TV
BAIN TV
BAIN TV
BAIN TV
BAIN TV
BAIN TV
154 Modeliser et realiser une BD
SELECT distinct confort, equipement
FROM CHAMBRES
CONFOR EQU
------ ---
BAIN NON
BAIN TV
DOUCHE NON
WC NON
Le mot rserv aII spcIfIe que l'on dsIre toutes les ranges du rsultat, par
dfaut on obtIent toutes les entIts
En spcIfIant *, on obtIent toutes les colonnes de toutes les tables de la
clause FFD|
La projection
0ans cette clause, nous spcIfIons la nature des colonnes du rsultat. Ce
rsultat peut tre la totalIt des colonnes d'une table, un constItuant
partIculIer, le rsultat d'une expressIon arIthmtIque ou le rsultat d'une
fonctIon d'agrgatIon (regroupement)
dIsplayed column
Nous pouvons obtenIr toutes les colonnes d'une table en spcIfIant tabIe-
name.*. Lors de la cratIon d'une table, le SC80 mmorIse avec la table,
l'IdentIfIcatIon du proprItaIre de la table. Nous verrons ultrIeurement
comment ces InformatIons sont utIlIses dans les mcanIsmes de scurIt. En
prfIxant une table de l'IdentIfIcateur du proprItaIre, on IndIque au SC80
que l'on dsIre la table cre par ce proprItaIre. l est aInsI possIble que
plusIeurs utIlIsateurs possedent des tables ayant des noms IdentIques. 0ans
notre exemple, le proprItaIre est assocI au nom du projet HDTEL. Les
troIs requtes suIvantes sont donc quIvalentes
SELECT * FROM CHAMBRES
SELECT CHAMBRES.* FROM CHAMBRES
SELECT HOTEL.CHAMBRES.* FROM CHAMBRES
SELECT num_chambre "Numro de Chambre", prix/nbr_pers "prix
par pers"
FROM Chambres
WHERE equipement='TV'
Numro de Chambre prix par pers
L'alias permet de donner un tItre une colonne, dans le cas des
expressIons ou sImplement de renommer une colonne.
Exemple:
Le prIx par personne des chambres ayant une T7 :
0e U|L SQL 155
----------------- -------------
14 70
24 70
34 70
44 70
15 45
25 45
35 45
45 45
Lxpression
ExpressIon
Une expressIon est un terme ou une suIte de termes connects par les
oprateurs arIthmtIques + ou .
Un terme est un facteur ou une suIte de facteurs connects par les
oprateurs arIthmtIques * ou /.
Terme
Un facteur appartIent aux catgorIes suIvantes:
la constante non sIgne quI est un nombre (12.43, 324, 1.56E-23)
ou une chane de caracteres ('bain'). Les chanes de caracteres
peuvent tre concatnes avec l'oprateur || ('bain'||' et
WC')
la varIable quI est un nom de colonne. Eventuellement prfIxe par le
nom de la table, dans le cas ou ce nom appartIent plusIeurs tables
manIpules dans une mme requte (numchambre,
Chambres.numchambre).
une fonctIon avec ses parametres d'appel: power(taux_annuel,
nombre_annees). Les fonctIons dIsponIbles dpendent du SC80
utIlIs. Nous donnons en annexe un apperu de l'tendue de cellescI.
une fonctIon de regroupement avec ses parametres d'appel:
count(*), avg(prix/nbpers). Nous donnons une explIcatIon
dtaIlle dans la clause de regroupement.
une expressIon entre parentheses afIn d' oter les ambIguts:
(a+b)*(c+d)
Factor
156 Modeliser et realiser une BD
La syntaxe permet de construIre des expressIons sans lImItatIon de
complexIt: (-a*sum(power(a,b)+c)*d)). Plus loIn, dans la syntaxe, nous
utIlIsons nouveau la notIon d'expressIon. Nous faIsons rfrence alors
expressIon telle que nous venons de la dfInIr.
Les relations du produit cartesien
Les relatIons nommes dans la clause FROM sont celles quI seront ImplIques
dans le calcul de la requte. Les noms des colonnes apparaIssant dans les
expressIons doIvent appartenIr ces tables.
selectedtable
La table est sImplement nomme, elle est ventuellement prfIxe par le
nom de son proprItaIre. L'alIas permet de renommer une table afIn de luI
donner un nom plus court ou bIen un autre nom dans le cas ou une table est
utIlIse plusIeurs foIs dans une mme requte. CecI permet l'autojoInture,
par exemple les chambres ayant le mme confort et le mme quIpement
qu'une autre chambre maIs ayant un prIx InfrIeur de 10 cellecI
SELECT distinct c1.num_chambre
FROM CHAMBRES c1, CHAMBRES c2
WHERE c1.confort=c2.confort
AND c1.equipement=c2.equipement
AND c1.prix*1.1<c2.prix
NUM_CHAMBRE
-----------
10
14
20
24
30
34
40
44
0e U|L SQL 157
SELECT num_chambre, prix, confort
FROM CHAMBRES
WHERE (prix<=80)
OR ((confort='BAIN') AND (prix<=120))
NUM_CHAMBRE PRIX CONFOR
----------- ---------- ------
10 80 WC
20 80 WC
30 80 WC
40 80 WC
13 120 BAIN
23 120 BAIN
33 120 BAIN
43 120 BAIN
Un facteur logIque appartIent aux catgorIes suIvantes:
une comparaIson entre deux expressIons (=,>,<, ...)
un test d'appartenance un ensemble (in)
un test d'appartenance une chane de caracteres (like)
un test d'appartenance un Intervalle (between).
une comparaIson avec la valeur null
un prdIcat quantIfI (exists, all, any)
une condItIon entre parentheses afIn d'oter les ambIguts.
logIcalfactor
0ans ce cas, le SC80 agIt comme s'Il exIstaIt deux Instances IdentIques de
CHA|8FE.
Condition
La clause WHERE est assocIe une condItIon quI exprIme un prdIcat sur les
ranges du produIt cartsIen. Chaque lment de cette condItIon est valu
vraI ou faux. Un terme peut tre nI par par le mot cl not. Les termes
peuvent tre connects par le ou logIque InclusIf l'aIde du mot cl OR.
CondItIon
Un terme logIque est un facteur ou des facteurs connects par le et logIque
l'aIde du mot cl AND. Les oprateurs logIques sont IdentIques ceux
dcrIts dans le chapItre des rappels sur la logIque.
exemple:
Les chambres coutants au max. 80 francs ou ayant un baIn et valant au max.
120
158 Modeliser et realiser une BD
Comparaison entre deux expressions
Les oprateurs de comparaIson sont:
exp1 = exp2 ; l'galIt du rsultat exp1 et exp2
exp1 < exp2 ;exp1 est strIctement InfrIeur exp2
exp1 <= exp2 ;exp1 est InfrIeur ou gal exp2
exp1 > exp2 ;exp1 est strIctement suprIeur exp2
exp1 >= exp2 ;exp1 est suprIeur ou gal exp2
exp1 <> exp2 ;exp1 est dIffrent de exp2 (aussI not != ou ^=)
Les expressIons sont du type de celles vues prcdemment, l'exclusIon des
fonctIons d'agrgatIon (quI font l'objet d'une clause spcIale having). Le
rsultat d'une expressIon est un nombre, une chane de caracteres ou une
date. La relatIon d'ordre utIlIse est dfInIe en fonctIon du rsultat. 0ans le
cas ou les rsultats appartIennent des types dIffrents, Il faut utIlIser les
fonctIons de conversIon de type.
SI une des deux expressIons est value la valeur null, alors le rsultat de
la comparaIson est toujours faux. (null=null est aussI valu faux). Pour
l'galIt, nous avons le tableau suIvant:
exp1/exp2 =null null
=null vrai ou Iaux Iaux
null Iaux Iaux
Appartenance un ensemble
l exIste deux possIbIlIts pour dfInIr l'ensemble avec lequel on doIt tester
l'appartenance d'un lment. L'une consIste nummer explIcItement les
lments de l'ensemble; on constItue aInsI une lIste de ces lments. L'autre
consIste dfInIr les lments par une sousrequte. SI l'ensemble est
{c
1
,c
2
,c
3
, ... c
n
} alors les condItIons suIvantes sont quIvalentes:
Exp1 in (c
1
,c
2
,c
3
, ... c
n
)
(Exp1 = c
1
) AND (Exp1 = c
2
) AND ...(Exp1 = c
n
)
0e U|L SQL 159
SELECT num_chambre FROM CHAMBRES
WHERE confort in ('BAIN','DOUCHE')
NUM_CHAMBRE
-----------
12
22
32
42
13
23
33
43
14
24
34
44
15
25
35
45
SELECT sum(prix)
FROM CHAMBRES Ch
WHERE num_chambre in
SELECT num_chambre
FROM Reservations R
WHERE date_arr<='25-dec-89'
AND date_dep>'25-dec-89'
SUM(PRIX)
----------
600
Appartenance une chane de caractres
Dn test IcI sI une chane de caracteres ressemble un pctron. CecI est
partIculIerement utIle sI l'on doIt effectuer des recherches sur un constItuant
dont le domaIne de modlIsatIon est du type texte. En effet, Il permet
d'effectuer une slectIon l'IntrIeur mme des chanes. 0eux patrons sont
dIsponIbles. Le quI est substItuable n'Importe quelle chane de caracteres
y comprIs la chane vIde. Le _ (soulIgn) quI est substItuable un seul
caractere.
expset
Exemples:
Chambres avec un moyen de se laver
Fecette du 25dcembre1989
160 Modeliser et realiser une BD
matchstrIng
Exemples:
Nom du clIent commenant par 0U
SELECT nom
FROM CLIENTS
WHERE Nom like 'DU%'
NOM
--------------------
DUPONT
DUFOUR
DUMAS
SELECT nom
FROM CLIENTS
WHERE Nom like '___O%'
NOM
--------------------
DUPONT
DUFOUR
ZORO
NOBODY
exp1 between exp2 AND exp3
(exp2 <= exp1) AND (exp1 <= exp3)
SELECT count(num_chambre)
FROM CHAMBRES
WHERE prix between 85 AND 120
COUNT(NUM_CHAMBRE)
------------------
12
Nom du clIent ayant un 0 pour quatrIeme lettre
Appartenance un intervalle
La clause between est une facIlIt d'crIture. Les deux condItIons suIvantes
sont quIvalentes:
Exemple:
nombre de chambres dont le prIx est entre 85 et 120 francs
0e U|L SQL 161
Comparaison avec la valeur null
La clause Is null permet de tester sI une expressIon est IndfInIe. Dn avaIt vu
prcdemment que l'oprateur d'galIt ramenaIt toujours la valeur fausse.
Le rsultat de l'valuatIon est donn dans le tableau suIvant:
exp1 exp1 is null
=null Iaux
null vrai
Les deux condItIons suIvantes sont quIvalentes:
not (exp1 is null)
exp1 is not null
SELECT Nom
FROM ClIENTS, RESERVATIONS
WHERE ClIENTS.num_client=RESERVATIONS.num_client
AND date_dep is null
NOM
--------------------
DUPONT
Predicat quantifie
La clause exists permet de tester s'Il exIste au moIns une range
correspondant au prdIcat de la sousrequte. Comme Il s'agIt de tester
unIquement l'exIstence de certaInes ranges, les valeurs des colonnes de ces
dernIeres sont sans Importance, on peut donc spcIfIer une constante comme
rsultat, soIt:
Exists (SELECT 'Vrai' FROM .... WHERE ...)
Exp1 all (SELECT col1 FROM ... WHERE ...)
(Exp1 c1) AND (Exp1 c2) AND ...(Exp1 cn)
Exp1 any (SELECT col1 FROM ... WHERE ...)
(Exp1 c1) OR (Exp1 c2) OR ...(Exp1 cn)
Exemple:
ClIents n'ayant pas fIx leur date de dpart
La clause all permet de tester sI toutes les ranges, correspondant au
prdIcat de la sousrequte, vrIfIent une certaIne condItIon. Par exemple,
sI la sousrequte (SELECT col1 FROM ... WHERE ...) donne pour
rsultat {c
1
,c
2
,c
3
, ... c
n
} alors les condItIons suIvantes sont
quIvalentes (ou est un oprateur de comparaIson, =,,, ...):
La clause any permet de tester sI au moIns une range, correspondant au
prdIcat de la sousrequte, vrIfIe une certaIne condItIon. Par exemple, sI
la sousrequte (SELECT col1 FROM ... WHERE ...) donne pour
rsultat {c
1
,c
2
,c
3
, ... c
n
} alors les condItIons suIvantes sont
quIvalentes (ou est un oprateur de comparaIson, =,,, ...):
162 Modeliser et realiser une BD
Exp1 in (SELECT col1 FROM ... WHERE ...)
Exp1 = any (SELECT col1 FROM ... WHERE ...)
Exp1 all (SELECT col1 FROM ...
WHERE ...)
not Exists (SELECT 'Vrai' FROM ....
WHERE ... AND not(exp1 col1))
exemple: affIcher tous les numros de chambre et le numro du clIent ayant
rserv la chambre pour le 25dcembre1989.
SELECT Ch.num_chambre, num_client
FROM Chambres Ch,Reservations R
WHERE Ch.num_chambre=R.num_chambre
AND date_arr<='25-dec-89'
AND date_dep>'25-dec-89'
NUM_CHAMBRE NUM_CLIENT
----------- ----------
14 1006
34 1002
44 1003
45 1005
SELECT Ch.num_chambre, num_client
FROM Chambres Ch,Reservations R
WHERE Ch.num_chambre=R.num_chambre(+)
AND date_arr(+)<='25-dec-89'
AND date_dep(+)>'25-dec-89'
NUM_CHAMBRE NUM_CLIENT
La clause In et any sont quIvalentes pour l'oprateur de comparaIson =.
Nous avons l'quIvalence suIvante:
Fappelons qu'Il est possIble de passer du quantIfIcateur unIversel
l'exIstentIel par une double ngatIon:
x, (P(x)) x, (P(x))
Cette quIvalence est aussI applIcable aux condItIons de SQL. SoIt:
quantIfIedfactor
Jointure externe
En postfIxant les colonnes d'une table par (+), on spcIfIe une joInture
externe avec cette table. SI aucune range de la table ne satIsfaIt les
condItIons de slectIon, alors le SC80 met des valeurs null pour les colonnes
de cette table.
0e U|L SQL 16J
----------- ----------
10
11
12
13
14 1006
15
20
21
22
23
24
25
30
31
32
33
34 1002
35
40
41
42
43
44 1003
45 1005
S'Il n'exIste pas de rservatIon pour une chambre, elle sera compose avec
une entIt fIctIve de FservatIon n'ayant que des valeurs nulles.
Sous-requtes
Une sousrequte permet de dfInIr un ensemble d'entIts. Elle permet
d'exprImer une condItIon ou une expressIon par rapport au contenu des
tables. Elle sera aussI utIlIse plus loIn pour Insrer des ranges dans une
table, pour InItIalIser une table (Insert, CREATE) et pour dfInIr l'tendue
d'une modIfIcatIon (Update, Delete)
Subquery
exemple: prIx moyen des chambres ayant le mme confort que celle du
clIent No 1006 :
SELECT avg(prix) FROM Chambres
WHERE Confort =
(SELECT Confort FROM Chambres, Reservations
WHERE Chambres.num_chambre
=Reservations.num_chambre
AND num_client=1006)
AVG(PRIX)
----------
146.666667
164 Modeliser et realiser une BD
FIgure 102 :|odele , modele avec les sousrequtes de la machIne SQL
La sousrequte est ImbrIque dans une autre requte. 0ans une sous
requte, on peut faIre rfrence des varIables dfInIes un nIveau
suprIeur. l faut alors les consIdrer comme des parametres quI sont
modIfIs pour chaque range du produIt cartsIen du nIveau suprIeur.
exemple: chambre ayant un prIx 10 InfrIeur la moyenne pour une mme
catgorIe de confort
SELECT Num_chambre,confort FROM Chambres a
WHERE prix < (SELECT avg(prix)*0.90 FROM Chambres b
WHERE b.confort=a.confort)
NUM_CHAMBRE CONFOR
----------- ------
13 BAIN
23 BAIN
33 BAIN
43 BAIN
La sousrequte calcule le prIx moyen d'une chambre ayant le confort fIx
par la valeur a.confort prIse par la range de la requte du nIveau
suprIeur.
R1 R2 ... Rn
From .... Produit catsien
Where .... prdicat
select .... projection
entit
relation
n-uplet
T1 T2 ... Tm
From .... Produit catsien
Where .... prdicat
select .... projection
n-uplet
entit
relation
0e U|L SQL 165
Nous devons donc modIfIer notre modele de machIne SQL pour tenIr compte
des sousrequtes. CellescI s'Inserent dans le module de la clause WHEFE.
Elles y IntroduIsent la rcursIvIt car chaque clause WHEFE peut contenIr des
sousrequtes (FIgure 102)
Regroupements
Cette clause permet de spcIfIer le regroupement d'un certaIn nombre
d'entIts selon un crItere de partIonnement afIn d'valuer une fonctIon
agrgatIve. Le rsultat ne donne donc qu'une seule entIt pour chaque
regroupement. Les prIncIpales fonctIons d'agrgatIon sont:
avg : calculer la moyenne d'une lIste
count : dnombrer les lments d'une lIste
min : dtermIner l'lment mInImum d'une lIste
max : dtermIner l'lment maxImum d'une lIste
sum : calculer la somme d'une lIste
Les parametres de la fonctIon sont une expressIon quI peut tre prfIxe par
les mots cl all et distinct. Par dfaut all est utIlIs; dans ce cas
toutes les valeurs de la lIste sont prIses en consIdratIon. Avec distinct,
seules les valeurs dIffrentes sont consIdres. Les valeurs null, ne sont pas
slectIonnes. Cependant Count(*) permet de dnombrer une lIste en
tenant compte de ces dernIeres.
L'expressIon de la clause GROUP BY dtermIne le partIonnement. CeluIcI
est effectu sur les ranges quI sont slectIonnes par la clause WHERE. Les
ranges lImInes par la condItIon de slectIon ne partIcIpent donc pas
l'agrgatIon. L'expressIon de regroupement doIt tre quIvalente toutes les
expressIons comportant des varIables apparaIssant dans le rsultat.
Le processus de regroupement Intervenant apres la slectIon des ranges, Il
est possIble d'exprImer une condItIon de slectIon sur les valeurs agrges
dans la condItIon de la clause having. La clause having permet de
spcIfIer le crItere sur les entIts regroupes La clause WHERE permet de
spcIfIer le crItere sur les entIts Intervenant dans le regroupement
CroupClause
exemples:
PrIx moyen des chambres par type de confort:
SELECT Confort,AVG(Prix) "prix moyen"
FROM Chambres
GROUP BY Confort
CONFOR prix moyen
------ ----------
BAIN 146.666667
DOUCHE 100
166 Modeliser et realiser une BD
WC 85
PrIx mInImum et maxImum des chambres par type de confort:
SELECT Confort,Min(Prix),Max(Prix)
FROM Chambres
GROUP BY Confort
CONFOR MIN(PRIX) MAX(PRIX)
------ ---------- ----------
BAIN 120 180
DOUCHE 100 100
WC 80 90
FIgure 10J :|odele , modele avec les regroupements de la machIne SQL
PrIx mInImum et maxImum des chambres par type de confort, maIs dont le
prIx |In est plus petIt que 100:
SELECT Confort,Min(Prix),Max(Prix)
FROM Chambres
GROUP BY Confort Having Min(Prix)<100
CONFOR MIN(PRIX) MAX(PRIX)
------ ---------- ----------
WC 80 90
R1 R2 ... Rn
From .... Produit catsien
Where .... prdicat
select .... projection
relation
n-uplet
Group by .... regroupement
et calcul
Having ... prdicat
0e U|L SQL 167
Nous devons donc modIfIer notre modele de machIne SQL pour tenIr compte
des regroupements. CeuxcI se placent apres le test du prdIcat: un premIer
module permet les regroupements et le calcul des fonctIons agrgatIves
ensuIte on effectue une slectIon sur les valeurs prIses par les fonctIons
agrgatIves.
Lnsembles
Cette clause permet d'effectuer des requtes en utIlIsant les oprateurs
ensemblIstes: union
10
, intersect, minus (0Iffrence) ont le sens
habItuel. Les oprandes, le rsultat de slectIon, de ces oprateurs doIvent
avoIr la mme arIt (nombre de constItuants) et les constItuants doIvent tre
gaux en type, pas forcment en taIlle. L'utIlIsatIon de ces oprateurs
ImplIque ImplIcItement la clause 0STNCT, donc l'lImInatIon des doublons.
SI les colonnes des dIffrentes slectIons sont IdentIques alors Il est possIble
d'effectuer une seule slectIon en utIlIsant les oprateurs logIques.
SetClause
Exemple:
Les termes employs pour une chambre
SELECT confort "Termes"
FROM CHAMBRES
union
SELECT equipement
FROM CHAMBRES
Termes
------
BAIN
DOUCHE
NON
TV
WC
Cette clause permet de parcourIr une relatIon en fIxant un ordre
hIrarchIque. La clause prior doIt tre utIlIse pour fIxer la relatIon
10
UNDN ALL permet de faIre l'unIon par concatnatIon des rsultats.
Arborescences
ConnectClause
168 Modeliser et realiser une BD
parentenfant pour le parcours de l'arbre (la profondeur maxImum de l'arbre
est lImIte 256). Le cot gauche dfInIt le parent et le cot droIte l'enfant
sI la clause prIor prcede l'expressIon, et l'Inverse sI elle la succede. La
clause start with dfInIt la racIne de l'arbre (ou les racInes)
exemple: SoIt la relatIon
Emp(Nom,Num_Emp,Num_|anager,SalaIre):
E|P(a,b,c,d) La personne, portant le numro b et se nommant a a
un manager portant le numro c et peroIt le salaIre d
avec l'Instance suIvante:
NOM NUM_EMP NUM_MANAGER SALAIRE
------------ ---------- ----------- ----------
DOMINIQUE 1 10000
MARIE 2 1 6000
JEAN 3 1 5000
PAUL 4 2 5000
MARTINE 5 2 5000
VINCENT 6 4 5500
HENRI 7 4 4000
MADELEINE 8 3 4000
ANNE 9 3 3000
EtablIr une lIste des noms de personne par ordre hIrarchIque.
SELECT lpad('-',3*level)||Nom "Hirarchie"
FROM EMP
Connect by prior Num_Emp=Num_Manager
Start with Num_Manager is NULL
Hirarchie
---------------------------
-DOMINIQUE
-MARIE
-PAUL
-VINCENT
-HENRI
-MARTINE
-JEAN
-MADELEINE
-ANNE
SELECT Nom
FROM EMP E1
WHERE exists (SELECT * FROM EMP E2
WHERE E1.num_emp=E2.num_manager)
NOM
------------
DOMINIQUE
MARIE
La fonctIon level IndIque le nIveau d'un noeud dans l'arborescence. La
fonctIon lpad permet d'Insrer des blancs gauche (cadrer droIte)
autres exemples avec les fonctIons prdIcatIves:
QuI est responsable d'employs :
0e U|L SQL 169
JEAN
PAUL
SELECT Nom
FROM EMP E1
WHERE E1.salaire< any (SELECT salaire FROM EMP E2
WHERE E1.num_emp=E2.num_manager)
NOM
------------
PAUL
SELECT Nom FROM EMP E1
WHERE exists (SELECT * FROM EMP E2
WHERE E1.num_emp=E2.num_manager)
AND E1.salaire> all (SELECT salaire FROM EMP E2
WHERE E1.num_emp=E2.num_manager)
NOM
------------
DOMINIQUE
MARIE
JEAN
exemple:
SELECT nom, adresse
FROM Clients
ORDER BY nom asc
NOM ADRESSE
-------------------- ----------------------------------------
AGDA 10 route de l impossible 1508 TEXAS
QuI est chef d'un employ mIeux pay que luImme:
QuI est Chef absolu, aucun employ mIeux pay que luImme :
1rier
Cette clause permet de trIer une relatIon afIn de l'affIcher dans un ordre
donn. Seule la reprsentatIon externe est affecte par ce trI. Le trI est
spcIfI par une lIste, dont les lments les plus gauche sont les plus
sIgnIfIcatIfs dans le trI. Pour chaque lment, le trI peut tre croIssant (asc)
ou dcroIssant (desc). Par dfaut, Il est croIssant. Un lment est une
expressIon de la clause SELECT. l peut aussI tre un nombre IndIquant le
numro de la colonne trIer. Ce type de spcIfIcatIon du crItere de trI est
oblIgatoIre dans le cas ou le rsultat est obtenu par utIlIsatIon d'un oprateur
ensemblIste (en effet les colonnes provIennent de requtes dIffrentes)
DrderClause
Sorteddef
170 Modeliser et realiser une BD
CHADOK 25 rue de la rame 1456 Tombouctou
DUFOUR 10 av. de la gar 1300 AILLEURS
DUMAS 10 route du moulins LE-SUD
DUPONT 12 ch. des hirondelles 1238 LABAS
EINSTEIN 10 route de la relativit 1004 PLUS-LOIN
GASCON 12 av. du Gnral 1239 ICI
NOBODY 403 route de l inconnu 75000 Paris
ROMULUS 241 route de rome 1409 Lion
ZORO 10 ch des voleurs Los Angeles
Modle de la machine SQL
FInalement, nous obtenons le modele de la FIgure 104pour la machIne SQL.
Les relatIons d'une opratIon ensemblIste sont calcules Indpendament. Le
trI est effectu en dernIer sur le rsultat fInal.
FIgure 104 :modele complet de la machIne SQL
Ce modele n'a d'utIlIt que de dtermIner le rsultat d'une requte SQL. Lors
de l'excutIon relle d'une requte, le SC80 va optImIser la requte afIn
d'vIter de travaIller sur les nuplets du produIt cartsIen. Cette optImIsatIon
(traIte plus loIn) utIlIse d'une part les proprIts de l'algebre relatIonnelle
et d'autre part les structures de donnes accompagnant les tables
mmorIses.
R1 R2 ... Rn
From .... Produit catsien
Where .... prdicat
select .... projection
relation
n-uplet
Group by .... regroupement
et calcul
Having ... prdicat
...
Union, intersect, minus ....
Oprations ensemblistes
Order by .....
Tri du rsultat
0e U|L SQL 171
Lxpression graphique d'une requte
Les SC80 sont pratIquement tous munIs d'une Interface graphIque pour
l'InterrogatIon des donnes. Pour l'utIlIsateur occasIonnel, cette solutIon est
tres effIcace car IntuItIvement, Il peut spcIfIer une requte sans se
proccuper de la syntaxe SQL. Cependant pour des requtes complexes,
cette approche graphIque peut devenIr plus complexe que la spcIfIcatIon
textuelle de la requte.
FIgure 105 :modele complet de la machIne SQL
0ans la FIgure 105, nous montrons une requte graphIque effectue avec
Access de |Icrosoft. Nous voulons une lIste des vhIcules dIesel avec la
catgorIe de permIs. Conceptuellement, Il faut procder de la mme
manIere, c'estdIre, dtermIner les relatIons du contexte de la requte.
0ans notre cas Il s'agIt de \hcule et de Type, apres les avoIr slectIonnes
dans une lIste, le systeme les prsente sur la surface de travaIl. En utIlIsant
les InformatIons sur les attrIbuts et les cardInalIts, le systeme propose de
composer, les deux relatIons par l'attrIbut modle.
En clIquant sur les champs NochassIs, typeCarburant et categorIe, nous les
faIsons apparatre dans le tableau InfrIeur. 0ans ce mme table, nous allons
prcIser les crIteres de slectIon, de projectIon, de trI et ventuellement de
slectIon
FIgure 106 :modele complet de la machIne SQL
172 Modeliser et realiser une BD
A tout moment, Il est possIble d'obtenIr d'autres vues de la requte.
Celle de l'excutIon (FIgure 106) et celle de sa traductIon en SQL (FIgure
107).
FIgure 107 :modele complet de la machIne SQL
Lxercices
Questions sur 11
3
Nous avons les Instances suIvantes des relatIons:
SELECT * FROM Vehicule
NOCHASSIS NOPLAQUE MISEENSER MODELE NOSTATION
---------- ---------- --------- ------------ ----------
100001 121 11-DEC-91 TAXI1 1
100002 122 24-JAN-92 TAXI2 1
100003 123 14-DEC-91 TAXI1 2
100005 125 20-DEC-91 TAXI2 2
100004 124 13-OCT-91 BUS 2
SELECT * FROM Type
MODELE NBPLACES CA TYPECARBURAN A POIDS
------------ ---------- -- ------------ - ----------
TAXI1 5 V ESSENCE N 850
TAXI2 7 V DIESEL Y 1200
BUS 35 PL DIESEL N 6500
SELECT * FROM Carburant
NOPLAQUE NOJOUR KILOMETRAGE LITRES TYPECARBURAN
---------- ---------- ----------- ---------- ------------
121 1 300 30 ESSENCE
122 1 300 20 DIESEL
123 1 300 30 ESSENCE
124 1 300 60 DIESEL
125 1 300 20 DIESEL
121 2 310 30 ESSENCE
122 2 320 20 DIESEL
123 2 300 31 ESSENCE
124 2 300 62 DIESEL
125 2 300 21 DIESEL
121 3 310 31 ESSENCE
0e U|L SQL 17J
122 3 320 21 DIESEL
123 3 300 32 ESSENCE
124 3 300 58 DIESEL
125 3 300 22 DIESEL
125 4 10 1 ESSENCE
SELECT * FROM Entretien
NOCHASSIS NOJOUR DESCRIPTION
---------- ---------- ------------------
100001 1 VIDANGE
100001 1 BOITE A VITESSE
100002 2 VIDANGE
100003 3 VIDANGE
100004 1 VIDANGE
SELECT * FROM Chauffeur
NOCHAUFFEUR NOM PRENOM ADRESSE NOSTATION
----------- ---------- ----------- --------- ----------
1 DUPONT JEAN ici 1
2 MAX MAXIM ici1 1
3 BOL PAUL labas 2
4 PASBOL PAUL labas2 2
SELECT * FROM Permis
NOCHAUFFEUR CA
----------- --
1 V
2 V
3 V
4 V
1 PL
3 PL
SELECT * FROM Planning
NOCHAUFFEUR NOCHASSIS NOJOUR T
----------- ---------- ---------- -
1 100001 1 A
2 100002 1 A
3 100003 2 A
4 100005 1 A
1 100001 1 B
4 100003 2 A
1 100004 3 A
SELECT * FROM Station
NOZONE NOSTATION
---------- ----------
10 1
12 2
SELECT * FROM Distance
HEURE ZONEDE ZONEA TEMPSPARCOURS
---------- ---------- ---------- -------------
10 10 20 5
11 10 20 6
12 10 20 10
13 10 20 5
174 Modeliser et realiser une BD
10 20 10 5
11 20 10 6
12 20 10 10
13 20 10 5
10 10 10 0
11 10 10 0
12 10 10 0
13 10 10 0
10 20 20 0
11 20 20 0
12 20 20 0
13 20 20 0
13 20 20 0
SELECT * FROM Situation
NOCHASSIS NOZONE
---------- ----------
1000001 10
1000002 20
1000003 20
1000005 20
0onnez une requte SQL pour chaque poInt cIdessous, utIlIsez le graphe de
relatIon pour effectuer les joIntures:
0e U|L SQL 175
SELECT *
FROM VEHICULE
ORDER BY nochassis
NOCHASSIS NOPLAQUE MISEENSER MODELE NOSTATION
---------- ---------- --------- ------------ ----------
100001 121 11-DEC-91 TAXI1 1
100002 122 24-JAN-92 TAXI2 1
100003 123 14-DEC-91 TAXI1 2
100004 124 13-OCT-91 BUS 2
100005 125 20-DEC-91 TAXI2 2
1) lIste des vhIcules par numro de chassIs croIssant
2) lIste des vhIcules et leur catgorIe de permIs
J) lIste des vhIcules de plus de 20 places
4) lIste des vhIcules ayant entre 5 et 8 places
5) lIste du poIds total des vhIcules (poIds du vhIcule + 65 kg par personne)
6) lIste alphabtIque des chauffeurs et de leur permIs
7) lIste des prnoms partags par plusIeurs chauffeurs en utIlIsant count()
8) lIste des prnoms partags par plusIeurs chauffeurs en utIlIsant EXSTS
9) lIste des vhIcules ayant un numro de plaque commenant par un 1 et un
J en troIsIeme posItIon
10) lIste des vhIcules ayant un entretIen dont le lIbell comporte
successIvement les mots 8DTE et 7TESSE
11) lIste des vhIcules que peut conduIre le chauffeur No 4 (avec le N)
12) lIste des vhIcules que peut conduIre le chauffeur No 4 (avec des
joIntures seulement)
1J) dtermIner sI un vhIcule a t remplI avec un carburant ne
correspondant pas son modele
14) consommatIon totale de chaque vhIcule, trIe par type de carburant
15) consommatIon totale par jour, par statIon, par type de carburant
16) consommatIon moyenne de chaque vehIcule pour 100 km
17) consommatIon moyenne journalIere de chaque vhIcule pour 100 km
18) lIste des pleIns anormaux (20 de plus que la consommatIon moyenne du
vhIcule)
19) le plannIng du chauffeur No 1 trI par jour et tranche horaIre
20) pour un clIent appelant depuIs la zone 10 1J heure, donnez la lIste des
vhIcules Inoccups par ordre de proxImIt.
Reponses sur 11
3
1) lIste des vhIcules par numro de chassIs croIssant
2) lIste des vhIcules et leur catgorIe de permIs
176 Modeliser et realiser une BD
SELECT nochassis,v.modele
FROM VEHICULE v, TYPE t
WHERE v.modele=t.modele
NOCHASSIS MODELE
---------- ------------
100004 BUS
100001 TAXI1
100003 TAXI1
100002 TAXI2
100005 TAXI2
SELECT nochassis,nbplaces
FROM VEHICULE v, TYPE t
WHERE v.modele=t.modele
AND nbplaces>20
NOCHASSIS NBPLACES
---------- ----------
100004 35
SELECT nochassis,nbplaces
FROM VEHICULE v, TYPE t
WHERE v.modele=t.modele
AND nbplaces between 5 AND 8
NOCHASSIS NBPLACES
---------- ----------
100001 5
100003 5
100002 7
100005 7
SELECT nochassis,poids+65*nbplaces "Poids total"
FROM VEHICULE v, TYPE t
WHERE v.modele=t.modele
NOCHASSIS Poids total
---------- -----------
100004 8775
100001 1175
100003 1175
100002 1655
100005 1655
SELECT ch.nochauffeur,nom,prenom,categorie
FROM CHAUFFEUR ch, Permis pe
WHERE ch.nochauffeur=pe.nochauffeur
ORDER BY nom,prenom
J) lIste des vhIcules de plus de 20 places
4) lIste des vhIcules ayant entre 5 et 8 places
5) lIste du poIds des vhIcules (65 kg par personne)
6) lIste alphabtIque des chauffeurs et de leur permIs
0e U|L SQL 177
NOCHAUFFEUR NOM PRENOM CA
----------- -------------- ----------------- --
3 BOL PAUL V
3 BOL PAUL PL
1 DUPONT JEAN V
1 DUPONT JEAN PL
2 MAX MAXIM V
4 PASBOL PAUL V
SELECT distinct prenom
FROM CHAUFFEUR
GROUP BY prenom having count(prenom)>=2
PRENOM
------------------------
PAUL
SELECT distinct prenom
FROM CHAUFFEUR ch1
WHERE exists(SELECT 'vrai'
FROM CHAUFFEUR ch2
WHERE ch1.nochauffeur<>ch2.nochauffeur
AND ch1.prenom=ch2.prenom)
PRENOM
------------------------
PAUL
SELECT nochassis,noplaque
FROM VEHICULE
WHERE noplaque like '1_3%'
NOCHASSIS NOPLAQUE
---------- ----------
100003 123
SELECT nochassis,description
FROM ENTRETIEN
WHERE description like '%BOITE%VITESSE%'
NOCHASSIS DESCRIPTION
---------- ---------------
100001 BOITE A VITESSE
7) lIste des prnoms partags par plusIeurs chauffeurs en utIlIsant count()
8) lIste des prnoms partags par plusIeurs chauffeurs en utIlIsant EXSTS
9) lIste des vhIcules ayant un numro de plaque commenant par un 1 et un
J en troIsIeme posItIon
10) lIste des vhIcules ayant un entretIen dont le lIbell comporte
successIvement les mots 8DTE et 7TESSE
11) lIste des vhIcules que peut conduIre le chauffeur No 4 (avec le N)
178 Modeliser et realiser une BD
SELECT nochassis,v.modele
FROM VEHICULE v, TYPE t
WHERE v.modele=t.modele
AND categorie in (SELECT pe.categorie
FROM CHAUFFEUR ch, Permis pe
WHERE ch.nochauffeur=pe.nochauffeur
AND ch.nochauffeur=4)
NOCHASSIS MODELE
---------- ------------
100001 TAXI1
100005 TAXI2
100002 TAXI2
100003 TAXI1
SELECT nochassis,v.modele
FROM VEHICULE v, TYPE t,CHAUFFEUR ch, Permis pe
WHERE v.modele=t.modele
AND ch.nochauffeur=pe.nochauffeur
AND pe.categorie=t.categorie
AND ch.nochauffeur=4
NOCHASSIS MODELE
---------- ------------
100001 TAXI1
100003 TAXI1
100002 TAXI2
100005 TAXI2
SELECT nochassis,v.modele
FROM VEHICULE v, TYPE t
WHERE v.modele=t.modele
AND typecarburant <> any (SELECT typecarburant
FROM carburant tc
WHERE v.noplaque=tc.noplaque)
NOCHASSIS MODELE
---------- ------------
100005 TAXI2
SELECT typecarburant,noplaque,sum(litres)
FROM CARBURANT
GROUP BY typecarburant,noplaque
ORDER BY typecarburant
TYPECARBURAN NOPLAQUE SUM(LITRES)
------------ ---------- -----------
DIESEL 122 61
DIESEL 124 180
DIESEL 125 63
12) lIste des vhIcules que peut conduIre le chauffeur No 4 (avec des
joIntures seulement)
1J) dtermIner sI un vhIcule a t remplI avec un carburant ne
correspondant pas son modele
14) consommatIon totale de chaque vhIcule, trIe par type de carburant
0e U|L SQL 179
ESSENCE 121 91
ESSENCE 123 93
ESSENCE 125 1
SELECT nojour, nostation ,typecarburant ,sum(litres)
FROM CARBURANT c, VEHICULE v
WHERE c.noplaque=v.noplaque
GROUP BY nojour, nostation ,typecarburant
NOJOUR NOSTATION TYPECARBURAN SUM(LITRES)
---------- ---------- ------------ -----------
1 1 DIESEL 20
1 1 ESSENCE 30
1 2 DIESEL 80
1 2 ESSENCE 30
2 1 DIESEL 20
2 1 ESSENCE 30
2 2 DIESEL 83
2 2 ESSENCE 31
3 1 DIESEL 21
3 1 ESSENCE 31
3 2 DIESEL 80
3 2 ESSENCE 32
4 2 ESSENCE 1
SELECT noplaque ,
(sum(litres)/sum(kilometrage))*100 "consommation moyenne
globale"
FROM CARBURANT c
GROUP BY noplaque
NOPLAQUE consommation moyenne globale
---------- ----------------------------
121 9.89130435
122 6.4893617
123 10.3333333
124 20
125 7.03296703
17) consommatIon moyenne journalIere de chaque vhIcule pour 100 km
SELECT noplaque,nojour ,
(sum(litres)/sum(kilometrage))*100 "moyenne journaliere"
FROM CARBURANT c
GROUP BY noplaque,nojour
NOPLAQUE NOJOUR moyenne journaliere
---------- ---------- -------------------
121 1 10
121 2 9.67741935
121 3 10
122 1 6.66666667
122 2 6.25
122 3 6.5625
123 1 10
15) consommatIon totale par jour, par statIon, par type de carburant
16) consommatIon moyenne de chaque vehIcule pour 100 km
180 Modeliser et realiser une BD
123 2 10.3333333
123 3 10.6666667
124 1 20
124 2 20.6666667
124 3 19.3333333
125 1 6.66666667
125 2 7
125 3 7.33333333
125 4 10
SELECT noplaque,nojour,litres*100/kilometrage
FROM CARBURANT c1
WHERE litres*100/kilometrage
> (SELECT
1.2*(sum(litres)*100/sum(kilometrage))
FROM CARBURANT c2
WHERE c2.noplaque=c1.noplaque)
NOPLAQUE NOJOUR LITRES*100/KILOMETRAGE
---------- ---------- ----------------------
125 4 10
SELECT nochauffeur,nojour,tranchehoraire,nochassis
FROM PLANNING c1
WHERE nochauffeur=1
ORDER BY nojour,tranchehoraire
NOCHAUFFEUR NOJOUR T NOCHASSIS
----------- ---------- - ----------
1 1 A 100001
1 1 B 100001
1 3 A 100004
SELECT s.nochassis,s.nozone,tempsparcours
FROM SITUATION S,DISTANCE D
WHERE s.nozone=d.zonede
AND d.zonea=10
AND d.heure=13
ORDER BY tempsparcours
NOCHASSIS NOZONE TEMPSPARCOURS
---------- ---------- -------------
1000001 10 0
1000002 20 5
1000003 20 5
1000005 20 5
18) lIste des pleIns anormaux (20 de plus que la consommatIon moyenne du
vhIcule)
19) le plannIng du chauffeur No 1 trI par jour et tranche horaIre
20) pour un clIent appelant depuIs la zone 10 1J heure, donnez la lIste des
vhIcules Inoccups par ordre de proxImIt.
0e U|L SQL 181
JJ. Modification des donnees
"Un matin, au sortir d'un rve agit, Grgoire Samsa
s'veilla transform dans son lit en une vritable vermine"
(Franz Kafka - La mtamorphose)
Les champs d'applIcatIon quI ne se transforment pas au cours du temps sont
extrmement peu frquent (dans le domaIne de l'analyse statIstIque
d'enqute). La modIfIcatIon des objets du champ d'applIcatIon est ncessaIre
dans la majorIt des cas. Ces modIfIcatIons touchent l'Instance de la base de
donnes. En poursuIvant l'Ide que l'Instance de la base donnes est une
InterprtatIon du champ d'applIcatIon l'Instant t, pour obtenIr l'Instance de
la base l'Instant t', Il suffIt en thorIe de rInterprter le contenu du
champ ce moment l (FIgure 111). La modlIsatIon et sa concrtIsatIon,
fIxes lors de la conceptIon InItIale, sont consIdres comme des InvarIants
par rapport aux modIfIcatIons des objets du champs d'applIcatIon.
FIgure 111 : 7IsIon de la modIfIcatIon travers les prdIcats.
L'exploItatIon d'une base de donnes par une rInterprtatIon contInue du
champ d'applIcatIon n'est pas possIble. L'InItIalIsatIon de la premIere
Instance peut dj tre longue dans la dure. 0e plus, Il seraIt dIffIcIle de
fIxer l'Intervalle de temps entre deux rInterprtatIons. Cette vIsIon de la
modIfIcatIon travers les prdIcats ne doIt tre donc conserve que comme
iR1
...
iRn
Md
objets
du
C.A. modlisation
concrtisation
interprtation
iR1'
...
iRn'
C.A'.
iR1''
...
iRn''
C.A''.
transfor-
mation
transfor-
mation
conception
initiale
Exploitation
t t' t''
TEMPS
182 Modeliser et realiser une BD
rfrence pour valIder d'autres mIses en oeuvre des modIfIcatIons.
Cependant, une telle vIsIon nous auraIt permIs de faIre l'conomIe de
l'analyse des transformatIons du champ d'applIcatIon.
Notre modele des modIfIcatIons demande l'IntroductIon d'un nouveau
concept, celuI d'vnement. L'occurence d'un vnement applIqu au champ
d'applIcatIon modIfIe ce dernIer. Par exemple, nous avons l'vnement: Un
clIent rserve une chambre et son occurence: le clIent No 1004 rserve la
chambre 24 du 1jan90 au 4jan90. L'occurence d'un vnement modIfIe
les objets du champ d'applIcatIon. En effet un vnement sans consquence
sur les donnes ne pourraIt pas laIsser de trace dans le champ d'applIcatIon.
La recherche des vnements se sItue au nIveau du champ d'applIcatIon, les
vnements sont donc sIgnIfIcatIfs pour les utIlIsateurs.
FIgure 112 : 7IsIon de la modIfIcatIon travers les vnements.
L'vnement est traduIt par une squence de prImItIves de modIfIcatIon dans
le modele relatIonnel; on appelle cette squence transactIon. FInalement,
l'excutIon de ces prImItIves sur la base de donnes modIfIe les Instances des
relatIons. Pour l'exemple prcdant, l'vnement de la rservatIon
correspond la cratIon d'une nouvelle entIt de la relatIon FservatIon.
L'occurence de l'vnement correspond l'InsertIon de la range (1004, 24,
1jan90, 4jan90) dans la table FservatIon.
Ce modele est donc bas sur le faIt que de petItes modIfIcatIons du champ
d'applIcatIon sont reportes comme de petItes modIfIcatIons de la base de
donnes (FIgure 112). Les objets du champ d'applIcatIon sont Interprts
InItIalement au temps t comme l'Instance 80
t
. Les occurences des
iR1
...
iRn
objets
du
C.A.
modlisation
C.A'.
t
t'
occurence
d'vnements
Squence
de primitives
de modication
C.A''.
t''
interprtation
initiale
excution
0e U|L SQL 18J
vnements de t t' sont reports en excutant les prImItIves
correspondantes donnant l'Instance 80
t'
. Et aInsI de suIte .
Ce modele amene les remarques suIvantes. La base de donnes contIent le
reflet du champ d'applIcatIon pour un Instant dtermIn dans le temps. La
base de donnes ne mmorIse pas l'hIstoIre de ses modIfIcatIons car
l'occurence des vnements entranent ImmdIatement son actualIsatIon. SI
l'on veut conserver cette hIstoIre, Il faut la modlIser explIcItement (ou
travaIller avec un SC80 hIstorIque). La base de donnes au temps t est le
reflet de l'ensemble des vnements depuIs l'InItIalIsatIon et devraIt tre
gale une Instance InItIalIse au temps t. La valIdIt de cette galIt est
soumIse des hypotheses et des contraIntes que l'on doIt valIder sur le
modele. Nous rsumons le modele des modIfIcatIons par les 5 quatIons de la
FIgure 11J.
1. Le champ d'applIcatIon actuel est gal la squence des occurences
des vnements applIqus au champ d'applIcatIon InItIal.
2. La base de donnes actuelle est gale la squence des prImItIves de
modIfIcatIon excutes sur la base de donnes InItIale.
J. L'Instance de la base de donnes InItIale est une InterprtatIon
correcte du champ d'applIcatIon InItIal.
4. La squence d'occurence des vnements est quIvalente la
squence d'excutIon des prImItIves de modIfIcatIon
5. L'Instance de la base de donnes actuelle est une InterprtatIon
correcte du champ d'applIcatIon actuel.
Ces quatIons sont des hypotheses fortes, examInons les possIbles faIblesses
de ce systeme.
L'quatIon 1 est vraIe sI la totalIt des vnements peuvent tre enregIstrs
(ou perus). l est donc essentIel que tous les vnements soIent mIs en
vIdence et que leurs sources d'occurence soIent IdentIfIes. SInon, les
transformatIons du champ d'applIcatIon apparaIssent comme spontanes,
sans cause. Et cecI rend ImpossIble la mIse jour de la base de donnes par
l'excutIon des prImItIves. 0ans le cas ou de tels vnements sont Inhrents
au champ d'applIcatIon, Il est IndIspensable de rInItIalIser prIodIquement
la base de donnes afIn de rduIre l'cart entre le champ d'applIcatIon et son
InstancIatIon. Par exemple, dans un magasIn par rapport la gestIon de son
stock, les vols de marchandIses sont InvItables et ne peuvent tre prIs en
compte par le systeme d'InformatIon (par dfInItIon le vol doIt passer
Inapperu). Un InventaIre prIodIque permet la rInItIalIsatIon de la base de
donnes.
184 Modeliser et realiser une BD
FIgure 11J : EquatIons sous jacentes du modele de modIfIcatIon.
L'quatIon 2 est vraIe par dfInItIon, elle constItue la spcIfIcatIon mme
des prImItIves de modIfIcatIon d'un SC80. Cependant, sa valIdIt dpend de
mcanIsmes tels que la gestIon des transactIons dans le SC80, d'une gestIon
correcte de la concurrence de l'excutIon des transactIons, de la scurIt des
donnes par rapport aux dfaIllances du matrIel.
L'quatIon J est vraIe sI d'une part la modlIsatIon est fIdele et d'autre part
sI l'Instance InItIale est une InterprtatIon correcte du champ d'applIcatIon.
La fIdlIt de l'InterprtatIon dpend de la justesse de l'analyse des objets
du champ d'applIcatIon et de leur modlIsatIon. La qualIt de l'Instance
InItIale doIt tre controle mInutIeusement, par exemple par des requtes
dont les rsultats sont dj connus dans le champ d'applIcatIon.
L'quatIon 4 est vraIe sI l'on restreInt la consquence des vnements aux
objets Inclus dans la modlIsatIon. Cette restrIctIon est Importante car elle
ampute l'vnement d'une partIe de son InformatIon concernant son
adquatIon la modlIsatIon, au modele, au paradIgme de gestIon utIlIs.
Pour nous, l'vnement est porteur de modIfIcatIon sur ces autres nIveaux et
l'organIsatIon doIt tre attentIve cellescI. Par exemple, la transformatIon
des habItudes de payement des clIents par l'utIlIsatIon de carte de crdIt
doIt tre prIse en compte dans la modlIsatIon, en ajoutant les constItuants
ncessaIres. CecI est encore plus manIfeste sI la structure du champ
d'applIcatIon n'est pas bIen tablIe. Par exemple dans le domaIne de la
cognItIon, la comprhensIon de ce lIvre n'est par rductIble l'InsertIon des
mots dans une hypothtIque table contenue dans la tte du lecteur. Au fur
et mesure de sa progessIon dans la lecture, maIs chaque vnement
modIfIe peu peu son modele et fInalement tablIt un paradIgme IntrIorIs
des systemes d'InformatIon. Les vnements des champs d'applIcatIons bIen
structurs entranent prIncIpalement des modIfIcatIons sur les objets et plus
rarement des modIfIcatIons sur la structure explIquant le succs des SC80
dans ces domaInes.
Champ
d'application
Initial
+ vnements
BD
Actuel
BD
Initial
Champ
d'application
Actuel
+ primitives
1
2
3 4 5
0e U|L SQL 185
FIgure 114 : Spectre des modIfIcatIons dont l'vnement est porteur.
L'quatIon 5 est vraIe pour autant que les quatIons prcdentes soIent
vrIfIes. A terme, un cart InvItable se cre entre le champ d'applIcatIon
et la base de donnes, oblIgeant le concepteur et l'organIsatIon (par ordre
dcroIssant de frquence):
rInItIalIser la base de donnes
restructurer la modlIsatIon des donnes et des vnements
changer de modele (InformatIque)
changer de paradIgme de gestIon
Le dfI actuel des systemes d'InformatIon rsIde dans l'assurance d'une
contInuIt par rapport ces dIffrents changements (quI sont ImprvIsIbles)
Primitives de modification
Les prImItIves sont le reflet de troIs vnements lmentaIres du champ
d'applIcatIon:
La cratIon; un objet
11
nouveau apparat dans le champ d'applIcatIon,
donc Il doIt tre enregIstr dans la base de donnes (un nouveau clIent
de l'hotel)
La mIse jour; un objet dj prsent dans le champ d'applIcatIon se
modIfIe et cecI doIt tre report dans la 80 (un clIent modIfIe sa date
de dpart)
La suppressIon; un objet enregIstr dans la 80 sort du champ
d'applIcatIon et doIt donc tre lImIn de la 80 (Une chambre est
amnage en salon)
Une prImItIve ne modIfIe qu'une seule relatIon et une seule entIt. Pour
s'excuter, elle doIt vrIfIer certaInes prcondItIons et apres son excutIon
on peut toujours vrIfIer certaInes postcondItIons. Dn notera par: [pr
condItIons] prImItIve [postcondItIons], l'effet de la prImItIve.
Creation
SoIt F(C
1
,C
2
,....,C
n
) et IF une Instance de F, r un tuple de F
11
Un objet du champ d'applIcatIon peut tre modlIs par plusIeurs relatIons.
interprtations
structures
modles
paradigmes ...
Evnement
primitives
186 Modeliser et realiser une BD
Alors la cratIon de r dans F note c(F,r) est l'opratIon quI modIfIe
l'Instance IF de la manIere suIvante:
[r IF] c(F,r) [r IF]
Dn dclenche cette prImItIve pour le tuple r lorsque le prdIcat de F devIent
valIde pour les valeurs de r.
exemple: un nouveau clIent
c(ClIents,(0umas,Alexandre,le vIeux moulIn...))
FIgure 115 : AssocIatIon des vnements lementaIres aux prImItIves.
Suppression
SoIt F(C
1
,C
2
,....,C
n
) et IF une Instance de F, r un tuple de F
Alors la suppressIon de r dans F note s(F,r) est l'opratIon quI modIfIe
l'Instance IF de la manIere suIvante:
[r IF] s(F,r) [r IF]
champ
d'application
sort du C.A.
se transforme
entre dans le C.A.
maj de
constituants
suppression
d'entits
cration
d'entits
0e U|L SQL 187
Dn dclenche cette prImItIve pour le tuple r, lorsque le prdIcat de F
devIent InvalIde pour les valeurs de r et que r n'est pas remplac par un
autre ayant d'autres valeurs.
exemple: transformatIon d'une chambre en salon
s(Chambres,(2J,120,1,2 ,8AN,NDN ))
Mise jour
SoIt F(C
1
,C
2
,....,C
n
) et IF une Instance de F, r un tuple de F
Alors la mIse jour de r dans F pour le constItuant C par la valeur v est
l'opratIon note m(F,r,C,v) est l'opratIon quI modIfIe l'Instance IF de la
manIere suIvante:
[r IF] m(F,r,C,v) [r[C]=v ]
Dn dclenche cette prImItIve pour le tuple r lorsque le prdIcat de F devIent
InvalIde pour r , maIs reste valIde sI r prend la valeur v pour le
constItuant C.
Exemple: modIfIcatIon de la date de dpart d'une rservatIon
m(FservatIon,(1006,14,010EC89,280EC89),0atedep,J00EC89).
1ransaction
Une transactIon est dfInIe par une squence de prImItIves de modIfIcatIon.
T = p
1
, p
2
, ... p
n
0e plus l'excutIon de la transactIon doIt vrIfIer les proprIts suIvantes
[CFA81]:
La consIstance; la transactIon doIt obIr aux protocoles lgaux. Les
protocoles lgaux apparaIssent comme un ensemble de regles
respecter pour que la concurrence des acces soIt cohrentes. Cet
ensemble dpend de la technIque choIsIe dans l'archItecture du SC80.
NanmoIns, tous les protocoles exIgent que la transactIon accdant
un tat consIstent de la base de donnes transforme celuIcI en un
tat consIstent sI on l'excute Isolment (cecI rapport la dfInItIon
des regles d'IntgrIt que l'on verra ultrIeurement)
L'atomIcIt; L'excutIon des transactIons doIt tre vue comme un tout,
Il n'exIste pas de transactIon Inacheve. Les transformatIons de la base
sont conserves sI la transactIon s'acheve, donc sI toutes les prImItIves
de modIfIcatIons se sont excutes normalement. SI la transactIon est
Inacheve, les transformatIons sont effaces et l'on restItue l'tat
prcdent.
La durabIIIt; une foIs qu'une transactIon est confIrme, on ne peut
plus l'annuler (sauf par une nouvelle transactIon)
La transactIon munIe de ces concepts est l'unIt de transformatIon de la base
de donnes et aussI l'unIt de rcupratIon des erreurs. Un ensemble de
technIques ont t dveloppes pour assurer ces proprIts. Elles
188 Modeliser et realiser une BD
permettent la modIfIcatIon d'une base de donnes par plusIeurs utIlIsateurs
en toute scurIt. Et aussI elles supplent aux ventuelles dfaIllances du
matrIel.
Les protocoles de gestIon de la concurrence sont rgIs par le prIncIpe
d'quIvalence des ordonnancements des transactIons [PAP79]. magInons que
nous ayons l'ensemble [T
1
, T
2
, ... T
n
] de transactIons excuter de manIere
concurrente. SI nous avIons une machIne InfInIment rapIde, la dure
d'excutIon des transactIons seraIt ramene zro et le rsultat de la
modIfIcatIon correspondraIt l'excutIon squentIelle d'une des
permutatIons possIbles de l'ensemble de dpart. Nous ne possdons pas une
telle machIne par contre, quI fIxe l'ensemble des permutatIons excutes
squentIellement comme rfrence admIssIble. Les protocoles de gestIon (en
utIlIsant des verrous sur les donnes) de la concurrence vont permettre un
entrelacement entre les prImItIves des transactIons maIs assurer que le
rsultat fInal soIt quIvalent une des permutatIons. Autrement dIt ces
protocoles ne permettent pas aux transactIons de communIquer entreelles.
Une transactIon peut modIfIer la base de donnes et cette modIfIcatIon ne
doIt pas tre perue par d'autres transactIons tant qu'elle n'est pas confIrme
(acheve).
0ans les SC80, Il en va de mme, une transactIon peut modIfIer le contenu
complet de la base de donnes, ces modIfIcatIons ne seront perues qu'au
moment de la confIrmatIon.
L'atomIcIt de la transactIon doIt prvenIr la base de donnes de
modIfIcatIons Incompletes. CellescI peuvent tre dues une transactIon ne
pouvant s'achever (mauvaIs parametres, lImIte des ressources), une
transactIon errone (les condItIons errones sont prvues et la transactIon
provoque ellemme l'abandon), ou plus sImplement une dfaIllance
matrIelle durant l'excutIon. Cette dernIere peut provoquer une perte du
contenu de la mmoIre vIve ou d'un mdIa de la mmoIre secondaIre.
Quelqu'en soIt la raIson, l'atomIcIt exIge que les effets des transactIons en
cours soIent lImIns et que ceux des transactIons confIrmes soIent
restItus (sI dtruIts). La tenue d'un journal (stock Indpendamment de la
base de donnes) des modIfIcatIons entreprIses par les transactIons constItue
gnralement la technIque employe pour assurer l'atomIcIt. En cas
d'InterruptIon, Il suffIt de parcourIr le journal, pour refaIre les transactIons
confIrmes et pour dfaIre celles quI ne le sont pas. Cette reprIse ellemme
sujette des dfaIllances doIt pouvoIr tre rexcuter autant de foIs qu'Il le
faut.
Une part Importante du code d'un SC80 est consacre la rsolutIon de ces
problemes et l'on peut consIdrer qu'un logIcIel quI nglIgeraIt ces concepts
ne peut pas tre exploIt raIsonablement par une entreprIse.
0e U|L SQL 189
Langage de manipulation de donnees en SQL
Le langage SQL offre des prImItIves semblables. Elles dfInIssent un sous
ensemble quI permet de manIpuler les donnes des tables du SC80. Aux troIs
prImItIves de base sont ajoutes les commandes permettant de spcIfIer des
transactIons et celles permettant dfInIr les verrous pour la gestIon de la
concurrence.
Cette clause permet d'Insrer soIt une nouvelle range dfInIe explIcItement
ou bIen d'Insrer un ensemble de ranges dfInIes par le rsultat d'une
requte. Les colonnes non dfInIes lors de l'InsertIon prennent la valeur null
pour cette range. La lIste des colonnes peut tre vIte, dans ce cas les
valeurs se sont assocIes aux colonnes dans l'ordre de la dclaratIon de la
table (CFEATE ...)
Insertcommand
Exemple:
cratIon d'une nouvelle rservatIon pour un nouveau clIent
insert into clients
(num_client, nom, prenom, adresse)
values(2000,'New','Man','12 rue de la dcouverte')
insert into reservations
(num_client, num_chambre, date_arr, date_dep)
values(2000,12,'12-jan-91','14-jan-91')
La premIere modIfIcatIon est quIvalente :
insert into clients
values(2000,'New','Man','12 rue de la dcouverte')
magInons que nous ayons cr une table CLENTS_FECENTS quI doIt contenIr
les clIents ayant rserv partIr de l'anne 1990. Nous avons l'ordre de
cratIon suIvant et l'InItIalIsatIon de la table peut s'effectuer avec une
InsertIon accompagne d'une sousrequte.
190 Modeliser et realiser une BD
CREATE TABLE CLIENTS_RECENTS (
NUM_CLIENT NUMBER (6) not null ,
NOM CHAR (20),
PRENOM CHAR (20),
ADRESSE CHAR (40))
insert into CLIENTS_RECENTS
(num_client, nom, prenom, adresse)
SELECT c.num_client, nom, prenom, adresse
FROM CLIENTS c, RESERVATIONS r
WHERE c.num_client=r.num_client
AND date_arr>='1-jan-90'
l est Intressant de noter que ce type d'InsertIon conduIt crer des
InformatIons redondantes. En effet, les InformatIons quI sont Insres sont
dj par dfInItIon dans la base de donnes.
Updatecommand
Cette clause permet de mettre jour une colonne ou un groupe de colonne.
L'expressIon de mIse jour est soIt une expressIon sImple ou bIen une sous
requte. La condItIon de la clause WHERE permet de spcIfIer les ranges quI
doIvent tre mIse jour.
Exemple:
modIfIcatIon de la date de dpart du clIent 1006
update reservations
set date_dep='30-DEC-89'
WHERE num_client=2000 AND date_dep='28-DEC-89';
augmentatIon de tous les prIx de 10
sImpleupdate
update chambres
set prix=prix*1.10
augmentatIon des prIx de 10 pour les chambres avec baIn
update chambres
set prix=prix*1.10
WHERE confort='BAIN';
augmentatIon des prIx de 10 + 5 Francs par personne pouvant occuper la
chambre;
update chambres
set prix=prix*1.10 + 5*nbr_pers
0e U|L SQL 191
augmentatIon des prIx au prIx moyen en fonctIon du confort (IcI les ranges
de la table modIfIer sont utIlIses comme varIable dans la sousrequte;
update chambres c1
set (prix)=(SELECT avg(prix)
FROM chambres c2
WHERE c1.confort=c2.confort)
subqueryupdate
deletecommand
Exemple:
SuppressIon de la chambre 2J
delete FROM chambres
WHERE num_chambre=23
SuppressIon de toutes les chambres
delete FROM chambres
transactIoncommand
Cette clause permet de spcIfIer les transactIons. Le dbut de la transactIon
est ImplIcIte, Il est sItu dIrectement apres le dernIer poInt de confIrmatIon
ou au dbut de la sessIon de travaIl.
La commande commit dfInIt la fIn de la transactIon. Les commandes de
manIpulatIon de la modlIsatIon (CREATE, drop, ...) provoquent
ImmdIatement apres leur excutIon un commit ImplIcIte.
La commande set transaction permet de dfInIr explIcItement le dbut
d'une transactIon dans le cas ou l'on veut excuter plusIeurs requtes
consIstentes par rapport la lecture. L'optIon read only dfInIt que cette
transactIon ne fera pas de modIfIcatIon.
La commande savepoint ... permet de dfInIr des poInts de retour
l'IntrIeur mme de la transactIon. l sera possIble de revenIr explIcItement
l'tat dfInI en ces poInts.
192 Modeliser et realiser une BD
La commande rollback ... permet de retourner l'tat dfInI au dbut de
la transactIon. En spcIfIant un savepoInt, on revIent l'tat dfInI ce
poInt.
exemple:
Une transactIon confIrme
update chambres
set prix=prix*1.10
commit
Apres rceptIon de ce message, les effets de la transactIons sont vIsIbles
pour d'autres processus Interrogeant la base de donnes
Une transactIon annule
update chambres
set prix=prix*1.10
rollback
Les effets de la transactIon sont annuls
lockcommand
La gestIon des verrous est, par dfaut, assure par le SC80. Cependant, Il
est possIble de spcIfIer pour une transactIon les verrous demands. CecI
sont poss au nIveau de la table ou au nIveau de la range. 0ans le cas ou un
verrou est dj pos par un autre processus, l'optIon nowait spcIfIe que la
transactIon ne doIt pas attendre maIs retourne le controle l'utIlIsateur.
Lockmode
Les dIffrents mode de verouIllage sont les suIvants:
share; au nIveau de la table, mode partag en lecture, sans mIse
jour possIble
exclusive; au nIveau de la table, mode exclusIf en lecture, ne
permettant aucune modIfIcatIon
row share (ou row update); au nIveau des ranges, mode
partag en lecture, InterdIt un acces exclusIf de la table.
row exclusive; au nIveau des ranges, mode partag en lecture,
InterdIt un acces partg de la table.
0e U|L SQL 19J
share row exclusive; au nIveau des ranges, mode partag en
lecture, InterdIt un acces partg de la table et la modIfIcatIon des
ranges.
subqueryCFEATE
Nous ajoutons cette clause IcI car elle cumule deux effets, la cratIon d'une
table et l'InsertIon ImmdIate de donnes. Nous pouvons donc exprImer les
deux requtes prcdentes pour CLENTS_FECENTS en une seule:
CREATE TABLE CLIENTS_RECENTS AS
SELECT c.num_client, nom, prenom, adresse
FROM CLIENTS c, RESERVATIONS r
WHERE c.num_client=r.num_client
AND date_arr>='1-jan-90'
Par dfaut, les noms et les types des colonnes sont prIs dans le rsultat de la
requte.
FIgure 116 : |asque de modIfIcatIon pour les clIents.
Interfaces utilisateurs
l est vIdent que les commandes SQL vues plus haut ne peuvent pas tre
utIlIses dIrectement par l'utIlIsateur. Ces dernIeres doIvent tre Insres
dans une Interface permettant le dIalogue entre l'utIlIsateur et le SC80.
Cette Interface peut tre ralIse avec un gnrateur d'cran ou avec un
194 Modeliser et realiser une BD
langage de programmatIon (C++, Java, .) Cette Interface prsentera
l'utIlIsateur un masque de saIsIe classIque; dans chaque champ, Il pourra
entrer ses donnes. L'Interface fera, elle l'appel au SC80 avec la commande
SQL. 0ans un mme masque (FIgure 116), Il est possIble de crer,
slectIonner, mettre jour et supprImer des donnes.
Dn peut effectuer certaInes vrIfIcatIons la saIsIe, maIs nous allons voIr,
dans le chapItre suIvant, qu'Il est aussI ncessaIre de complter la
modlIsatIon avec des regles d'IntgrIt portant sur l'ensemble des Instances.
Lxercices
Questions sur 11
3
0onnez une requte SQL pour chaque poInt cIdessous:
1. Insrer l'entretIen peInture carosserIe du vhIcule 100004 au jour No
24
2. mettre jour l'adresse du chauffer No 1 quI est actuellement 2J
chemIn de l'avenIr
J. supprImer les InformatIons sur le plannIng concernant les jours
InfrIeurs 100
Reponses sur 11
3
insert into Entretien (Nochassis, nojour, description)
values(100004, 24, 'peinture carosserie')
2) Dn remarque les deux apostrophes pour en Insrer un !
update Chauffeur
set adresse='23 chemin de l''avenir'
WHERE nochauffeur=1
J)
delete FROM planning
WHERE nojour<100;
Dn supprIme l'effet de ces transactIons avec le Follback
Rollback
1)
0e U|L SQL 195
J2. Les Rgles d'integrite
"Chaque pice occupe une case et chaque case ne peut
contenir qu'une seule pice." (Camil Seneca - Les checs)
Nous avons vu comment Insrer, modIfIer et supprImer des entIts dans une
Instance. Ces modIfIcatIons doIvent tre le reflet d'vnements appartenant
au champ d'applIcatIon. l est vIdent qu'Il est tres sImple de commettre des
erreurs grossIeres lors de ces opratIons. Cependant, le champ d'applIcatIon
est soumIs des InvarIants appels regles d'IntgrIt quI permettent de
rduIre les rIsques de produIre des Instances InconsIstantes. Par exemple, on
ne peut pas rserver une chambre quI n'exIste pas un clIent Inconnu.
FIgure 121 : ntgratIon des regles d'IntgrIt dans le processus de
modlIsatIon
Les regles d'IntgrIt sont des prdIcats quI sont toujours valus vraI. A
noncer, elles semblent tre des lapalIssades : la date d'arrIve prcede la
date de dpart. |aIs elles constItuent un puIssant moyen de vrIfIcatIon et
d'lImInatIon des Instances quI ne peuvent pas exIster dans un champ
d'applIcatIon. La modlIsatIon du champ d'applIcatIon s'accompagne donc
d'une phase de recherche des InvarIants que l'on exprIme sous forme de
regles d'IntgrIt. Lors de l'tape de concrtIsatIon, elles sont transformes
en un ensemble de mcanIsmes quI valIdent ces regles.
Ces mcanIsmes sont varIs Ils peuvent tre Intgrs aux masques de saIsIe
ou faIre partIe du noyau du SC80 et tre spcIfIs lors de la cratIon d'une
table ou plus sImplement tre des requtes quI dtectent la prsence
d'anomalIes dans la base de donnes.
iR1
...
iRn
Md
RI
objets
du
C.A.
modlisation
& invariants
concrtisation
interprtation
validation
des RI
196 Modeliser et realiser une BD
Definitions et proprietes
lR est l'ensemble des Instances de F
F=[IF IF est une Instance de F]
l80 est l'ensemble des Instances de la base de donnes
80 = [I80 I80 F
j
,j=1..n]
Une regle d'IntgrIt r est un prdIcat ayant 80 pour domaIne
rI : 80 {vraI, faux]
Dn dIra quI I80 80 vclde la regle d'IntgrIt rI sI et seulement sI
rI(I80)= vraI
l80/r est l'ensemble des Instances de la base de donnes valIdant rI
Rl dsIgne l'ensemble des rI d'une modlIsatIon
F = [rI
1
, ., rI
n
]
Dn dIra quI I80 80 vaIIde l'ensemble F (ou est consIstent par rapport
F) sI et seulement sI I80 valIde chaque rI
j
de F.
F : 80 {vraI, faux]
F(I80) = rI
j
(I80) , j=1..n
= rI
1
(I80) rI
2
(I80)
...
rI
n
(I80)
l80/Rl est l'ensemble des Instances de la base de donnes valIdant F
80/F= [I80 F(I80)]
Dn remarque que
80/F= 80/rI
1
80/rI
2
...
80/rI
n
80 dfInIt un espace dont chaque dImensIon correspond une relatIon.
Chaque poInt de cet espace est assocI une Instance de la base de
donnes. 80/rI dfInIt le sousensemble des Instances de la base de donnes
valIdant la regle rI. 80/F est l'IntersectIon de tous ces sousensembles.
l s'agIt donc d'tablIr des regles que valIde le champ d'applIcatIon
Indpendamment des valeurs des objets de ce dernIer.
0ans le travaIl de N.H. Le Pham [PHA90] sur les regles d'IntgrIt, on trouve
les proprIts suIvantes:
Un ensemble F est trvcl sI et seulement sI toutes les Instances
valIdent F, soIt:
F est trIvIal 80/F=80
Par exemple, rI: (0ate_Arrs0ate_0ep) (0ate_Arr0ate_0ep) est une rI
trIvIale, n'Importe quel couple de dates satIsfaIt cette regle.
Un ensemble F est scts]cscble sI et seulement s'Il exIste une Instance
valIdant F, soIt:
F est satIsfaIsable 80/F =
0ans le cas contraIre on dIt que F est nscts]cscble, soIt
0e U|L SQL 197
F est satIsfaIsable 80/F =
Par exemple, rI: (0ate_Arr0ate_0ep) (0ate_Arr0ate_0ep) est une rI
InsatIsfaIsable, aucun couple de dates satIsfaIt cette regle.
La notIon de satIsfaIsabIlIt est rapprocher de celle de consIstance en
logIque. Nous nous Intressons donc qu'aux ensembles de regles
satIsfaIsables.
La regle rI est mplque par F (note FrI ,ou est la consquence
logIque de F) sI et seulement sI toutes les Instances valIdant F valIdent
aussI rI, soIt
(FrI) (80/F 80/rI)
Par exemple, rI2: (0ate_Arrs0ate_0ep + n jours) ou n est posItIf, est
ImplIque par la rI1 : (0ate_Arrs0ate_0ep).
L'ensemble F est quvclent F' sI et seulement sI toutes les Instances
valIdant F valIdent aussI F' et toutes les Instances valIdant F' valIdent
aussI F, soIt
(FF') (80/F = 80/F')
Par exemple, rI1: (0ate_Arrs0ate_0ep) (0ate_Arr0ate_0ep) est
quIvalente rI2: (0ate_Arr=0ate_0ep).
L'ensemble F est plus contrcyncnt que F' sI et seulement sI toutes les
Instances valIdant F valIdent aussI F', soIt
(FsF') (80/F 80/F')
Par exemple, rI1: (0ate_Arr1jan90) est plus contraIgnante que rI2:
(0ate_Arr1jan89).
La ]ermeture de F est l'ensemble des contraIntes ImplIques par F.
F
++
=[rI FrI]
F est rredondcnt sI et seulement s'Il n'exIste aucune regle rI F telle
que (F[rI])rI. Aucune rI ne peut donc se dduIre des autres.
Les notIons de fermeture et d'Irredondance seront partIculIerement utIles
lorsque nous aborderons l'tude des dpendances fonctIonnelles, un groupe
partIculIer de regles d'IntgrIt. Elles permettront de rechercher l'ensemble
mInImal de rI.
La consistance d'une transaction
Nous sommes maIntenant en mesure de comprendre la proprIt de la
consIstance d'une transactIon. Une transactIon T s'excute sur une Instance
consIstante I80 et transforme cellecI en une autre Instance consIstante I80'
par rapport un ensemble de regles d'IntgrIt prvalant sur la base de
donnes. En termes de pr et postcondItIons, nous pouvons noter:
[I80 80/F] T [I80' 80/F]
Pendant la dure de la transactIon, l'tat de la base de donnes peut tre
InconsIstant. |aIs ces tats ne sont perus que par la transactIon T.
198 Modeliser et realiser une BD
L'atomIcIt et les protocoles de gestIon de la concurrence assurent que seul
l'tat I80' sera vIsIble (ou I80 sI on annule la transactIon).
0ans la fIgure 2, les prImItIves de modIfIcatIon dfInIssent les sauts
mInImaux d'un tat l'autre de la base de donnes. La transactIon dfInIt un
parcours commenant et se termInant par un tat consIstant.
Ces regles d'IntgrIt sont stctques Car l'tat InItIal et fInal ne sont pas lIs,
par opposItIon aux regles dyncmques ou ces tats sont lIs. ClassIquement
l'tat cIvIl d'une personne est un exemple d'une regle dynamIque, en effet
l'tat marI ne peut succder que l'tat veuf ou dIvorc (sI l'on exclut les
annulatIons de marIage, tres rares !)
FIgure 122 : Fegles d'IntgrIt et transactIons
Portee de la rgle d'integrite
ExamInons les troIs regles d'IntgrIt suIvantes:
rI1: Le nombre des membres de l'DulIpo est un nombre premIer et un nombre
de Queneau.
12
rI2: La date de dpart d'une rservatIon doIt tre postrIeure la date
d'arrIve, soIt
rI2: r FservatIons (r.datedep r.datearr)
rIJ: Une mme chambre ne peut tre rserve par deux clIents dIffrents le
mme jour
rIJ: r FservatIons, r' FservatIons tel que:
r.NumclIent = r'.NumclIent
et r.Numchambre = r'.Numchambre
et r.0atearr s r'.0atedep
et r.0atedep r'.0atearr
rI4:Les numros de clIents dans FservatIon sont dfInIs dans ClIents
rI4: FservatIon[Num_clIent] ClIents[Num_clIent]
12
PoInt 8 des ndIcatIons lImInaIres de Jacques Foubaud In La bIblIotheque DulIpIenne,
EdItIons Famsay, 1987
Modlisation
donnes
Primitives
modification
Rgles
d'intgrit
IBD
IBD/RI
iBDI'
iBDI
Transaction T
0e U|L SQL 199
rI5:Les numros de clIents sont unIques
rI5: r ClIents, r' ClIents tel que:
r[Nom,Prenom,Adresse] = r'[Nom,Prenom,Adresse]
et r.NumClIent = r'.NumClIent
Dn peut remarquer que la valIdatIon des rI prcdentes demande des
connaIssances dIverses sur les Instances de la base de donnes.
rI1 peut tre valIde dIrectement sur le constItuant nombre_de_membres (sI
l'on constItuaIt une base de donnes hIstorIque pour l'DulIpo). Cette regle est
de type domcne, Il suffIt de connatre la valeur prIse par le constItuant pour
valIder la regle. Normalement, ces regles sont dfInIes au nIveau du domaIne
du constItuant, cependant la complexIt de certaInes dpasse les capacIts
de modlIsatIon des domaInes (type, Intervalle, ...)
rI2 peut tre valIde dIrectement sur l'entIt de FservatIon . Cette regle est
de type ntrctuple Il suffIt de connatre la valeur prIse par l'entIt pour
valIder la regle.
rIJ peut tre valIde dIrectement sur l'Instance de la relatIon FservatIon.
Cette regle est de type ntrcrelcton, Il suffIt de connatre la valeur prIse
par plusIeurs des entIts d'une Instance pour valIder la regle.
rI4 demande pour tre valIde les Instances de plusIeurs relatIons
dIffrentes. Cette regle est de type nterrelcton.
rI5 peut tre valIde dIrectement sur l'Instance de la relatIon ClIents. Cette
regle est de type ntrcrelcton. Dn dIt aussI que NumclIent est une cl de la
relatIon ClIents. Une cl est un ensemble de constItuants (mInImum) quI
dtermIne de manIere unIque tous les autres constItuants de la relatIon (Dn
revIendra sur cette notIon dans le chapItre sur les dpendances
fonctIonnelles).
La fIgure J rsume ces dIffrents types. La complexIt de la valIdatIon du
type dpend dIrectement de l'tendue de la regle. Un des objectIfs lors de la
conceptIon de la base de donnes est de mInImIser les couts de valIdatIon de
ces regles d'IntgrIt.
0Irectement lIe la valIdatIon d'une regle d'IntgrIt, nous avons la notIon
de porte d'une regle d'IntgrIt. Une prImItIve de modIfIcatIon appartIent
la porte d'une regle rI sI elle peut rendre InvalIde l'Instance de la 80. C'est
dIre qu'elle peut Influencer la consIstance de la base de donnes par
rapport rI
200 Modeliser et realiser une BD
FIgure 12J : tendue des dIffrents types de regles d'IntgrIt
0fInItIon
SoIt P l'ensemble des prImItIves applIcables au schma S=[F1, F2, ...,
Fn] la porte dune ryle r est l'ensemble des prImItIves de
modIfIcatIon quI peuvent rendre InvalIde une Instance I80, soIt:
P
p
(rI) =[p P [I80 80/rI] p [I80' 80/rI]]
Pour les rI prcdentes, nous avons (C=cratIon, |=mIse jour,
S=suppressIon, les _ correspondent aux parametres non spcIfIs des
prImItIves):
P
p
(rI1)=[C(DulIpo,_),
|(DulIpo,_,nombre_de_membres,_)]
P
p
(rI2)=[C(FservatIons,_),
|(FservatIons,_,date_Arr,_),
|(FservatIons,_,date_0ep,_)]
P
p
(rIJ)=[C(FservatIons,_),
|(FservatIons,_,num_clIent,_),
|(FservatIons,_,num_chambre,_),
|(FservatIons,_,date_Arr,_),
|(FservatIons,_,date_0ep,_)]
P
p
(rI4)=[C(FservatIons,_),
|(FservatIons,_,num_clIent,_),
S(ClIents,_),
|(ClIents,_,num_clIent,_)]
P
p
(rI5)=[C(ClIents,_),
|(ClIents,_,num_clIent,_)]
Dn peut constater que la porte est en rapport avec les types de regle. La
porte est utIle pour dtermIner les controles suffIsants et ncessaIres pour
la 80 par rapport aux transactIons et aux Interfaces utIlIsateurs.
R
C1 C2 Cn ...
cn
ri-intra
entite
ri-intra
relation
S
ri-inter
relation
ri-domaine
T
0e U|L SQL 201
0'une manIere Inverse, on peut dfInIr la sensblt d'une prImItIve par
l'ensemble des rI dont elle est lment de la porte.
S
p
(p)=[rI F p P
p
(rI)]
Avec les rI cIdessus, nous avons:
S
p
(C(FservatIons,_))=[rI2, rIJ, rI4]
S
p
(S(ClIents,_))=[rI4]
Dn peut tendre les notIons de porte et de sensIbIlIt au nIveau de la
transactIon.
SoIt A une applIcatIon dfInIe comme l'ensemble des transactIons [T
1
, T
2
, ...
T
n
] ou chaque T
I
est dfInIe par un ensemble de prImItIves de modIfIcatIon
T
I
= [ p
I1
, p
I2
, ... p
Im
].
La porte de la regle rI par rapport l'applIcatIon A est alors dfInIe comme
l'ensemble des transactIons dont une des prImItIves appartIent la porte de
la rI.
P
T
(rI)=[T A p T ou p P
p
(rI)]
Dn peut aussI dfInIr la sensblt d'une transactIon par l'ensemble des rI
dont elle est lment de la porte.
S
T
(T)=[rI F T P
T
(rI)]
Actuellement, les SC80 permettent de valIder certaInes regles d'IntgrIt
exprImes lors de la conceptIon du schma. Ces regles sont restreIntes des
catgorIes bIen dfInIes, dont la porte en terme de prImItIves est
ImplIcItement assocIe aux parametres de la catgorIe. Cela sIgnIfIe que le
SC80 dtermIne automatIquement la porte de ces regles et valIde ces
dernIeres des qu'une de ces prImItIves est excute. Ces catgorIes sont:
une regle ntrctuple, exprIme par un prdIcat sur les constItuants
d'une relatIon . Les prImItIves de la porte sont la cratIon d'une
entIt et la mIse jour d'un des constItuants du prdIcat de la regle
exemple, rI: prIx 50 * nbr_pers
P
p
(rI)=[ C(Chambres, _ ),
|(Chambres,_,prIx,_),
|(Chambres,_,nbr_pers,_)]
une regle portant sur l'unct des valeurs prIses par un ensemble de
constItuants X d'une relatIon (on verra plus loIn que cecI est une cl).
SoIt rIF,r'IF r[X]=r'[X]. l n'exIste donc pas deux entIts ayant
mme valeur pour X. Les prImItIves de la porte sont la cratIon d'une
entIt et la mIse jour d'un des constItuants de X.
exemple, rI: UnIcIt sur Num_chambre dans Chambres
P
p
(rI)=[ C(Chambres, _ ),
|(Chambres,_,num_chambre,_)]
une regle portant sur l'InclusIon entre deux ensembles d'entIts,
exprIme par F[X] S[Y] (dpendance d'InclusIon). Les prImItIves de la
202 Modeliser et realiser une BD
porte sont la cratIon d'une entIt de F, la mIse jour d'un des
constItuants de X, la suppressIon d'une entIt de S et la mIse jour
d'un des constItuants de Y,
exemple dj cIt,
rI4: FservatIon[Num_clIent] ClIents[Num_clIent]
P
p
(rI4)=[ C(FservatIons,_),
|(FservatIons,_,num_clIent,_),
S(ClIents,_),
|(ClIents,_,num_clIent,_)]
En dfInIssant une de ces regles d'IntgrIt dIrectement dans le SC80, le
concepteur ne doIt plus se proccuper de sa valIdatIon lors d'une
transactIon. Le SC80 la valIde automatIquement, cependant Il doIt rcuprer
les messages d'erreur afIn de les rInterprter pour l'utIlIsateur.
Pour les regles d'IntgrIt n'entrant pas dans ces catgorIes, le concepteur
peut envIsager troIs types de solutIons.
La vcldcton loccle de la rI, pendant l'excutIon de la transactIon;
dans le code de la transactIon, l'excutIon de la prImItIve dangereuse
pour l'IntgrIt de la rI est soumIse des prcondItIons valIdant la rI.
Cette solutIon permet de mInImIser les couts de la valIdatIon. En
effet, on connat au moment de l'excutIon de la prImItIve tous ses
parametres et on peut donc les utIlIser pour cIrconscrIre le contexte
de la valIdatIon. Par exemple, pour assurer qu'une chambre n'est pas
loue deux foIs le mme jour, lors de la transactIon de rservatIon, la
valIdatIon ne portera que sur la chambre et la prIode concerne par
les parametres de la transactIon. Cette solutIon a le dsavantage de
coder dans les transactIons les regles. En cas de modIfIcatIons de ces
regles, Il faut revoIr toutes les transactIons appartenant leur porte.
La vcldcton ylobcle de la rI, apres l'excutIon de la transactIon;
avant la confIrmatIon de la transactIon, on valIde toutes les regles
d'IntgrIt appartenant la sensIbIlIt de la transactIon. 0ans cette
solutIon, on perd l'effIcacIt de la solutIon prcdente, par contre, on
gagne en souplesse en cas de modIfIcatIon des regles d'IntgrIt.
Le dcynostc; aucune valIdatIon n'est effectue pendant l'excutIon
des transactIons. La base de donnes peut devenIr InconsIstante. l
exIste cependant pour chaque regle, une possIbIlIt de dIagnostIquer
les anomalIes. Ces dIagnostIcs sont excuts avant d'entreprendre
certaInes transactIons ou Il est IndIspensable que la base soIt
consIstante. La stratgIe est donc de permettre la mmorIsatIon des
donnes et d'effectuer prIodIquement des correctIons sur les
anomalIes.
Un systeme d'InformatIon complexe ncessIte gnralement l'utIlIsatIon des
troIs types de solutIons. La valIdatIon locale pour son effIcacIt et pour
prserver des temps de rponse acceptables. La valIdatIon globale lorsque
les regles sont rgulIerement modIfIes (plus vIte que le temps de
0e U|L SQL 20J
reprogrammatIon des transactIons). Le dIagnostIc quand Il est Important de
saIsIr au plus vIte l'InformatIon, en assumant une prIode de consolIdatIon
des donnes pour lImIner les anomalIes.
7.4. Les rgles d'integrite en SQL
ExamInons la syntaxe du langage SQL pour dfInIr les regles d'IntgrIt. Ces
dernIeres sont spcIfIes soIt la cratIon de la table ou bIen lors d'une
modIfIcatIon de la structure de la table. 0eux types de regles sont admIs,
l'un portant sur une seule colonne et l'autre portant sur un groupe de
colonnes. Un IdentIfIant (nom) peut tre assocI chaque regle.
CFEATETA8LE
newcolumnlIst
Les regles portant sur une colonne seulement sont dclares ImmdIatement
apres le type de la colonne. Dn trouve les clauses suIvantes:
Null/ Not Null : InterdIt que la colonne puIsse prendre des valeurs
nulles (nondfInIes).
Unique : la colonne est une cl de la table. Les valeurs de cette
colonne sont toutes dIstInctes les unes des autres. (La colonne doIt
aussI tre spcIfIe comme not null)
Primary Key : IdentIque unIque. La cl prImaIre est la cl que le
concepteur prIvIlgIe dans les acces et les joIntures avec cette table,
elle est Indexe.
References ... : les valeurs de cette colonne doIvent tre des
lments de la table projete sur la colonne de rfrence. La colonne
de rfrence doIt tre spcIfIe comme unIque (ou cl prImaIre)
Check(...) : un prdIcat est assocI la colonne, Il utIlIse
seulement les noms des constItuants de la table et se vrIfIe
localement sur la range (cecI exclut les sous requtes)
columnconstraInt
204 Modeliser et realiser une BD
l est possIble de dclarer des regles portant sur plusIeurs colonnes. Dn
trouve les clauses suIvantes:
Unique(...) : le groupe de colonnes est une cl de la table. Les
valeurs de ces colonnes sont toutes dIstInctes les unes des autres. (Les
colonne doIvent aussI tre spcIfIes comme not null)
Primary Key(...) : IdentIque la clause unIque. Une seule cl
prImaIre est autorIse par table.
Foreign Key () References ... : les valeurs de ce groupe de
colonnes doIvent tre des lments de la table projete sur le groupe
de rfrence. Les colonnes de rfrence doIvent tre spcIfIes
comme unIque (ou cl prImaIre)
Check(...) : dj vu plus haut
newconstraIntlIst
tableconstraInt
deftableconstraInt
Exemple:
Feprenons notre modlIsatIon Hotel et ajoutons les regles d'IntgrIts lors de
la cratIon des tables. Nous obtenons:
CREATE TABLE CLIENTS (
NUM_CLIENT NUMBER (6) not null ,
NOM CHAR (20) not null
check (NOM=upper(NOM)) constraint CLIENTS_RI1,
PRENOM CHAR (20),
ADRESSE CHAR (40),
primary key (NUM_CLIENT) constraint CLIENTS_RI2)
0e U|L SQL 205
Num_clIent est la cl. Tous les noms sont en majuscule.
CREATE TABLE CHAMBRES (
NUM_CHAMBRE NUMBER (2) not null,
PRIX NUMBER (8,2) not null,
NBR_LITS NUMBER (1) not null
check (NBR_LITS between 1 AND 4) constraint CHAMBRES_RI1,
NBR_PERS NUMBER (1) not null
check (NBR_PERS>NBR_LITS)
constraint CHAMBRES_RI2,
CONFORT CHAR(6) not null
check (CONFORT in ('bain','WC','douche'))
constraint CHAMBRES_RI3,
EQUIPEMENT CHAR(3) not null
check (EQUIPEMENT in ('TV','NON'))
constraint CHAMBRES_RI4,
primary key (NUM_CHAMBRE)
constraint CHAMBRES_RI5)
Num_chambre est la cl. Le nombre de lIts est comprIs entre 1 et 4. Le
nombre de personnes est suprIeur au nombre de lIts. Le confort et les
quIpements sont restreInts certaInes valeurs.
CREATE TABLE RESERVATIONS (
NUM_CLIENT NUMBER (6) not null,
NUM_CHAMBRE NUMBER (2) not null,
DATE_ARR DATE not null
check (DATE_ARR<DATE_DEP)
constraint RESERVATIONS_RI1,
DATE_DEP DATE,
primary key (NUM_CHAMBRE,DATE_ARR)
constraint RESERVATIONS_RI2,
foreign key (NUM_CLIENT)
references CLIENTS(NUM_CLIENT)
constraint RESERVATIONS_RI4,
foreign key (NUM_CHAMBRE)
references CHAMBRES(NUM_CHAMBRE)
constraint RESERVATIONS_RI5)
La cl prImaIre est le groupe num_chambre et date_arr. Les chambres et les
clIents de rservatIons sont connus dans les relatIons de rfrence. La date
de dpart est postrIeure la date d'arrIve.
mposer un ensemble de valeurs pour une colonne est dlIcat du poInt de vue
de la conceptIon, car le jour ou se groupe volue Il faut modIfIer la regle et
Il semble que les SC80 aIent encore quelques dIffIcults lors de telles
modIfIcatIons. Par exemple, dans le futur, Il faudra peuttre ajouter 'sauna'
aux valeurs de confort. CecI est donc rserver des groupes tres stables
(ouI/non, par exemple) autrement, Il faut dfInIr des tables pour les codes.
Les regles dfInIes avec des rfrences dtermInent un ordre de cratIon et
de suppressIon des tables. En effet, la table de rfrence doIt tre cre
avant celle quI y faIt rfrence et supprIme apres cette dernIere. AInsI Il
faudra supprImer les relatIons d'hotel dans l'ordre suIvant.
206 Modeliser et realiser une BD
CREATE TABLE T2
(A char(8) not null unique,
B char(8) not null references T1(B))
alter TABLE T1 add ( foreign key (A) references T2(A))
Rappelons que certaines ri ne sont pas exprimables directement
dans le SGBD. Par exemple: pas deux rservations le mme jour
pour la mme chambre. On peut alors crire, des requtes pour
dterminer les anomalies. Dans notre cas, aprs insertion
d'une rservation errone, on obtient:
insert into reservations values(1004,14,'27-DEC-89','30-DEC-
89');
rem: ne tient pas compte des valeurs nulles de date_dep
SELECT *
FROM Reservations r1, Reservations r2
WHERE r1.num_chambre=r2.num_chambre
AND r1.num_client<>r2.num_client
AND r2.date_arr between r1.date_arr AND r1.date_dep
AND r2.date_arr<>r1.date_dep;
Rem: on dfait notre requte pour liminer les donnes du test
rollback;
Dans le chapitre suivant, nous allons examiner les dpendances
fonctionnelles qui sont un type de rgles d'intgrit qui
permettent de trouver les cls d'une relation, les dpendances
d'inclusion et surtout d'tudier les proprits d'une
dcomposition.
Exercice
Questions sur TT3
1) Redfinir le schma de TT3 pour tenir compte des rgles
d'intgrit
2) Dterminer l'ordre de suppression des tables (inverse de
l'ordre de cration)
3) Dfinir des ri ne pouvant tre directement valides par le
SGBD pour TT3 et donner l'ordre SQL pour dtecter les
anomalies.
Rponses sur TT3
Cration du schma
0e U|L SQL 207
CREATE TABLE Station(
noZone number(2),
noStation number(1) not null
primary key constraint station_RI1);CREATE TABLE
Type(
modele char(12) not null
primary key
constraint Type_RI1,
nbPlaces number(2) not null
check (nbPlaces>0)
Constraint Type_RI2,
categorie char(2) not null
check (categorie in ('V','PL'))
Constraint Type_RI3,
typeCarburant char(12) not null
check (typeCarburant in ('ESSENCE','DIESEL'))
Constraint Type_RI4,
automatique char(1) not null
check (automatique in ('Y','N'))
Constraint Type_RI5,
poids number(5) not null
check (poids>0)
Constraint Type_RI6);
CREATE TABLE Distance( heure number(2),
zoneDe number(2) not null,
zoneA number(2) not null,
tempsParcours number(3) not null
check (tempsParcours>0)
Constraint Distance_RI1,
primary key (zoneDe,zoneA)
constraint Distance_RI2);
CREATE TABLE Vehicule(
noChassis number
primary key
constraint Vehicule_RI1,
noPlaque number not null
unique
constraint Vehicule_RI2,
miseEnService date not null,
modele char(12) not null
references Type(modele)
constraint Vehicule_RI3,
noStation number(1) not null
references Station(noStation)
constraint Vehicule_RI4);
208 Modeliser et realiser une BD
CREATE TABLE Chauffeur(
noChauffeur number not null
primary key constraint Chauffeur_RI1,
nom char(24) not null,
prenom char(24) not null,
adresse char(80) not null,
noStation number(1) not null
references Station(noStation)
constraint Chauffeur_RI2);
CREATE TABLE Situation(
noChassis number not null
primary key
constraint Situation_RI1
references Vehicule(noChassis)
constraint Situation_RI2,
noZone number(2) not null);
CREATE TABLE Carburant(
noPlaque number not null,
noJour number(3) not null,
kilometrage number not null
check (kilometrage>0)
Constraint Carburant_RI1,
litres number(3) not null
check (litres>0)
Constraint Carburant_RI2,
typeCarburant char(12) not null
check (typeCarburant in ('ESSENCE','DIESEL'))
Constraint Carburant_RI3,
primary key (noPlaque,noJour,kilometrage)
constraint Carburant_RI4);
CREATE TABLE Entretien(
noChassis number not null
references Vehicule(noChassis)
constraint Entretien_RI1,
noJour number(3) not null,
description char(240) not null,
primary key (noChassis,noJour)
constraint Entretien_RI2);
CREATE TABLE Permis(
noChauffeur number not null
references Chauffeur(noChauffeur)
constraint Permis_RI1,
categorie char(2) not null
check (categorie in ('V','PL'))
Constraint Permis_RI2,
primary key (noChauffeur,categorie)
constraint Permis_RI3);
CREATE TABLE Planning(
noChauffeur number not null
references Chauffeur(noChauffeur)
0e U|L SQL 209
constraint Planning_RI1,
noChassis number not null
references Vehicule(noChassis)
constraint Planning_RI2,
noJour number(3) not null,
trancheHoraire char(1) not null
check (trancheHoraire in ('A','B','C'))
Constraint Planning_RI3,
primary key (noChauffeur,noChassis,noJour)
constraint Planning_RI4);
SuppressIon du Schma
drop TABLE Carburant;
drop TABLE Entretien;
drop TABLE Planning;
drop TABLE Permis;
drop TABLE Situation;
drop TABLE Vehicule;
drop TABLE Chauffeur;
drop TABLE Distance;
drop TABLE Type;
drop TABLE Station;
Autres rgIes d'IntgrIt
rechercher d'autres regles pertInentes
0e U|L SQL 211
J3. Dependances fonctionnelles
"Ds que l'on pose une question quelle qu'elle soit, on
introduit le doute, on cesse de rciter, on va voir. Et des tas
de surprises nous attendent, y compris dans ce qui a
l'apparence du banal" (Boris Cyrulnik - De la parole comme
une molcule)
0epuIs son IntroductIon par Codd en 1970, le concept de dpendance
fonctIonnelle reste un des outIls prIncIpaux du concepteur de base de
donnes. l permet :
d'exprImer des InvarIants de la modlIsatIon ;
de dfInIr des modlIsatIons quIvalentes (conduIsant des
ImplantatIons dIffrentes) ;
d'assurer l'utIlIsatIon correcte des charnIeres lors de la composItIon ;
d'tre un outIl d'analyse lors du processus de conceptIon (ou de
restructuratIon) de la 80.
Les dpendances fonctIonnelles sont un outIl d'analyse des relatIons car elles
sont fondes sur les proprIts exIstant entre les constItuants euxmmes,
sans tenIr compte des regroupements de ces dernIers en relatIon. Les
relatIons sont donc subordonnes aux dpendances fonctIonnelles.
0fInItIon: la dpendance fonctIonnelle (df)
SoIt F une relatIon ou X F
+
et Y F
+
Alors Y dpend ]onctonnellement de X (not: X Y) sI et seulement sI
r et r' IF ( r.X=r'.X r.Y=r'.Y)
Dn dIt aussI que X dtermne Y. CecI sIgnIfIe que sI on a deux entIts de F
ayant des valeur IdentIques pour X alors elles ont aussI des valeurs
IdentIques pour Y.
0ans notre exemple Hotel, nous avons Num_ClIent Nom. Nous avons donc
pour un numro clIent qu'un seul nom. La dpendance fonctIonnelle spcIfIe
donc l'unIcIt entre deux groupes de constItuants. Nous ne pouvons pas dIre
l'Inverse Nom Num_ClIent, car Il peut exIster deux personnes s'appelant
0upont assocIes des numros clIents dIffrents.
l ne faut pas confondre les dpendances fonctIonnelles avec les cls des
relatIons (bIen qu'une cl dtermIne toujours une df). Les dpendances
fonctIonnelles permettent de dtermIner les cls et non l'Inverse.
Les dpendances fonctIonnelles sont consIdrer comme des regles
d'IntgrIt. Pour l'exemple Hotel, nous avons l'ensemble de df suIvant:
212 Modeliser et realiser une BD
Num_chambre PrIx
Num_chambre Confort
Num_chambre Nbr_lIt
Num_chambre Nbr_pers
Num_chambre EquIpement
Num_clIent Nom
Num_clIent Prnom
Num_clIent Adresse
Num_chambre,0ateArr 0ate_0ep
Num_chambre,0ateArr Num_clIent
l exIste aussI une reprsentatIon graphIque des df (utIle pour la recherche
des cls). Les noeuds sont constItuants et les toIles reprsentent les df. Les
arcs orIents du graphe dtermIne les groupes de constItuants Intervenant
dans les df.
FIgure 1J1 : reprsentatIon graphIque de la df A8 C0
FIgure 1J2 : reprsentatIon graphIque des df d'Hotel
En regardant la FIgure 1J2, on a envIe de dIre IntuItIvement: SI
Num_chambre et 0ate_Arr dtermInent Num_clIent et sI Num_clIent
dtermIne Nom alors Num_chambre et 0ate_Arr dtermIne Nom SoIt:
Num_chambre,0ateArr Num_clIent
Num_clIent Nom
Num_chambre,0ateArr Nom
A
B
C
D
df
Numchambre
Prix
Confort
Nbr_lit
Nbr_pers
Equipement
Prnom
Adresse
DateDep
DateArr
Numclient
Nom
0e U|L SQL 21J
A partIr des dpendances fonctIonnelles, on peut drIver de nouvelles df.
FormalIsons notre IntuItIon.
Iermeture et consequence logique de I
0fInItIons
Le schmc de relcton est le couple S=(F,F) ou F est la modlIsatIon
d'une relatIon et F est un ensemble de dpendances fonctIonnelles
exprImes sur F
SoIt S=(F,F) et f une df sur F, on dIra que f est la consquence loyque
de F sI toutes les Instances de F valIdent f. (Dn notera F f)
SoIt S=(F,F), la ]ermeture de F, note F
++
est l'ensemble des
dpendances fonctIonnelles quI sont la consquence logIque de F. SoIt:
F
++
=[X Y F X Y]
La fermeture de F rpond notre questIonnement prcdant. Nous avons le
droIt de dduIre une nouvelle df sI elle appartIent la fermeture de F, donc
sI toutes les Instances de F valIdent f. 0ans la fIgure J, nous explIcItons
cette notIon de fermeture quI apparat des que nous avons un ensemble
InItIal de df et un ensemble de regles de manIpulatIon de l'ensemble InItIal.
l est alors Important de dtermIner ce que nous pouvons produIre partIr
de l. 0ans les jeux tlvIss ou les concurrents doIvent dtermIner un
nombre donn partIr d'un ensemble lImIt de nombres de dpart en
utIlIsant les opratIons arIthmtIques, Il s'agIt de dtermIner sI le nombre
donn est dans la fermeture de l'ensemble des nombres InItIaux. Les lIvres
sont dans la fermeture des mots du dIctIonnaIre, structurs par les regles de
grammaIre.
La fermeture d'un ensemble de df F doIt tre dtermIne par les Instances
des relatIons valIdant F.
Exemple: soIt le schma S(F;[A, 8, C],[A 8, C]
Le tableau suIvant exprIme toutes les df possIbles pour le schma S. Pour le
remplIr, nous avons utIlIs les raIsonnements suIvant:
ouIIdentIt: par dfInItIon XX
ouIcontenu: par dfInItIon XY est vraI sI Y est contenu dans X
noncontreexemple: l'Instance du contreexemple vrIfIe la df du
schma maIs ne vrIfIe pas la df du tableau, par exemple
a b c
a' b' c
a'' b c''
ouIdf: La df du tableau peut tre dfInIe partIr de la df du schma,
par exemple AC 8 car on a dj A 8
C 8 8C A AC A8 A8C
C DU
0ENTTE
NDN
CDNTFEEX
NDN
CDNTFEEX
NDN
CDNTFEEX
NDN
CDNTFEEX
NDN
CDNTFEEX
NDN
CDNTFEEX
8 NDN DU NDN NDN NDN NDN NDN
214 Modeliser et realiser une BD
CDNTFEEX 0ENTTE CDNTFEEX CDNTFEEX CDNTFEEX CDNTFEEX CDNTFEEX
8C DU
CDNTENU
DU
CDNTENU
DU
0ENTTE
NDN
CDNTFEEX
NDN
CDNTFEEX
NDN
CDNTFEEX
NDN
CDNTFEEX
A DU0F DU0F DU0F DU
0ENTTE
DU0F DU0F DU0F
AC DU
CDNTENU
DU0F * DU0F DU
CDNTENU
DU
0ENTTE
DU0F DU0F
A8 DU0F DU
CDNTENU
DU0F DU
CDNTENU
DU0F DU
0ENTTE
DU0F
A8C DU
CDNTENU
DU
CDNTENU
DU
CDNTENU
DU
CDNTENU
DU
CDNTENU
DU
CDNTENU
DU
0ENTTE
Dn constate que le calcul de la fermeture est un travaIl fastIdIeux sI l'on doIt
passer par les Instances. Comment calculer la fermeture sans devoIr passer
explIcItement par l'ensemble des Instances de F soumIses F : Nous allons
voIr qu'Il exIste un systeme de dductIon quI partIr du schma, nous
permet de travaIller sur les df sans devoIr examIner les Instances.
Un systme de deduction
Les axIomes de Armstrong [AF|74] constItuent un systeme de dductIon. En
effet, en les applIquant sur un schma S, Il est possIble de dduIre de
nouvelles dpendances fonctIonnelles.
0fInItIon: Fegles de dductIon
SoIt un schma s=(F,F)
0F1 (rfIexIvIt):
SI X Y F
+
alors Y X est une consquence logIque de F
0F2 (augmentatIon):
SI X Y est une consquence logIque de F et Z F
+
alors XZ YZ est
une consquence logIque de F
0F3 (transItIvIt):
SI X Y et Y Z sont des consquences logIques de F alors X Z
est une consquence logIque de F
Exemple:
SoIt le schma S=(F(A,8,C) ,[A , C])
En utIlIsant 0F1, on dduIt:
0F1 A8C A , car A A8C
A8 A , car A A8
A A , car A A
A8C 8 , car 8 A88
...
En utIlIsant 0F2, on dduIt:
0F2 applIqu A 8 et 8C F
+
A8C 8C
0F2 applIqu A 8 et C F
+
AC 8C
0e U|L SQL 215
En utIlIsant 0FJ, on dduIt:
0FJ applIqu A 8 et C A C
Les df obtenues par drIvatIon peuvent leur tour tre utIlIses dans un
processus de drIvatIon
0F2 applIqu A C8 F
+
A8 8C
Ce systeme de drIvatIon nous permet donc de drIver mcanIquement de
nouvelles df. Avant de l'utIlIser, nous devons nous assurer qu'Il est valIde et
complet.
Le systeme estIl vaIIde: C'est dIre: toutes les df dduItes sontelles des
consquences logIques de F donc quI sont valIdes par les Instances de F.
Le systeme estIl compIet: C'est dIre: toutes les consquences logIques de
F sontelles des df dductIbles du systeme.
FIgure 1JJ : 7alIdIt et compltude du systeme de dductIon
Dn peut calculer la fermeture de F par deux mcanIsmes. La valIdIt et la
compltude du systeme de dductIon se proccupent de l'galIt de ces deux
fermetures.
Validite du systme de deduction
ProposItIon 1
0F1, 0F2, 0FJ sont valIdes
Preuve:
0F1 : applIquer la dfInItIon de df
X Y ssI r et r' IF ( r.X=r'.X r.Y=r'.Y)
maIs Y X donc sI r.X=r'.X on a aussI r.Y=r'.Y
0F2: par contradIctIon de XZ YZ
Par dfInItIon, on a r et r' IF tel que
1) r.XZ=r'.XZ et 1') r.YZ=r'.YZ
maIs X Y 2) r.X=r'.X et 2') r.Y=r'.Y
1) et 2) ImplIquent r.Z=r'.Z
IR
soumis
consquence
logique
F
F++ par le systme
de dduction
F++ par
la consquence
logique
o > valide
o > complet
216 Modeliser et realiser une BD
1') et 2') ImplIquent r.Z=r'.Z
on a une contradIctIon donc a bIen XZ YZ vraI
0FJ: par les dfInItIons
1) X Y r et r' IF ( r.X=r'.X r.Y=r'.Y)
2) Y Z r et r' IF ( r.Y=r'.Y r.Z=r'.Z)
maIs 1) et 2) r et r' IF ( r.X=r'.X r.Z=r'.Z) soIt la dfInItIon de X Z
Lxtension du systme de deduction
Avec les regles 0F1, 0F2 et 0FJ, on peut construIre de nouvelles regles utIles
dans la manIpulatIon des df.
ProposItIon 2
SoIt S=(F; F)
0F4 (Pseudo transItIvIt) :
sI X Y et YW Z sont des consquences logIques
alors XWZ est une consquence logIque
0F5 (UnIon) :
sI X Y et X Z sont des consquences logIques
alors X YZ est une consquence logIque
0F6 (0composItIon) :
sI X Y est une consquence logIque et Z Y
alors X Z est une consquence logIque
Preuve:
Les regles 0F5 et 0F6, nous donnent une quIvalence entre
X Y
1
Y
2
...Y
n
et
X Y
1
X Y
2
...
X Y
n
0F4:
0F2 sur X Y avec W XW YW
0FJ sur XW YW et YW Z XW Z
0F5.
0F2 sur X Y avec X 1) X XY
0F2 sur X Z avec Y 2) XY YZ
0FJ sur 1) et 2) X YZ
0F6
0F1 Z Y Y Z
0FJ sur X Y et Y Z X Z
0e U|L SQL 217
Iorme canonique de I et saturation de X
Dn dIra que F est en ]orme ccnonque sI toutes les df de F ont un seul
constItuant dans la partIe droIte
0fInItIon
SoIt le schma S=(F,F) et X F
+
alors on dIt que X
++
est la scturcton de
X
ou X
++
=[C F
+
X C F
++
]
Les constItuants de X
++
sont dtermIns par F partIr de X. Les constItuants
de X
++
s'Interpretent comme les InformatIons que l'on peut dtermIner en
connaIssant seulement X dans un schma F contraInt par F.
Sur un graphe de df, Il est possIble de dtermIner sImplement X
++
en
procdant aInsI:
1) mettre tous les noeuds de F
+
2) dessIner le graphe de F
J) marquer les noeuds de X
4) sI tous les noeuds de la partIe gauche d'une df sont marqus alors
marquer tous les noeuds de la partIe droIte
5) sI on n'a pas trouv de df pour applIquer le poInt 4) alors contInuer
en 6) sInon contInuer en 4)
6) les noeuds marqus correspondent X
++
Par analogIe, on peut voIr les df comme des vannes et les constItuants
comme des robInets quI doIvent tre ouverts pour laIsser passer le flux. Ce
flux se propage de proche en proche. La saturatIon correspond alors tous
les robInets quI sont ouverts.
Exemple: SoIt (F(A,8,C,0,E); [A , C, 80 E]
[A]
++
=[A,8,C]
[0]
++
=[0]
[A0]
++
=[A,8,C,0,E]
ProposItIon J
SoIt S=(F; F) alors X Y est dductIble Y X
++
Preuve
A B C
D E
A B C
D E
A B C
D E
218 Modeliser et realiser une BD
Completude du systme de deduction
Nous sommes maIntenant en mesure de dmontrer que notre systeme de
dductIon est complet
ProposItIon4
0F1, 0F2, 0FJ forment un systeme complet
Preuve:
La compltude sIgnIfIe f F
++
Il exIste une dductIon de F donnant f.
Ide de la preuve:
par la contrapose: on va montrer que sI X Y n'est pas drIvable de F alors, Il
exIste IF telle que toutes les df de F sont vrIfIes dans IF (1) maIs X Y ne l'est pas
ce quI ImplIque que X Y n'est pas une consquence logIque de F (2)
Dn construIt IF avec 2 entIts de la faon suIvante pour la dmonstratIon:
iR
X
++
R
+
-X
++
111...111 111...111
111...111 000...000
montrons (1)
SoIt 7 W F supposons W=[W
1
.. W
n
]
Notre Instance IF valIde 7 W sI et seulement sI 7 W
I
est vrIfIe pour chaque
I=1..n
7
WI
X
++
F
+
X
++
commun X
++
et F
+
X
++
X
++
vraI vraI vraI
F
+
X
++
non maIs
ImpossIble
vraI vraI
Le tableau prcdent analyse tous les cas possIbles de 7 et W par rapport X
++
et F
+
X
++
. Le seul cas quI est ngatIf pour IF est ImpossIble car:
7 X
++
et la proposItIon sur la saturatIon ImplIque X 7, on a aussI 7 W
I
et 0FJ
ImplIque X W
I
, en applIquant nouveau la proposItIon sur la saturatIon on a W
I
X
++
(on n'est plus dans la case que l'on analysaIt). CecI rend donc ImpossIble le cas
ngatIf.
Dn vrIfIe bIen 7 W dans tous les cas.
montrons (2)
) X Y et 0F6 (dcomposItIon)
Y
I
Y , X Y
I
par dfInItIon de la saturatIon Y
I
Y ,Y
I
X
++
)Y X
++
Y
I
Y ,Y
I
X
++
par dfInItIon de la saturatIon X Y
I
Y
I
Y , X Y
I
et 0F5 (unIon) on a X Y
0e U|L SQL 219
X Y n'est pas dductIble ImplIque X Y n'est pas une consquence logIque de F
la proposItIon sur la saturatIon donne (X Y) (Y X
++
)
, Il exIste r et r' dans IF
tels que r.X=r'.X et r.Y=r'.Y. EffectIvement XX
++
et YF
+
X
++
donc r et r' sont les 2
entIts notre Instance IF, nous avons donc que X Y n'est pas une consquence
logIque de F
Thoreme:
Les regles 0F1, 0F2 et 0FJ constItuent un systeme valIde et complet
Preuve:
Lquivalence,
couverture et irredondance de I
A partIr de maIntenant, la questIon de savoIr sI une df a t obtenue par le
concept de drIvatIon ou par le concept de consquence logIque perd de son
Importance car ce thoreme nous assure de l'quIvalence des concepts
FIgure 1J4 : quIvalence entre les deux concepts permettant d'obtenIr la
fermeture de F
La fermeture de F est un ensemble tres volumIneux quI comporte toutes les
df possIbles. CertaInes de ces df peuvent tre lImInes car elles sont
redondantes. La redondance dans la partIe droIte est lImIne par la notIon
de forme canonIque quI assure qu'Il n'y a qu'un seul constItuant dans la partIe
droIte. La redondance dans la partIe gauche est lImIne par la notIon de
dpendcnce lmentcre.
0fInItIon:
Une dpendance fonctIonnelle X Y est lmentaIre s'Il n'exIste pas
X X' tel que X' Y
Exemple:
SoIt S=(F(A,8,C);[A , C])
F
++
=[ A , df lmentaIre
A8 , df non lmentaIre
A8C , df non lmentaIre
... ]
IR
soumis
consquence
logique
F
F++ par le systme
de dduction
F++ par
la consquence
logique
|
SI la dcomposItIon est totale, on peut alors ne plus faIre de dIffrence
entre la relatIon et sa dcomposItIon. En utIlIsant une base de donnes ou
les InformatIons sont stockes dans des tables correspondant une
dcomposItIon total d
F
, on ne perd aucune InformatIon par rapport une
seule table correspondant F et contraInte par F.
Comment tester une dcomposItIon sans passer par les Instances de la
relatIon :
1ester si une decomposition est totale
SoIt les parametres
R
+
={C
1
,C
2
, ..., C
n
}
F un ensemble de df
d
R
={R
1
,R
2
, ..., R
k
}
Total(R
+
,F,d
R
) -- Algorithme de test [ULL82]
-- initialiser un tableau t de k lignes et n colonnes
si C
j
R
i
+
alors t
ij
C
j
sinon t
ij
b
ij
changement vrai
tant que changement faire
changement faux
pour chaque f F faire
chercher une ligne i et une ligne j
tel que lignei[gauche(f)]=lignej[gauche(f)]
et lignei[droite(f)]lignej[droite(f)]
si trouver i et j alors
iR
iR|R1|
iR|Rn|
iR'
* projection composition
...
iR iR' (?}
0e U|L SQL 241
pour chaque C
l
droite(f) faire
-- l un indice de colonne
si t
il
=C
l
alors t
jl
C
l
sinon t
il
t
jl
changement vrai
refaire
refaire
refaire
si une ligne est remplie de C
i
alors total vrai
sinon total faux
fin total
Exemple: Hotel
Nous avons prIs les abrvIatIons suIvantes:
NCL NumClIent
N Nom
P Prenom
A Adresse
NCH NumChambre
PX PrIx
C Confort
E EquIpement
L NbrLIt
0A 0ateArr
00 0ate0ep
F=Hotel(NCL,N,P,A,NCH,PX,C,E,L,0A,00)
dF=[ F
1
=ClIents(NCL,N,P,A)
F
2
=Chambres(NCH,PX,C,E,L)
F
J
=FservatIon(NCL,NCH,0A,00)]
F=[ f
1
=NCL N,P,A
f
2
=NCH PX,C,E,L
F
J
=NCL NCH 0A 00]
En suIvant l'algorIthme on obtIent le tableau InItIal suIvant:
1 2 3 4 5 6 7 8 9
NC
L
N P A NC
H
PX C E L DA DD
R
1
NC
L
N P A b
15
b
16
b
17
b
18
b
19
b
1
b
1
R
2
b
21
b
22
b
23
b
24
NC
H
PX C E L b
2
b
2
R
3
NC
L
b
32
b
33
b
34
NC
H
b
36
b
37
b
38
b
39
DA DD
242 Modeliser et realiser une BD
Dn cherche applIquer une df dont la partIe gauche exIste dans deux lIgnes
et dont la partIe droIte n'exIste pas dans ces deux lIgnes
avec f1 on a gauche(f
1
)=NCL et droIte(f
1
)=[N,P,A]
les lIgnes 1 et J sont gales pour NCL
la lIgne J est modIfIe selon l'algorIthme de la faon suIvante pour N,P,A:
1 2 3 4 5 6 7 8 9
NC
L
N P A NC
H
PX C E L A DD
R
1
NC
L
N P A b
15
b
16
b
17
b
18
b
19
b
1
b
1
R
2
b
21
b
22
b
23
b
24
NC
H
PX C E L b
2
b
2
R
3
NC
L
N P A NC
H
b
36
b
37
b
38
b
39
DA DD
avec f2 on a gauche(f
2
)=NCHet droIte(f
2
)=[PX,C,E,L]
les lIgnes 2 et J sont gales pour NCH
la lIgne J est modIfIe selon l'algorIthme de la faon suIvante pour PX,C,E,L:
1 2 3 4 5 6 7 8 9
NC
L
N P A NC
H
PX C E L DA DD
R
1
NC
L
N P A b
15
b
16
b
17
b
18
b
19
b
1
b
1
R
2
b
21
b
22
b
23
b
24
NC
H
PX C E L b
2
b
2
R
3
NC
L
N P A NC
H
PX C E L DA DD
La lIgne J est complete donc d
F
est totale
Cet algorIthme nous donne en plus l'ordre de joInture des relatIons. Nous
avons utIlIs les lIgnes 1 et J et ensuIte la lIgne 2. Nous avons donc
(F
1
*F
J
)*F
2.
.
En utIlIsant une base de donnes ou les InformatIons sont stockes dans des
tables correspondant une dcomposItIon totale d
F
, on ne perd aucune
InformatIon par rapport une seule table correspondant F et contraInte
par F.
En examInant l'algorIthme de plus pres, on constate que deux relatIons sont
composables sI elles possedent en commun la partIe gauche d'une df et que
la projectIon de cette df est contenue dans l'une des deux. Cette proprIt
est connue sous le nom du thoreme de dcomposItIon.
Thoreme: dcomposItIon bInaIre
SoIt d
F
=[F
1
,F
2
] une dcomposItIon de (F;F).
0e U|L SQL 24J
F
1
,F
2
est une dcomposItIon totale sI et seulement sI
(F
1
+
F
2
+
) (F
1
+
F
2
+
) F
++
ou (F
1
+
F
2
+
) (F
2
+
F
1
+
) F
++
preuve:
R
1
R
2
R
1
-R
2
R
2
-R
1
R
1
C ... C C ... C b ...b
R
2
C ... C b ...b C ... C
Ce thoreme nous permet de concevoIr un algorIthme de dcomposItIon
bInaIre quI nous permet de chercher les dcomposItIons totales d'une
relatIon. Pour cela nous utIlIsons les df du schma pour couper les relatIons
en deux.
Dcomposition_de(R,F)
DR R
nouveau vrai -- si on a trouv une dcomposition
tant que nouveau faire
nouveau faux
pour chaque r DR faire
pour chaque f F faire
-- df strictement contenue dans r
si (r
+
gauche(f) droite(f))
alors -- on substitue r les deux relations
-- formes partir de f
DR DR - r
DR DR ( gauche(f) droite(f))
DR DR ( r
+
- droite(f))
nouveau vrai
finsi
refaire
refaire
refaire
Dcomposition_de(R,F) DR
fin Dcomposition_de
En utIlIsant l'algorIthme sur HDTEL, on retrouve la dcomposItIon que l'on a
utIlIse.
astuce de la preuve: utIlIser l'algorIthme pour tester sI une dcomposItIon est
totale avec la table suIvante:
Dn voIt que la seule faon de complter la lIgne 1 ou 2 correspond bIen l'exIstence
d'une des deux df nonces dans le thoreme.
244 Modeliser et realiser une BD
FIgure 15J : dcomposItIon de l'exemple HDTEL
Pour applIquer cet algorIthme, on part avec une base Irredondante de F.
0ans le cas ou Il exIste des cycles, Il exIstera plusIeurs dcomposItIons
possIbles car Il exIste plusIeurs bases possIbles. Le choIx de l'une ou l'autre
dpend du champ d'applIcatIon et du contexte d'utIlIsatIon.
Preservation des df
La questIon est de savoIr sI les dpendances fonctIonnelles F quI taIent
ImplIques par les Instances de IF sont toujours ImplIques par les Instances
IF
j
(et leur composItIon) de la dcomposItIon d
F
.
FIgure 154 : Les df sontelles encore la consquence logIque pour la
dcomposItIon :
0fInItIons:
La projectIon de F sur un ensemble Z de constItuants
F[Z]=[X Y F
++
XY Z]
Dn dIra que la dcomposton d
R
prserve F sI l'unIon des F[F
I
] est une
couverture de F soIt:
( F[F
I
])
++
= F
++
Dn veut pouvoIr vrIfIer que F est prserve dans les IF
j
sans devoIr recourIr
leur composItIon. Les df doIvent donc tre localement valIdes par les
Instances des relatIons de la dcomposItIon
Exemple:
7Ille = 7, Fue = F, Numro postal = N
F=(F7N)
F=[7F N, N 7]
(NCL,N,P,A,NCH,PX,C,E,L,DA,DD)
(NCL,N,P,A)
(NCL,NCH,PX,C,E,L,DA,DD)
(NCH,PX,C,E,L)
(NCL,NCH,DA,DD)
NCL -> N P A
NCH -> PX C E L
dependances
Ionctionnelles
iR idRiR1,iR2,..., IRn}
Valide
composition
projection
Equivalence des contraint es ?
0e U|L SQL 245
Cette dcomposItIon est totale
car ([7N] [FN]) ([7N] [FN])
N 7 est une df de F
SoIt les Instances suIvantes:
i(VN) i(RN)
7 N F N
Ceneve 1207 12 rue du Lac 1207
Ceneve 1205 12 rue du Lac 1205
Calculons les df projetes:
F[7N] = [N 7]
+
F[FN] = []
+
I(7N) et I(FN) satIsfont les df des F projetes. |aIs I(7N)*I(FN) ne
satIsfaIt plus F malgr la dcomposItIon totale car F7 N n'est pas
vrIfIe
I(7N)*I(FN)
7 F N
Ceneve 12 rue du Lac 1207
Ceneve 12 rue du Lac 1205
La proprIt de dcomposItIon totale et de prservatIon des df sont des
proprIts Indpendantes.
1ester la preservation des df
Soit (R;F) et d
R
R
1
,R
2
, ..., R
k
}, en theorie, il Iaut:
1) calculer F
++
2) projeter F
++
sur chaque F
I
J) unIon des F[F
I
] = C
4) calculer la fermeture de cette unIon C
++
5) tester l'galIt de F
++
et C
++
Fappelons que calculer F
++
est de complexIt exponentIelle, par exemple:
pour F=[X
0
X
1
,X
0
X
2
, ... ,X
0
X
n
]
on a X
0
2
[X0,X1,X2, ... ,Xn]
F
++
L'Ide de l'algorIthme quI suIt rsIde dans le faIt que pour XY
F sI C taIt
connu alors Il suffIraIt de tester sI Y X
++
pour C.
l reste trouver comment calculer X
++
sans calculer C. CecI est possIble en
restreIgnant la saturatIon de X la projectIon de chaque F
I
lors du calcul (on
lImIne tout ce quI dpasse!)
Algorithme: test de la prservation des df
246 Modeliser et realiser une BD
Paramtres de Prservation (d
R
,F):
R
+
={C
1
,C
2
, ..., C
n
}
F un ensemble de df
d
R
={R
1
,R
2
, ..., R
k
}
Prservation (d
R
,F)
pour chaque f F faire
Z gauche(f)
tant que changement de Z faire
pour i=1 k faire
Z Z (saturation(Z R
i
+
) R
i
+
)
refaire
refaire
si droite(f) pas contenu dans Z
alors Prservation (d
R
,F) non
fin si
refaire
Prservation (d
R
,F) oui
fin prservation
exemple: test prservatIon
F=(F7N), d
F
=[F1=(7N), F2=(FN)]
F=[7F N, N 7]
les saturatIons utIlIses dans l'algorIthme sont:
7F
++
=[7FN]
N
++
=[N7]
F
++
=[F]
InItIalIsatIon
Z gauche(7F N)=7F
ItratIon avec F1
((7FFN)
++
FN)7F
=(F
++
FN)7F
=F7F
=7F
ItratIon avec F2
V
R N
R2
R1
0e U|L SQL 247
((7F7N)
++
7N)7F
=(7
++
7N)7F
=77F
=7F
Z n'a pas t modIfI
Dn a pas droIte(f)=N 7F, donc les df ne sont pas prserves
Inclusion des df dans les Ri
0ans l'exemple Hotel, la saturatIon des df (partIe gauche) peut tre
entIerement calcule l'IntrIeur d'un lment de la dcomposItIon. La
partIe gauche sera donc contenue dans la saturatIon.
FIgure 155 : Les df sont toutes contenues dans les relatIons de la
dcomposItIon
Dn peut donc noncer la proposItIon
ProposItIon:
SoIt une dcomposItIon d
F
et les df F.
SI f F, F
I
d
F
telle que gauche(f) droIte(f) F
I
alors d
F
prserve F
Llimination des anomalies de mise jour
Une anomalIe de mIse jour est mIse en vIdence dans un schma lorsque
l'excutIon d'une prImItIve de modIfIcatIon sur une relatIon pour une entIt
n'a pas l'effet dsIr. Une premIere modlIsatIon de Hotel (ChapItre J) taIt:
Htel(NumChambre, NumClient, Nom, Prenom, Adresse,
Prix, NbrLit, NbrPers, DateArr, DateDep, Confort,
Equipement)
Cette modlIsatIon accumule toutes les anomalIes de mIse jour:
lors de la cratIon d'une entIt, Il est possIble d'IntroduIre une entIt
quI respecte la dpendance InduIte par la cl de la relatIon, maIs quI
n'en valIde aucune autre.
NCL
N
P
A
DA DD
NCH
PX
C
E
L
248 Modeliser et realiser une BD
lors de la suppressIon d'une entIt, Il est possIble que pour supprImer
un clIent, Il soIt ncessaIre de dtruIre d'autres entIts faIsant
rfrence celuIcI. 0e plus, la suppressIon d'un clIent peut aussI
entraner la suppressIon de la dfInItIon d'une chambre.
lors de la mIse jour d'une entIt, Il est possIble que pour mettre
jour une InformaIton, Il soIt ncessaIre de mettre jour d'autres
entIts faIsant rfrence cellecI .
0ans la deuxIeme modlIsatIon propose: Aucun de ces effets n'apparat:
Chambres(NumChambre, Prix, NbrLit, NbrPers, Confort,
Equipement)
Clients(NumClient, Nom, Prenom, Adresse)
lors de la cratIon d'une entIt, sI elle respecte les df InduItent par la
cl de la relatIon alors elle valIde toutes les autres df du schma.
lors de la suppressIon d'une entIt, l'objet est supprIm sans effet de
bord.
lors de la mIse jour, une seule entIt est affecte.
Les anomalIes de mIse jour sont synonymes de redondance de
l'InformatIon. 0ans les bonnes dcomposItIons, une entIt ne doIt pas
contenIr plusIeurs objets ayant des exIstences Indpendantes. L'absence de
dpendance transItIve et de dpendance partIelle traduIt cette bonne
proprIt.
Les Formes Normales remdIent (en partIe) ces anomalIes
Jer forme normale JNI
L'objectIf de la 1NF est de sImplIfIer la structure d'une relatIon en lImInant
les structures Internes
0fInIon : 1NF
Une relatIon est en 1NF sI tous les constItuants sont atomIques.
La 1NF vIte donc la confusIon entre le constItuant et la relatIon. Un
constItuant atomIque ne peut pas avoIr une structure Interne (vecteur,
enregIstrement, champ rptItIf, poInteur)
0ans un langage de programmatIon structur, nous avons pour dclarer un
fIchIer d'employs le code suIvant:
date = record of
jour : 1..31;
mois : 1..12;
anne: 1900..2100;
end;
enfant = record of
prnom: char(20);
datenaiss : date;
end;
0e U|L SQL 249
pntpersonne = ^personne;
personne = record of
nom: char(20);
sexe : (F,M);
pere: pntpersonne ;
mere: pntpersonne ;
end;
employ = record of
nom,prenom: char(20);
nbenfant: 1..12;
descriptenfant: array[1..nbenfant]
of enfant;
salaire: array [1..12] of real;
end;
var fp:file of employ;
0ans la forme 1FN, pour un SC80, toutes les structures doIvent tre
dcomposes, nous avons les troIs relatIons suIvantes quI sont quIvalentes
au fIchIer fp dclar cIdessus.
Create table personne(idpers number,
nom char(20),
prnom char(20) ,
nbenfant number )
Create table salempl(idpers number,
priode number(2),
salaire number)
Create table enfant(idpers number,
prnom char(20),
jour number(2),
mois number(2),
anne number(4))
Un autre exemple de dclaratIon en pseudopascal donne:
statistiqueTrimeste = array[1900..1999,1..4] of
real;
cI, nous avons la relatIon suIvante quI chaque trImeste assocIe une entIt.
stattrim(anne,numtrimeste,valeur)
0ans ce cas, l'anne est restItue avec une trIple joInture quI peut tre
relatIvement couteuse . SI l'InformatIon trImestrIelle n'est pas exploIte de
manIere Indpendante, on peut choIsIr la relatIon suIvante:
stattrimbis(anne,trim1,trim2,trim3,trim4)
Elle est non normalIs , maIs elle peut tre plus effIcace pour certaIns
traItements.
250 Modeliser et realiser une BD
2eme forme normale 2NI
La 2NF lImIne les objets dcrIts d'une manIere dpendante par rapport
d'autres. Elle lImIne aInsI les anomalIes suIvantes:
Lors de la cratIon: on ne peut pas crer l'objet sans l'attacher un
autre
Lors de la suppressIon: elle entrane celle de celuI quI dpend de luI
Lors de la maj : la modIfIcatIon doIt tre reproduIte s'Il exIste
plusIeurs occurences de l'objet
0fInItIon: dpendcnce pcrtelle
SoIt F, X et K une cl de F, on dIt que X est une dpendance
partIelle de F sI X est contenu dans K et A n'est pas contenu dans X
0ans la FIgure 156, on peut voIr que le groupe de constItuants X et A dfInIt
un objet Indpendant. En dcompant F en F1 et F2, on lImIne la
dpendance transItIve ou:
F1 = F
+
A
F2 = X
FIgure 156 : schma de la dpendance partIelle
exemple de relatIon contenant une dpendance partIelle:
Rservation(Num_chambre, num_client, date_arrive,
date_dpart, prix)
NCL,NCH,DA -> DD
NCH -> PX
NCH est contenu dans la cl de Rservation qui est
NCL,NCH,DA
0fInIon : 2NF
Une relatIon en 1NF est en 2NF s'Il n'exIste pas de dpendance partIelle
Exemple: soIt les deux relatIons suIvantes et leurs df
Commande(NoCom, NoClient, Nom, Adresse, PrixTotal)
Ligne(NoCom, NoArt, Prix, Qte, Art_total)
NoCom PrixTotal, NoClient
NoClient Nom, Adresse
NoArt Prix
NoCom, NoArt Qte
Nous avons ycuche(NoArt Prx ) cl(Lyne) donc LIgne n'est pas en 2FN
R
A X K
0e U|L SQL 251
Pour transformer le schma en 2NF Il convIent de le rcrIre comme suIt:
Commande(NoCom, NoClient, Nom, Adresse, PrixTotal)
LigneCommande (NoCom, NoArt, Qte, Art_total)
Article (NoArt, Prix)
3eme forme normale 3NI
La JNF lImIne aussI les objets dcrIts d'une manIere dpendante par
rapport d'autres.0ans ce cas, la dpendance est transItIve.
0fInItIon: dpendance transItIve
SoIt F, X et K une cl de F, on dIt que X est une dpendance
transItIve de F sI X n'est pas contenu dans K et A n'est pas contenu dans
X
0ans la FIgure 157, on peut voIr que le groupe de constItuants X et A dfInIt
un objet Indpendant. En dcomposant F en F1 et F2, on lImIne la
dpendance transItIve ou:
F1 = F
+
A
F2 = X
FIgure 157 : schma de la dpendance transItIve
Exemple de relatIon contenant une dpendance transItIve
gographie(Ville, Pays, Superficie)
Ville Pays
Pays Superficie est une df transitive
0fInIon : JNF
Une relatIon en 2NF est en JNF s'Il n'exIste pas de dpendance transItIve
Exemple: soIt les troIs relatIons suIvantes et leurs df
Commande(NoCom, NoClient, Nom, Adresse, PrixTotal)
LigneCommande (NoCom, NoArt, Qte, Art_total)
Article (NoArt, Prix)
NoCom PrixTotal, NoClient
NoClient Nom, Adresse (1)
NoArt Prix
NoCom, NoArt Qte
Nous avons gauche(NoClIent Nom, Adresse ) quI n'est pas contenu dans la
cl(Commande) donc Commande n'est pas en JFN
R
A X K
252 Modeliser et realiser une BD
Pour transformer le schma en JNF Il convIent de le rcrIre comme suIt:
Commande(NoCom, NoClient, PrixTotal)
Client (NoClient, Nom, Adresse)
LigneCommande (NoCom, NoArt, Qte, Art_total)
Article (NoArt, Prix)
Iorme normale Boyce-Codd (BCIN)
0ans cette forme normale toutes les partIes gauches des df d'une relatIon
contIenne une cl
0fInItIon 8CFN
Dn dIt que le schma (F;F) est en 8CFN sI pour X une dpendance
valIder sur F telle que A n'est pas contenu dans X alors on a K une cl de
F contenue dans X.
Exemple de relatIon quI n'est pas en 8CNF:
R=(RVN)
F={VR N, N V}
F n'est pas en 8CFN, car N 7 est valIder et N ne contIent pas de cl (cl
de F est 7F)
La 8CFN est une forme (trop) contraIgnante car on ne peut pas toujours
trouver pour F et F une dcomposItIon dont les schmas ont sImultanment
les proprIts de 8CFN, de dcomposItIon totale et de prservatIon des df.
Exemple: soIt les relatIons suIvantes et leurs df
Commande(NoCom, NoClient, PrixTotal)
Client (NoClient, Nom, Adresse)
LigneCommande (NoCom, NoArt, Qte, Art_total)
Article (NoArt, Prix)
NoCom PrixTotal, NoClient
NoClient Nom, Adresse
NoArt Prix
NoCom, NoArt Qte
La dcomposItIon est en 8CNF
Cependant en ajoutant
prix , Qte Art_total
0ans les df projetes sur LIgneCommande , on a la df:
NoArt, Qte Art_total
dont la partIe gauche NoArt, Qte ne contIent pas de cl de
LIgneCommande , donc LIgneCommande n'est pas en 8CNF
A l'extreme LIgneCommande doIt tre dcompose en
LigneCommande (NoCom, NoArt, Qte)
0e U|L SQL 25J
Table_multiplication(Prix, Qte, Art_total)
Nous verrons dans le chapItre suIvant que les vues permettent d'vIter une
telle extrmIt; la df prIx , Qte Art_total exprIme en faIt une dpendance
de calcul.
La 3IN une relaxation de la BCIN
Une dfInItIon quIvalente de la JFN permet de voIr que la JFN est une
relaxatIon de la 8CFN.
0fInItIon: constItuant premIer
Nous dIrons qu'un constItuant C est premIer s'Il appartIent une cl
sInon Il est nonpremIer.
0fInItIon 2 : JFN
Dn dIt que le schma (F;F) est en JFN sI pour X une dpendance
valIder sur F telle que A n'est pas contenu dans X alors on vrIfIe une
des deux condItIons suIvantes:
1) Il exIste K une cl de F contenu dans X
2) A est premIer
La condItIon 1 est IdentIque celle de la 8CFN. La JFN est donc bIen une
relaxatIon des contraIntes JFN. 0onc toutes les relatIons 8CFN sont en JFN
JFN.
FIgure 158 : mbrIcatIons des formes normales
Les moyens de ne pas tre en JFN sont donc:
La 1FN: spcIfIe qu'un constItuant ne soIt pas un schma F
la 2FN: X est un sousensemble strIct d'une cl
on dIt que X A est une dpendance partIelle
la JFN: X est sous ensemble d'aucune cl
on dIt que X A est une dpendance transItIve
Sans entrer dans les dtaIls, nous dIrons qu'Il exIste toujours une
dcomposItIon (ou plusIeurs sI le graphe des df a des cycles) quI possede
sImultanment les troIs proprIts que nous avons examInes (totale,
prserve les df et JFN). Par contre, le trIplet (total, prserve les df et 8CFN)
peut tre vIde.
Notre objectIf n'tant pas de faIre de la conceptIon, nous ne donnons pas
d'exercIce sur la dcomposItIon. ToutefoIs le lecteur peut constater que
pratIquement toutes les modlIsatIons des tudes de cas sont en JFN et
possedent les bonnes proprIts de la dcomposItIon totale et de la
1FN
2FN
3FN
plus constituantrelation
plus de dI partielle
plus de dI transitive
254 Modeliser et realiser une BD
prservatIon des dpendances fonctIonnelles (quand cela n'est pas le cas,
une questIon y faIt rfrence).
FIgure 159 : nterdpendances des proprIts sur la dcompsItIon
Decomposition
Totale
Preservation
des DF
3FN
BCFN
toujours
non-vide
peut tre
vide
0e U|L SQL 255
J6. Vues
"Le rve semblait toujours si vivant, si exact, moins
distorsion du rel que simulacre, illusion si riche en dtails
de la vie veill que Nashe ne souponnait jamais qu'il tait
en train de rver." Paul Auster - La musique du hasard
Jusqu' prsent, une relatIon taIt toujours assocIe une Instance quI
stockaIt physIquement les entIts. Une vue permet de dclarer un schma de
relatIons quI est dfInI partIr d'autres relatIons (ou ventuellement d'autres
vues). L'Instance d'une vue est value au moment ou elle est utIlIse dans
une requte; une vue ne possede donc pas d'Instance physIque.
CecI permet de crer des redondances logIques dans le schma sans InduIre
pour autant des anomalIes de mIse jour. Par contre, une vue devant tre
rvalue chaque foIs que l'on s'y rfere, cela peut entraner une
dImInutIon de performance dans certaIns cas.
FIgure 161 : FcIture de la requte SQL
Le modele d'excutIon d'une requte SQL doIt tre complt, par un module
de rcrIture de la requte quI substItue lexIcalement les termes de la
requte par ceux de la vue (parfoIs, c'est l'Inverse quI est pratIqu). Au
mInImum, nous avons les substItutIons suIvantes:
a) l'IdentIfIcateur de la vue dans la clause FROM de la requte est
substItu par les IdentIfIcateurs spcIfIs dans la clause FROM de la
vue.
b) les colonnes de la vue sont substItues par les expressIons
spcIfIes dans la clause SELECT de la vue.
c) la clause WHERE de la vue est ajoute la clause WHERE de la
requte.
d) 0ans les cas les plus sImples, la clause GROUP BY de la vue est
ajoute la requte (ce type de cas est problmatIque comme on le
verra plus loIn).
ExamInons un cas, soIt la vue et la requte suIvante:
requte
Rcriture de la requte en
termes de relation
Modle de la machine SQL figure 4 chapitre 5
Dfinitions des vues
256 Modeliser et realiser une BD
CREATE VIEW Chambre_avec_tv_2
(Num_chambre, prix_par_pers)
AS SELECT num_chambre,prix/nbr_pers
FROM Chambres
WHERE equipement='TV';
SELECT num_chambre, prix_par_pers
FROM Chambre_avec_tv_2
WHERE num_chambre=44;
L'applIcatIon de la regle a) donne:
SELECT num_chambre, prix_par_pers
FROM Chambres
WHERE num_chambre=44;
L'applIcatIon de la regle b) donne:
SELECT num_chambre, prix/nbr_pers
FROM Chambres
WHERE num_chambre=44;
L'applIcatIon de la regle c) donne:
SELECT num_chambre, prix/nbr_pers
FROM Chambres
WHERE num_chambre=44
AND equipement='TV';
C'est la requte que nous aurIons crIt sI la vue n'exIstaIt pas.
Vues en SQL
La clause CREATE-VIEW permet d'assocIer un schma de vue une requte.
CFEATE7EW
Par dfaut, le schma de la vue est celuI de la requte. Les noms et les
types des colonnes sont ceux quI apparaIssent dans la clause de projectIon
de la requte.
Exemple: Une vue dfInIe pour les chambres ayant une T7 :
CREATE VIEW Chambre_avec_tv_1
AS SELECT *
FROM Chambres
WHERE equipement='TV';
En Interrogeant la vue on obtIent:
SELECT * FROM Chambre_avec_tv_1;
l est aussI possIble de donner un nom chaque colonne de la vue en les
mentIonnant apres le nom de la vue.
0e U|L SQL 257
CREATE VIEW Chambre_avec_tv_2
(Num_chambre, prix_par_pers)
AS SELECT num_chambre,prix/nbr_pers
FROM Chambres
WHERE equipement='TV';
En Interrogeant la vue on obtIent:
SELECT * FROM Chambre_avec_tv_2;
0ans l'exemple suIvant, on cre une vue quI correspond l'agrgatIon des
prIx moyens.
CREATE VIEW Prix_moyen_par_confort
(confort, prix_moyen)
AS SELECT confort, avg(prix)
FROM Chambres
GROUP BY confort;
SELECT * FROM Prix_moyen_par_confort;
Normalement l'ImplmentatIon des vues consIste en une rcrIture de la
requte utIlIsant la vue, donc les deux requtes suIvantes devraIent tre
Illgales, comme le soulIgne C.J. 0ate [0AT87]. Cependant le SC80 Dracle
(que l'on utIlIse pour tester les requtes de ce lIvre) les accepte. CecI
s'explIque par le faIt que pour ces cas, Il cre temporaIrement une table
correspondant la vue.
Cette partIcularIt est premIere vue tres pratIque, maIs dans certaIns cas
elle peut pnalIser fortement la performance de l'excutIon. Surtout dans le
cas de joInture sur une vue agrge car les optImIsatIons quI peuvent
normalement s'effectuer ne sont plus possIbles et le systeme doIt valuer et
stocker temporaIrement la vue chaque appel.
SELECT * FROM Prix_moyen_par_confort
WHERE prix_moyen>100;
13
SELECT avg(prix_moyen) FROM Prix_moyen_par_confort;
14
Les modIfIcatIons travers une vue sont restreIntes aux vues quI n'utIlIsent
pas les opratIons suIvantes:
La joInture
Les agrgatIons (GROUP BY)
Les connexIons (connect by)
La clause distinct
0ans le cas de colonnes rsultats d'expressIon, ces dernIeres ne peuvent pas
tre mIses jour. Tous ces cas sont IndtermIns, car Il correspondent la
modIfIcatIon , partIr d'une valeur, de plusIeurs ranges ou de plusIeurs
colonnes d'une table. SI une colonne est absente dans la table de rfrence
alors elle prend la valeur null.
1J
La rcrIture devraIt donner where avg(prix)>100, ce quI est InterdIt car on doIt
utIlIser la clause having
14
cI on devraIt avoIr avg(avg(prix)), ce quI n'a pas de sens.
258 Modeliser et realiser une BD
La clause with check option permet de spcIfIer que les modIfIcatIons
sont faItes l'IntrIeur de l'Instance de la vue. C'est dIre qu'une slectIon
travers la vue doIt pouvoIr slectIonner le rsultat de la modIfIcatIon (Dn
peut donner un nom cette contraInte).
Exemple: la mIse jour de la colonne quIpement faIt sortIr la range du
l'Instance de la vue.
insert into Chambre_avec_tv_1
(num_chambre,prix,nbr_lits,
nbr_pers,confort,equipement)
values(99,100,2,2,'BAIN','TV');
update Chambre_avec_tv_1
set equipement='VD'
WHERE num_chambre=99;
delete FROM Chambre_avec_tv_1;
Crons une vue sImIlaIre avec la clause de vrIfIcatIon d'appartenance la
vue et soumettons les mmes modIfIcatIons.
CREATE VIEW Chambre_avec_tv_1_valide
AS SELECT *
FROM Chambres
WHERE equipement='TV'
with check option constraint valide_la_vue;
insert into Chambre_avec_tv_1_valide
(num_chambre,prix,nbr_lits,
nbr_pers,confort,equipement)
values(99,100,2,2,'BAIN','TV');
update Chambre_avec_tv_1_valide
set equipement='VD'
WHERE num_chambre=99;
delete FROM Chambre_avec_tv_1_valide;
L'execution de la mise a jour a ete rejetee car elle viole notre contrainte d'integrite.
Multiplier les representations logiques
Nous donnons un certaIn nombre de cas ou les vues sont utIles. L'Ide central
tant de crer une Indpendance logIque entre le schma de la base de
donnes et les applIcatIons quI l'utIlIsent. CellecI n'est pleInement ralIse
que dans le cas de l'InterrogatIon et dans un nombre de cas lImIts de
modIfIcatIon de la base.
Creer des vues contextuelles
La cratIon des vues contextuelles permet de construIre partIr d'un
ensemble de relatIons, une nouvelle relatIon. L'utIlIsateur en utIlIsant le
contexte devIent alors Indpendant des modIfIcatIons quI peuvent tre
apportes au schma sousjacent.
0e U|L SQL 259
0ans l'exemple suIvant, on cre la vue sur la relatIon unIverselle. (Elle n'est
pas quIvalente la relatIon unIverselle car elle ne prend en compte que les
entIts quI sont joIntes. Pour une dIscussIon approfondIe sur ce theme
consulter le travaIl de C. Falquet [FAL89])
CREATE VIEW hotel
(NUM_CLIENT, NOM, PRENOM, ADRESSE,
NUM_CHAMBRE, PRIX, NBR_LITS,
NBR_PERS, CONFORT, EQUIPEMENT,
DATE_ARR, DATE_DEP)
AS SELECT CLIENTS.NUM_CLIENT, NOM, PRENOM, ADRESSE,
CHAMBRES.NUM_CHAMBRE, PRIX, NBR_LITS,
NBR_PERS, CONFORT, EQUIPEMENT,
DATE_ARR, DATE_DEP
FROM CHAMBRES, CLIENTS, RESERVATIONS
WHERE Clients.num_client=Reservations.num_client
AND Chambres.num_chambre=Reservations.num_chambre
La vue hotel permet un utIlIsateur de faIre abstractIon des schmas
CHA|8FES, CLENTS, FESEF7ATDNS. Ces dernIers peuvent tre modIfIs. l
suffIt de maIntenIr une vue quIvalente pour satIsfaIre l'utIlIsateur de la vue.
Interfacer un schema
Supposons que vous ayez achet une applIcatIon 80, cellecI possede dj un
schma de relatIons. La socIt quI l'a dvelopp est susceptIble de le
modIfIer. Cependant vous aImerIez dvelopper une extensIon. Pour tre
Indpendant, Il suffIt de travaIller sur des vues du schma de l'applIcatIon.
En cas de modIfIcatIon, vous adaptez vos vues afIn de les rendre
smantIquement quIvalentes. CecI permet aussI de crer un schma traduIt
dans une autre langue peu de fraIs.
exemple: Une chane anglaIse d'hotels tend notre applIcatIon HDTEL. Elle
aura Intrt travaIller sur la vue ClIents suIvante:
CREATE VIEW Customer
(ident_cust, name, surname, address)
AS SELECT NUM_CLIENT, NOM, PRENOM, ADRESSE
FROM Clients
Creer des dependances calculees
Souvent la valeur d'un constItuant est entIerement dtermIne par de
l'InformatIon quI exIste dj dans la base de donnes. Stocker physIquement
ces InformatIons demande qu' chaque modIfIcatIon elles soIent remIses
jour, ce quI rend plus complexe les programmes de modIfIcatIon.
ExamInons le cas suIvant:
Un clIent a un nom et une adresse. Une commande est assocIe un clIent
et le prIx total de la commande est la somme des lIgnes de cette commande.
Une lIgne de commande correspond un artIcle command selon une
260 Modeliser et realiser une BD
certaIne quantIt. Le prIx total de la lIgne correspond au produIt du prIx de
l'artIcle par sa quantIt. A chaque artIcle est assocI un prIx.
Ce champ est soumIs aux dpendances fonctIonnelles suIvantes:
NoCom PrIxTotal, NoClIent
NoClIent Nom, Adresse
NoArt PrIx
NoCom, NoArt Qte
La dcomposItIon suIvante est tout faIt admIssIble:
ClIent (NoClIent, Nom, Adresse)
Commande(NoCom, NoClIent, PrIxTotal)
LIgneCommande (NoCom, NoArt, Qte, Art_total)
ArtIcle (NoArt, PrIx)
Le faIt de stocker PrIxTotal et Art_total ImplIque que les programmes de
l'applIcatIon modIfIant les lIgnes de commandes et les artIcles doIvent les
remettre jour.
Formellement on devraIt ajouter la dpendance fonctIonnelle suIvante (quI
encode la multIplIcatIon)
prIx , Qte Art_total
Dn a alors les relatIons suIvantes:
LIgneCommande (NoCom, NoArt, Qte)
CalculPrIx (PrIx, Qte, Art_total)
Les vues permettent d'vIter de telles extrmIts
Supposons le schma suIvant :
ClIent (NoClIent, Nom, Adresse)
Commande(NoCom, NoClIent)
LIgneCommande (NoCom, NoArt, Qte)
ArtIcle (NoArt, PrIx)
CREATE VIEW
LigneCommAvecPrix(NoCom, NoArt, Qte, Art_total)
AS SELECT Nocom, a.NoArt, Qte, Prix*Qte
FROM lignecommande a, article b
WHERE a.NoArt=b.NoArt
CREATE VIEW
CommAvecPrix (NoCom, NoClient, PrixTotal)
AS SELECT b.Nocom, NoClient, sum(Art_total)
FROM lignecommande a, Commande b
WHERE a.NoCom=b.NoCom
GROUP BY b.Nocom, NoClient
Dn a lImIn les constItuants calculs des relatIons stockes. Par contre, on
a spcIfI des vues quI permettent tout moment de les recalculer.
Nous retrouvons la dualIt de la redondance contre l'valuatIon, l'une avec
son cout en complexIt accrue de programmatIon (la place physIque n'tant
0e U|L SQL 261
plus gnralement l'argument prIncIpal) contre un cout en ressource de
calcul (dIrectement lI la performance)
Deduire de l'information
A partIr d'un ensemble de faIts et d'un ensemble de regles de dductIon, Il
est possIble de produIre de nouvelles InformatIons. La programmatIon
logIque, exprIme formellement par les clauses de Horn (voIr l'ouvrage de F.
KowalskI [KDW79]), permet de dfInIr de telles regles de dductIon. Le
langage de programmatIon PFDLDC [CLD81] est une ImplmentatIon de
cette approche dductIve. Les bases de donnes relatIonnelles peuvent tre
consIdres comme un cas partIculIer de la programmatIon logIque. Les faIts
sont reprsents par les entIts et les requtes sont des clauses logIques
dont les rponses sont des InterprtatIons possIbles. 0ans ce contexte, les
vues peuvent tre perues comme des regles de dductIon (la lImIte tant
que l'on ne peut pas exprImer des regles rcursIvement)
ExamInons l'exemple classIque de l'arbre gnalogIque. SoIt les deux
relatIons suIvantes. Les personnes sont IdentIfIes par un nom et assocIes
un sexe. La relatIon CEN dtermIne que le parent est un des gnIteurs de
l'enfant.
CREATE TABLE pers(nom char(20),
sexe char(1));
CREATE TABLE geni(parent char(20),
enfant char(20));
Nous avons entr les donnes suivantes:
A partIr de ces donnes, nous aImerIons poser les questIons:
quI est la soeur de ... :
quI sont les grandparents ... :
quI est le cousIn de ... :
quI est l'anctre de ... :
Les vues suIvantes rpondent ces questIons:
CREATE VIEW femme
AS SELECT nom
FROM pers
WHERE sexe='F';
CREATE VIEW homme
AS SELECT nom
FROM pers
WHERE sexe='H';
CREATE VIEW pere_de
AS SELECT parent pere
15
,enfant
FROM geni,homme
WHERE geni.parent=homme.nom;
15
L'utIlIsatIon d'un alIas permet de renommer la colonne de la vue
262 Modeliser et realiser une BD
CREATE VIEW mere_de
AS SELECT parent mere,enfant
FROM geni,femme
WHERE geni.parent=femme.nom;
CREATE VIEW soeur_de
16
AS SELECT a.enfant soeur,b.enfant nom
FROM geni a,geni b,femme
WHERE a.parent=b.parent
AND a.enfant=femme.nom
AND a.enfant<>b.enfant
17
;
CREATE VIEW frere_de
AS SELECT a.enfant frere,b.enfant nom
FROM geni a,geni b,homme
WHERE a.parent=b.parent
AND a.enfant=homme.nom
AND a.enfant<>b.enfant;
CREATE VIEW grandpere_de
AS SELECT a.pere grandpere,b.enfant petitenfant
FROM pere_de a,geni
18
b
WHERE a.enfant=b.parent;
CREATE VIEW grandmere_de
AS SELECT a.mere grandmere,b.enfant petitenfant
FROM mere_de a,geni b
WHERE a.enfant=b.parent;
CREATE VIEW grandparent_de(grandparent, petitenfant)
AS SELECT grandpere, petitenfant
FROM grandpere_de
union
SELECT grandmere, petitenfant
FROM grandmere_de;
Nous pouvons faire un test sur nos donnes.
SELECT distinct * FROM soeur_de
WHERE nom='jacques';
SELECT distinct * FROM grandparent_de
WHERE petitenfant='amlie';
La questIon des anctres est plus dlIcate car elle faIt IntervenIr la notIon de
rcursIvIt. C'est dIre:
X anctre de Z sI
1)X est le gnIteur de Z
ou bIen 2) sI X est anctre de Y et Y est le gnIteur de Z
Dn constate que l'on peut applIquer nouveau la dfInItIon d'anctre dans la
condItIon 2). En toute gnralIt, Il n'est pas possIble de crer des vues
16
AussI les demIsoeurs
17
Cette condItIon InterdIt que l'on soIt la soeur de soImme.
18
En remplaant CEN par PEFE_0E, on a le grand pere parternel
0e U|L SQL 26J
rcursIves. Au plus, on peut dplIer la dfInItIon et crer une vue de
gnIteur(gnIteur(gnIteur( ....)))) en joIgnant plusIeurs foIs la relatIon
CEN. Cependant, l'extensIon CDNNECT 8Y au standard SQL permet de rendre
rcursIves certaInes requtes.
La sousrequte de la vue ancetre_de calcule les descendants de A. La
dfInItIon d'anctre devIent alors: A est anctre de 8 sI 8 est dans les
descendants de A.
CREATE VIEW ancetre_de
AS SELECT a.nom ancetre,b.nom descendant
FROM pers a, pers b
WHERE b.nom in (SELECT enfant FROM geni
connect by prior enfant=parent
start with parent=a.nom);
SELECT * FROM ancetre_de
WHERE descendant='amlie';
Pour termIner cet exemple on peut se poser la questIon de savoIr sI deux
personnes ont des anctres communs.
CREATE VIEW meme_famille(dans_la, de)
AS SELECT a.descendant,b.descendant
FROM ancetre_de a, ancetre_de b
WHERE a.ancetre=b.ancetre;
SELECT * FROM meme_famille
WHERE dans_la='amlie' AND de='eliot';
SELECT * FROM meme_famille
WHERE dans_la='amlie' AND de='nolwenn';
Le nombre de rponses correspond aux sIx anctres communs.
Nous voyons que l'IntroductIon des vues dpasse le cadre de la
reprsentatIon des donnes. Elles permettent de construIre, au dessus des
faIts, des regles structures sur les lIens smatIques exIstant entre ces faIts
et aInsI de dduIre de nouvelles InformatIons.
Lxercices
Les deux exercices suivants sont destines a montrer la puissance des vues.
Le jeu des trois des
Soit le de modelise de la Iaon suivante:
CREATE TABLE D (v number(1));
insert into D values(1);
insert into D values(2);
insert into D values(3);
insert into D values(4);
insert into D values(5);
insert into D values(6);
A partir de cette unique table creer des vues et des requtes aIin de:
264 Modeliser et realiser une BD
crer troIs ds Indpendants
chercher la somme pour un jet de J ds
le nombre de jets de J ds possIbles
les dIffrentes faons d'obtenIr 7 avec troIs ds
le nombre de possIbIts de jets de troIs ds assocIs chaque
somme
dresser un tableau en terme de statIstIque pour chaque somme
Produit scalaire et le produit matriciel
l est Intressant de remarquer qu'une relatIon peut facIlement reprsenter
un vecteur. La relatIon 7ect donne chaque lment le nom du vecteur
auquel Il appartIent, sa posItIon et sa valeur
CREATE TABLE vect(nomvect char(10),
i number(3),
value number);
AInsI les vecteurs 7=(1,2,4) et W=(1,0.5,0.25) sont reprsents par l'Instance
7ECT suIvante:
Le produIt scalaIre de deux vecteurs est gal la somme des produIts de
chaque lment des deux vecteurs occupant la mme posItIon.
Dn a donc 7*W=(1*1+2*.5+4*.25)=J
et 7*7=(1*1+2*2+4*4)=21
Chercher une vue quI calcule tous les produIts scalaIres de 7ect
(normalement les deux vecteurs doIvent avoIr la mme longeur)
Une matrIce correspond un tableau de valeurs, on peut tendre notre
dfInItIon de 7ECT la relatIon |AT quI dfInIt le nom de la matrIce, la
lIgne, la colonne et la valeur pour chaque lment.
CREATE TABLE mat(nommat char(10),
l number(3),c number(4),
value number);
Les deux matrIces A et 8 sont donc reprsentes par l'Instance suIvante de
|AT.
1 2 B 1 2 3
A 2 4 1 2 3
3 6
Le produIt de deux matrIces donne une nouvelle matrIce dont chaque
lment correspond au produIt scalaIre d'une lIgne et d'une colonne des
matrIces multIplIes. AInsI A*8 donnera pour l'lment 1,1 du rsultat le
produIt scalaIre de la lIgne 1 de A et de la colonne 1 de 8 soIt J l'lment 1,2
du rsultat est le produIt scalaIre de la lIgne 1 de A et de la colonne 2 de 8
soIt 6, etc.
3 6 9
A * B 6 12 18
9 18 27
0e U|L SQL 265
EcrIre une vue quI effectue le produIt matrIcIel de toutes les matrIces de
|AT (normalement le nombre de colonnes de la premIere matrIce doIt tre
gale au nombre de lIgnes de la deuxIeme matrIce)
Sur 113
EtablIr une vue quI permette de rpondre aux questIons suIvantes,par des
requtes sans de joInture .
lIste des vhIcules et leur catgorIe de permIs
lIste des vhIcules de moIns de 20 places
lIste des vhIcules ayant entre 5 et 8 places
Etendre la vue prcdente pour tenIr compte de la relatIon carburant.
l doIt maIntenant tre facIle de donner la consommatIon par modele, par
catgorIe, par nbr de place.
EtablIr une vue quI regroupe ces statIstIques.
0onner les groupes quI consomment moIns de 10 lItres aux 100.
Reponses
Le jeu des troIs ds
crer troIs ds Indpendants
CREATE VIEW D1
AS SELECT * FROM D;
CREATE VIEW D2
AS SELECT * FROM D;
CREATE VIEW D3
AS SELECT * FROM D;
chercher la somme pour un jet de J ds
CREATE VIEW sum3D (v1,v2,v3,sum3)
AS SELECT D1.v,D2.v,D3.v,D1.v+D2.v+D3.v
FROM D1,D2,D3;
le nombre de jets de J ds possIbles
SELECT count(*)
FROM sum3D;
les dIffrentes faons d'obtenIr 7 avec troIs ds
SELECT * FROM
sum3D
WHERE sum3=7;
le nombre de possIbIts assocIes chaque somme
SELECT sum3,count(sum3)
FROM sum3D
GROUP BY sum3;
dresser un tableau en terme de statIstIque pour chaque somme
266 Modeliser et realiser une BD
SELECT sum3 somme,
(count(sum3)/216)*100 probabilite,'%'
FROM sum3D
GROUP BY sum3;
Les vecteurs et les matrIces
La condItIon de joInture porte sur la posItIon dans le vecteur.
CREATE VIEW prod_scalaire(a,b,prod)
AS SELECT a.nomvect,b.nomvect,sum(a.value*b.value)
FROM vect a,vect b
WHERE a.i=b.i
GROUP BY a.nomvect,b.nomvect;
SELECT * FROM prod_scalaire;
La vue prod_scalaIre calcule l'lment (l,c) du rsultat, la condItIon de
joInture porte sur la posItIon dans la lIgne l et la colonne c.
CREATE VIEW prod_scalaire_LC(a,b,l,c,prod)
AS SELECT a.nommat,b.nommat,a.l,b.c,sum(a.value*b.value)
FROM mat a,mat b
WHERE a.c=b.l
GROUP BY a.nommat,b.nommat,a.l,b.c;
Le produIt matrIcIel est l'ensemble possIble des valeurs des produIts
scalaIres. Nous avons ajout la condItIon quI empeche de donner le rsultat
pour des matrIces noncompatIbles
CREATE VIEW prod_mat(a,b,l,c,value)
AS SELECT a,b,l,c,prod
FROM prod_scalaire_lc
WHERE exists (SELECT 'vrai'
FROM mat a, mat b
WHERE a.nommat=a AND b.nommat=b
GROUP BY a.nommat, b.nommat
having max(a.c)=max(b.l));
Seules A * 8 et 8*A sont possIbles
SELECT * FROM prod_mat;
sur TT3
CREATE VIEW vhc_type
AS SELECT nochassis,noplaque,miseenservice,v.modele,nostation,
nbplaces,categorie,typecarburant,automatique,poids
FROM vehicule v, type t
WHERE v.modele=t.modele;
SELECT nochassis,categorie
FROM vhc_type;
SELECT nochassis,nbplaces
FROM vhc_type
WHERE nbplaces<20;
SELECT nochassis,nbplaces
FROM vhc_type
WHERE nbplaces between 5 AND 8;
0e U|L SQL 267
CREATE VIEW vhc_type_carb
AS SELECT nochassis,v.noplaque,miseenservice,
v.modele,nostation,
nbplaces,categorie,v.typecarburant
carburantrequis,automatique,poids,
nojour,kilometrage,litres,
c.typecarburant carburantplein
FROM vhc_type v, carburant c
WHERE v.noplaque=c.noplaque;
SELECT * FROM vhc_type_carb
WHERE carburantrequis<>carburantplein;
CREATE VIEW analyse_consomation
(critere,valeur,consom100)
AS SELECT 'modele',
modele,(sum(litres)/sum(kilometrage))*100
FROM vhc_type_carb
GROUP BY modele
union
SELECT 'nbplaces',
to_char(nbplaces),(sum(litres)/sum(kilometrage))*100
FROM vhc_type_carb
GROUP BY to_char(nbplaces)
union
SELECT 'carburant',
carburantplein,(sum(litres)/sum(kilometrage))*100
FROM vhc_type_carb
GROUP BY carburantplein;
SELECT *
FROM analyse_consomation;
SELECT *
FROM analyse_consomation
WHERE consom100<10;
0e U|L SQL 269
J7. Optimisation et performance
"Ainsi certaines fourmis naissent avec d'normes
mandibules cisaillles pour tre soldat, d'autres possdent
des mandibules broyantes pour produire de la farine de
crales, d'autres sont quipes de glandes salivaires
surdveloppes pour mouiller et dsinfecter les jeunes
larves." Bernard Weber - Les fourmis.
La premIere partIe de ce chapItre est consacre l'optImIsatIon des requtes
SQL. Jusqu' prsent, nous avons faIt abstractIon de l'ImplmentatIon
physIque des relatIons et nous avons dcrIt le fonctIonnement de la machIne
SQL en termes purement logIques. Les Instances des relatIons dans un SC80
sont stockes physIquement; au schma logIque des relatIons est assocI un
schma physIque. Ce dernIer spcIfIe pour chaque relatIon le modele
physIque et les parametres de stockage utIlIss.
La rIchesse des modeles utIlIss dpend du constructeur du SC80. Le choIx
du schma physIque dpend alors de l'utIlIsatIon de la base de donnes. Pour
que les requtes SQL restent logIquement Indpendantes du schma
physIque, le SC80 est munI d'un optmseur de requtes quI traduIt la
requte SQL en une squence d'actIons la plus approprIe au schma
physIque exIstant. Une mme requte a donc une traductIon dIrectement
dpendante du schma physIque. L'optImIseur utIlIse les InformatIons du
dIctIonnaIre et les proprIts thorIques pour effectuer sa traductIon.
0ans la deuxIeme partIe ce chapItre, nous traItons des pIeges de la
normalIsatIon et de l'utIlIsatIon gnralIse des vues. Nous montrons que
l'approche gnralement prconIse consIstant :
analyser les donnes et concevoIr le schma
tablIr des vues pour facIlIter la programmatIon des traItements
choIsIr un schma physIque de stockage (placer judIcIeusement des
Index)
peut mener des systemes ayant de mauvaIses performances. CecI montre
que des solutIons localement Idales peuvent mener une solutIon
globalement InsatIsfaIsante.
AfIn d'vIter cecI, Il faut que les contraIntes de performance, d'acces aux
donnes et la spcIfIcatIon des traItements usuels et frquents soIent
consIdrs en parallele avec la conceptIon des donnes. Nous prconIsons
donc une approche quI ne prIvIlgIe pas les donnes aux dpends des
traItements.
270 Modeliser et realiser une BD
Optimisation des requtes SQL
L'optImIseur utIlIse d'une part les proprIts de l'algebre relatIonnelle et
d'autre part les structures de donnes accompagnant les tables mmorIses.
FIgure 171 : DptImIsatIon des requtes SQL
Les proprIts de l'algebre relatIonnelle nous donnent des regles de
rcrIture ou des quIvalences entre expressIons. Ces quIvalences sont
utIlIses pour lImIner les nuplets quI ne satIsferont pas le prdIcat de la
requte. Par exemple, sI un prdIcat de slectIon ne faIt IntervenIr qu'une
relatIon, alors on a l'quIvalence suIvante:
(*
F
F1
F
F2
...
F
Fn
) (F
1
F
2
...F
n
) + (*
F
F1
F
1
)
(*
F
F2
F
2
) ...(*
F
Fn
F
n
)
En utIlIsant cette quIvalence, on voIt qu'Il est possIble de dplacer le
produIt cartsIen apres les slectIons sur les relatIons. En procdant aInsI, on
lImIne un trs grand nombre de nuplets quI n'auraIent pas satIsfaIt le
prdIcat. magInons que nous ayons 1000 clIents, 1000 rservatIons et 100
chambres dans notre hotel. La requte suIvante, produIraIt 100'000'000 de n
uplets tester, alors qu'en effectuant d'abord la slectIon du numro de
clIent sur CLENT, Il nous reste que 100'000 nuplets joIndre
SELECT Nom, prix, datedeb, datefin
FROM CHAMBRES, CLIENTS, RESERVATIONS
WHERE Clients.num_client=Reservations.num_client
AND Chambres.num_chambre=Reservations.num_chambre
AND Clients.num_client=1001
SQL permet de mmorIser des relatIons et de les Interroger sans spcIfIer les
structures de donnes ou les chemIns d'acces ces donnes. Cependant sI de
tels chemIns d'acces exIstent, le SC80 pourra optImIser la requte afIn
d'lImIner prIorI des nuplets quI ne satIsfont pas le prdIcat. Ces chemIns
d'acces sont surtout utIles pour l'opratIon d'quIjoInture. ls ne jouent pas
Dans le dictionnaire du SGBD:
schema logique
des relations
schema physique
des relations
statistiques sur
la BD
connaissances theoriques:
- sur l'algebre relationnelle
- sur les modeles physiques
OPTIMISEUR
requte SQL
Sequences d'actions
sur la BD
Instances des relations
Resultats de la requte
BD
0e U|L SQL 271
de role au nIveau smantIque de la relatIon. Dn peut tout moment les
ajouter, les supprImer ou modIfIer la structure de stockage des tables. Les
structures utIlIses sont celles que l'on tudIe dans un cours de structures de
donnes: les arbres, les 8arbres, les fonctIons de hashcodIng, les
partItIonnements, les Index, etc.
Les Index sont une InformatIon supplmentaIre quI permet dIrectement
d'accder aux ranges ayant une certaIne valeur. En prenant comme
mtaphore les lIvres, s'Il n'exIste pas d'Index, pour rechercher une
InformatIon, on est oblIg de parcourIr tout le lIvre, l'Index permet de
retrouver dIrectement la page Intressante. l en va de mme pour une
relatIon, sans Index, le SC80 doIt la parcourIr completement, avec un Index,
Il poInte dIrectement sur la partIe Intressante. Comme pour un lIvre, l'Index
n'ajoute aucune InformatIon Intressante part une facIlIt d'acces. En
construIsant un Index sur les numros de clIent pour la relatIon CLENTS, les
numro de clIent pour la relatIon FESEF7ATDNS et un Index sur les numros
de chambre pour la relatIon CHA|8FES, la requte prcdante quI exIgeaIt
100'000'000 de tests sur des nuplets se rduIt aux parcours de poInteurs dans
un 8arbre (la structure de l'Index) et quelques entres/sortIes sur les
dIsques. 0ans la FIgure 172, on peut suIvre le chemInement de l'optImIsatIon
suIvante produIte par le SC80:
0ans la relatIon CLENTS
chercher Clients.num_client=1001
pour chaque nuplet trouv
0ans la table FESEF7ATDNs
chercher Clients.num_client=Reservations.num_client
pour chaque nuplet trouv
0ans la table CHA|8FES
chercher Chambres.num_chambre=Reservations.num_chambre
pour chaque nuplet trouv
effectuer la projectIon.
Cette requte optImIse auraIt pu tre crIte par un programmeur. La
dIffrence rsIde dans le faIt que le SC80 faIt voluer dynamIquement le
rsultat de ses optImIsatIons en fonctIon des chemIns d'acces exIstant au
moment de l'excutIon de la requte. Alors que le programme crIt reste
statIque et ne peut aucunement voluer en fonctIon des besoIns mergeant
du champ d'applIcatIon ou d'une meIlleure connaIssance de ce dernIer.
1001
INDEX num_client
sur CLIENTS
1001
CLIENTS
1001
INDEX num_client
sur RESERVATIONS
1001
RESERVATIONS
12
INDEX num_chambre
sur CHAMBRES
CHAMBRES
12
12
272 Modeliser et realiser une BD
FIgure 172 : UtIlIsatIon des Index lors de la slectIon.
Le processus d'optImIsatIon dpend fortement de l'ImplantatIon du SC80.
L'optImIsatIon se dcoupe gnralement dans les tapes suIvantes:
Par la rcrIture de la requte SQL. Cette phase traduIt une requte
SQL en une autre requte SQL quIvalente du poInt de vue
smantIque, maIs quI exploItera au maxImum les connaIssances des
modeles physIques de stockage. La requte obtenue est plus
performante car elle sera plus slectIve du poInt de son excutIon.
Cependant cette phase est entIerement syntaxIque et peut s'excuter
sans utIlIser les InformatIons sur les schmas physIques.
Par la transformatIon de la requte SQL en une squence d'actIons sur
les donnes physIques. Ce comment on va rlement le faIre doIt
dtermIner et choIsIr les chemIns d'acces aux donnes, l'ordre des
joIntures et les mthodes pour effectuer les joIntures. Cette phase
s'excute sur la base des schmas physIques et ventuellement sur la
base d'InformatIons statIstIques sur les Instances.
En gnral les SC80 permettent de connatre la planIfIcatIon d'actIons que
l'optImIseur a effectues.
Reecriture de la requte SQL
L'Ide sousjacente chaque transformatIon est d'obtenIr des expressIons quI
accederont plus dIrectement l'InformatIon. C'est dIre quI pourront tre
utIlIses dIrectement lors de la planIfIcatIon des actIons. Par exemple dans:
SELECT * FROM Chambres WHERE not (prix>100)
Dn souhaIte obtenIr toutes les ranges quI ne sont pas slectIonnes. Le
SC80 ne saIt que faIre des slectIons Il est donc prfrable de luI faIre
excuter la requte quIvalente suIvante:
SELECT * FROM Chambres WHERE prix<=100
Sans tre exhaustIf, nous donnons une lIste des prIncIpales transformatIons
syntaxIques que l'optImIseur peut effectuer.
lImInatIon des expressIons constantes (l'expressIon est value qu'une seule
foIs)
prix <840/7 -- (prix la semaine)
-> prix <120
transformatIon des recherches dans les chanes de caracteres en galIt
(utIlIsable par les Index)
nom like 'Dumas'
-> nom = 'Dumas'
transformatIon des expressIons d'appartenance en une expressIon dIsjonctIve
(utIlIsable par les Index)
confort in ('BAIN','DOUCHE')
-> confort='BAIN' OR confort='DOUCHE'
0e U|L SQL 27J
transformatIon des expressIons ANY explIcItes en une expressIon dIsjonctIve
(utIlIsable par les Index)
prix < any (100,840/7)
-> prix < 100 OR prix < 840/7
transformatIon des expressIons ALL explIcItes en une expressIon conjonctIve
(utIlIsable par les Index)
prix < all (100,840/7)
-> prix < 100 AND prix < 840/7
transformatIon des expressIons ANY ImplIcItes en une expressIon EXSTS
augmente de la condItIon (plus slectIve)
a < any (SELECT prix FROM chambres
WHERE confort ='BAIN'))
-> Exists (SELECT 'vrai' FROM chambres
WHERE confort ='BAIN'
AND a<prix)
transformatIon des expressIons ALL ImplIcItes en une expressIon EXSTS
augmente de la condItIon Inverse (plus slectIve)
a < all (SELECT prix FROM chambres
WHERE confort ='BAIN'))
-> not Exists (SELECT 'vrai' FROM chambres
WHERE confort ='BAIN'
AND a>=prix)
transformatIon des expressIons 8ETWEEN en une expressIon conjonctIve
prix between 100 AND 120
-> prix >= 100 AND prix <= 120
sImplIfIcatIon des expressIons NDT en utIlIsant l'oprateur Inverse
not (prix < 100 OR confort ='WC')
-> prix >=100 AND confort <>'WC'
transformatIon des clauses dIsjonctIves en sousrequtes lIes par un UNDN
ALL (utIlIsatIon possIble des Index dans les sousrequtes)
SELECT * FROM chambres
WHERE confort='BAIN' OR confort='DOUCHE'
-> SELECT * FROM chambres WHERE confort='BAIN'
UNION ALL
SELECT * FROM chambres WHERE confort='DOUCHE'
transformatIon des sousrequtes en une requte quIvalente utIlIsant une
joInture (utIlIsatIon possIble des Index dans les sousrequtes)
SELECT * FROM revervation
WHERE num_chambre in (SELECT chambres.num_chambre
FROM chambres
WHERE confort='BAIN')
274 Modeliser et realiser une BD
-> SELECT revervation.* FROM revervation, chambres
WHERE revervation.num_chambre=chambres.num_chambre
AND confort='BAIN')
Ces transformatIons ne sont pas toujours possIbles, la sous requte doIt alors
tre value pour chaque range de la requte sI elle en dpend.
SELECT * FROM chambres c1
WHERE c1.prix > (SELECT avg(c2.prix)
FROM chambres c2
WHERE c1.confort=c2.confort)
-> pas de requte quivalente avec une jointure
L'optImIseur Integre aussI les vues dans les requtes (dj dIscut dans le
chapItre sur les vues). Les transformatIons que nous avons examInes sont
toutes syntaxIques, c'est dIre que l'on peut les effectuer sans connaIssance
du schma physIque de la base de donnes. L'tape suIvante va consIster
slectIonner les chemIns d'acces.
Chemins d'accs
Les donnes sont stockes dans des structures physIques quI ont chacune des
mthodes d'acces partIculIeres. Pour notre expos, nous ne consIdrons que
les structures de tables squentIelles et d'Index. Cependant les SC80
mettent d'autres structures dIsposItIon du concepteur telles que les tables
dont les donnes sont regroupes physIquement sI elles possedent des
valeurs communes pour certaIns constItuants (cluster); les tables dont la
place des donnes est fIxe par un algorIthme de hcsh codny; ou bIen des
structures de tables squentIellement Indexes. Pour ces structures, on
applIque les mmes crIteres de choIx que pour les deux cas que nous
examInons.
1able sequentielle
0ans cette structure, les donnes sont ranges squentIellement dans
l'espace quI est allou la table. Chaque range est IdentIfIe par un
IdentIfIcateur de range (rowId
19
) entIerement dpendant de la place
physIque de la range.
FIgure 17J : Structure de la table squentIelle
19
L'IdentIfIcateur de range dans DFACLE IndIque le numro du fIchIer, le numro du bloc
dans ce fIchIer, la place dans ce bloc de la range
rangee 1
rangee 2
rangee i
Table R
identiIicateur
de la rangee 1
0e U|L SQL 275
Les mthodes de recherche d'une range pour cette structure sont:
la lecture squentIelle de toute la table, range apres range (]ull
sccn tcble)
l'acces une range par son IdentIfIcateur (by rowd)
Exemple sur Hotel (les plans d'excutIons sont obtenus avec l'ordre Explain
plan du SC80 Dracle. Les plans dcrIvent la mthode et l'acces utIlIs. Les
condItIons de slectIon sont utIlIses lors de l'acces soIt comme cl d'acces
ou bIen comme fIltre):
SELECT * FROM chambres WHERE num_chambre=12;
Cherchons le rowId d'une range
SELECT rowid FROM chambres WHERE num_chambre=12;
SELECT * FROM chambres
WHERE rowid='0000004E.0008.0002';
L'excutIon est bIen conforme ce quI taIt prvu
L'IdentIfIcateur de range est accessIble, maIs son utIlIsatIon est assocIe
d'autres structures de donnes telles que les Index.
FIgure 174 : Structure d'Index assocI une table
Les index
Cette structure est assocIe une table, elle est construIte sur un certaIn
nombre de constItuants de la table. A chaque groupe de valeurs est assocI
un ou plusIeurs IdentIfIcateurs de range. Les valeurs sont ellesmmes
organIses dans une structure quI facIlIte la recherche, souvent sous forme
d'arbre bInaIre (pour une InformatIon de base, examIner l'ouvrage de N.
WIrth [WF76]).
La commande de cratIon de ces Index est une clause SQL quI est ajoute au
standard. 0ans le SC80 Dracle, nous avons la clause suIvante:
Dn assocIe donc un IdentIfIcateur d'Index une table et une lIste de
colonnes. La clause unIque spcIfIe que ce groupe est une cl de la table
donc qu'Il n'y a qu'un seul IdentIfIcateur de range pour une valeur des
colonnes Indexes.
rangee 1
rangee 2
rangee i
Table R
Index de R sur C
c1
c2
ci
idenIicateur
de rangee
pointant sur
les rangees
ayant
ci pour
valeur
276 Modeliser et realiser une BD
Exemple:
CREATE unique index chambres_by_number
on chambres(num_chambre);
Les mthodes prIncIpales de recherche d'un IdentIfIcateur de range pour
cette structure sont:
l'acces un IdentIfIcateur de range avec un Index unIque(0nque
sccn)
l'acces une lIste d'IdentIfIcateurs de range avec un Index (rcnye
sccn)
Pour que ces acces soIent possIbles, Il faut connatre les valeurs des
constItuants dfInIssant l'Index. Le plan d'excutIon de la requte
prcdante devIent alors:
Chercher le rowId dans l'Index pour num_chambre=12
Chercher la range portant ce rowId dans la table Chambres
20
SELECT * FROM chambres WHERE num_chambre=12;
En crant un Index sur prIx, on a des recherches quI nous ramenent tous les
IdentIfIcateurs ayant un mme prIx.
CREATE index chambres_by_prix on chambres(prix);
SELECT * FROM chambres WHERE prix=100;
Choix des chemins d'accs
L'optImIseur va donc examIner toutes les possIbIlIts d'accder aux ranges
des tables. Pour cela Il utIlIsera donc les condItIons de slectIon de la
requte.
Le choIx d'un chemIn est dtermIn sImplement par une pondratIon de la
prfrence quI reflete dIrectement la performance de l'acces (lIste par ordre
de prfrence):
acces une range par un IdentIfIcateur de range
acces par un Index unIque
acces par un Index
acces squentIel la table
Le crItere d'acces peut tre raffIn sI l'on possede des InformatIons
statIstIques sur l'Instance de la base de donnes (les proprIts
dIscrImInantes des Index, la taIlle des tables par exemple, etc). 0es regles
du modele physIque peuvent alors tre utIlIses automatIquement. Une telle
regle sera par exemple, sI l'on accede plus de 25 des ranges d'une table
en utIlIsant un Index alors Il faut prfrer l'acces squentIel ou encore sI la
taIlle d'une table est plus petIte que 4 Koctets alors prfrer l'acces
20
Les plans d'excutIon se lIsent l'envers, Ils correspondent un arbre, les commandes les
plus ImbrIques sont excutes en premIer.
0e U|L SQL 277
squentIel. Les statIstIques permettent de vrIfIer que les acces
sophIstIqus sont justIfIs.
Le travaIl effectu par l'optImIseur lors de la rcrIture est exploIt dans la
recherche des meIlleurs chemIns d'acces. Ajoutons un Index sur confort.
CREATE index chambres_by_confort on chambres(confort);
Le plan d'excutIon montre bIen que la requte t rcrIte sous forme
d'une concatnatIon de deux slectIons, l'une portant sur le prIx et l'autre
sur le confort
SELECT * FROM chambres
WHERE prix<100 OR confort='BAIN';
Choix de la methode de jointure
La dernIere tape de l'optImIsatIon consIste choIsIr une mthode et un
ordre de joInture entre les relatIons. Les mthodes de joInture sont
dpendantes des chemIns d'acces (et donc des structures physIques de
stockage). Avec les structures retenues, nous avons deux mthodes:
la joInture par trI et fusIon
la joInture par boucle ImbrIque
Jointure par tri et fusion
SoIt deux tables F et S joIndre par le groupe de constItuants C, alors
l'algorIthme est le suIvant
LE TRI
trier R avec C comme cl de tri
placer le rsultat dans une table Rt=(C, rowid)
trier S avec C comme cl de tri
placer le rsultat dans une table St=(C, rowid)
LA FUSION
21
lire la premiere range de Rt
lire la premiere range de St
pour chaque range de Rt faire
tant que st.C <=rt.C faire
lire prochaine range de St
si st.C =rt.C alors
joindre st.rowid & rt.rowid
mettre dans la relation RES
refaire
refaire
Cette mthode de joInture ncessIte une lecture squentIelle de chaque
table, les trIs et la fusIon. Le trI est l'opratIon la plus sensIble car sa
21
La fusIon propose est correcte sI C est une cl de F, sI cela n'est pas le cas, Il faut
complter l'algorIthme par une possIbIlIt de retourner en arrIere dans la table St pour
relIre des valeurs lorsqu'on rencontre deux valeurs IdentIques se succdant dans Ft.
278 Modeliser et realiser une BD
complexIt est de D(n.log(n)), les autres sont d'ordre D(n) ou n est la
cardInalIt de la plus grande table.
Elle ne ncessIte pas de structure physIque partIculIere.
Jointure par boucle imbriquee
SoIt deux tables F et S joIndre par le groupe de constItuants C, alors
l'algorIthme est le suIvant
BOUCLE IMBRIQUEE
pour chaque range de R faire
pour chaque range de S faire
si s.C =r.C alors
joindre s & r
mettre dans la relation RES
refaire
refaire
Sans structure physIque partIculIere, cette mthode de joInture ncessIte
une lecture squentIelle de la table F et n lectures squentIelles de la table
S ou n est la cardInalIt de F. 0u poInt de vue performance, elle est
catastrophIque sI n est grand ou sI S est grande. La joInture par trIfusIon est
prfrable. Cependant sI on peut acceder aux ranges de S travers un
Index sur la charnIere C de la joInture, cet algorIthme est trs performant.
Ordre et methode
0ans le cas de joInture de plus de 2 relatIons, les relatIons sont toujours
joIntes deux par deux, maIs alors une des relatIons est le rsultat d'une
joInture. L'optImIseur examIne et attrIbue une note toutes les possIbIlIts
de joIntures. l examIne aussI les couples quIvalents F*S et S*F quI peuvent
dIffrer dans leur taIlle et les Index exploIter. Ces algorIthmes d'valuatIon
sont assez complexes et dpendent troItement des structures physIques
mIses en oeuvre dans le SC80.
Pour termIner examInons deux exemples:
Cette requte dans une structure sans Index utIlIse la mthode de trIfusIon
SELECT r.num_chambre,prix
FROM chambres c,reservations r
WHERE c.num_chambre=r.num_chambre;
Apres la cratIon d'un Index sur les numro de chambre, l'optImIseur utIlIse,
pour la mme requte, la fusIon par boucle ImbrIque ou la boucle
IntrIeure est un acces travers un Index portant sur la charnIere de la
joInture.
CREATE unique index chambres_by_number
on chambres(num_chambre);
La requte suIvante porte sur troIs relatIons, sans structure d'Index. Un trI
fusIon est effectu entre les clIents et les rservatIons (on utIlIse la
0e U|L SQL 279
condItIon de slectIon sur le nom pour dImInIuer le nombre de ranges du
rsultat). Le rsultat est reprIs dans un deuxIeme trIfusIon avec la relatIon
chambres.
SELECT nom,r.num_chambre,prix
FROM chambres c,reservations r,clients cl
WHERE c.num_chambre=r.num_chambre
AND cl.num_client=r.num_client
AND cl.nom='DUMAS';
CREATE unique index chambres_by_number
on chambres(num_chambre);
CREATE index reservations_by_num_client
on reservations(num_client);
CREATE index clients_by_nom
on clients(nom);
Apres avoIr cr troIs Index (sImIlaIre la FIgure 172), nous obtenons un
plan d'excutIon quI utIlIse tous les Index. l s'agIt de boucles ImbrIques quI
portent seulement sur quelques ranges
Pour crer une applIcatIon performante, le concepteur doIt connatre:
les mcanIsmes utIlIss par le SC80
les schmas physIques de son applIcatIon
les traItements de l'applIcatIon
0ans la deuxIeme partIe de ce chapItre, nous examInons comment ces
dIffrents poInts sont Interdpendants.
Une perception holistique de la conception
Nous Illustrons notre propos par un exemple sImplIfI, tIr de la
comptabIlIt. Nous avons gard, le coeur d'une base de donnes comptable,
savoIr enregIstrer des crItures ventIlant, sur des comptes, des pIeces
comptables regroupes dans des journaux comptabIlIss pour une prIode
comptable. Nous avons conserv l'aspect multIsocIt.
Nous avons retenu les constItuants suIvants:
Date_jour dom date
Date_Valeur dom date
Debit_Credit dom mot ('D','C')
Lib_Ecriture dom texte
Lib_journal dom texte
Lib_Piece dom texte
Montant dom numrique rel
Num_Compte dom numrique entier [1..999999]
Num_Ecriture dom numrique entier [1..999999]
Num_journal dom numrique entier [1..999999]
Num_Piece dom numrique entier [1..999999]
Periode_comptable dom mot ('9301', '9302', ... )
Societe dom mot ('SA', ... )
280 Modeliser et realiser une BD
Le prdIcat portant sur ces constItuants est:
Tout(Date_jour, Date_Valeur, Debit_Credit,
Lib_Ecriture, Lib_journal, Lib_Piece, Montant,
Num_Compte, Num_Ecriture, Num_journal, Num_Piece,
Periode_comptable, Societe)
predicat:"||Tout(dj,dv,dc,le,lj,lp,mt,nc,ne,nj,np,pc,s
o)|| L'criture libelle le, au (dbit/crdit) dc, du
montant mt, portant sur le compte nc appartient la
pice np, libelle lp, la date de valeur dv, et est
comptabilise dans le journal nj, libell lj, la
date dj, pour la priode pc"
Le schma valIde les dpendances fonctIonnelles suIvantes:
Societe,Date_jour Periode_comptable
Societe,Num_journal Lib_journal, Date_jour
Societe,Num_Piece Num_journal,Date_Valeur,Lib_Piece
Societe,Num_Piece,Num_CompteMontant,Debit_Credit,Lib
_Ecriture
Ces dpendances fonctIonnelles forment un base Irredondante (pas de
cycle), nous avons donc dIrectement une dcomposItIon en JFN (les cls sont
soulIgnes).
Periode(Societe, Date_jour, Periode_comptable)
Journal(Societe, Num_journal, Lib_journal, Date_jour)
Piece(Societe, Num_Piece, Num_journal, Date_Valeur,
Lib_Piece)
Ecriture(Societe,Num_Piece,Num_Compte,Montant,
Debit_Credit,Lib_Ecriture)
Nous obtenons donc le schma de cratIon suIvant pour le SC80:
CREATE TABLE PERIODE (
Societe CHAR(3) not null,
Date_Jour DATE not null,
Periode_Comptable CHAR(4) not null)
CREATE TABLE JOURNAL (
Societe CHAR(3) not null,
Num_Journal NUMBER (6) not null,
Date_Jour DATE not null,
Lib_Journal CHAR(30))
CREATE TABLE PIECE(
Societe CHAR(3) not null,
Num_Piece NUMBER (6) not null,
Num_Journal NUMBER (6) not null,
Date_Valeur Date not null,
Lib_Piece CHAR(30))
0e U|L SQL 281
CREATE TABLE ECRITURE(
Societe CHAR(3) not null,
Num_Piece NUMBER (6) not null,
Num_Compte NUMBER (6) not null,
Montant Number(13,2) not null,
Debit_Credit char(1) not null,
Lib_Ecriture CHAR(30))
Pour facIlIter notre travaIl , on peut dfInIr la vue Tout. 0'un poInt de vue
mthodologIque, travaIller sur des vues devraIt mInImIser les modIfIcatIons
dans les traItements sI l'on doIt changer le schma de la base de donnes.
CREATE VIEW tout AS
SELECT
D.societe,D.date_jour,D.periode_comptable,
J.Num_journal,J.lib_journal,
P.num_piece,P.date_valeur,P.lib_piece,
E.num_compte,E.Montant,E.debit_credit,E.lib_ecriture
FROM periode D,journal J, piece P, Ecriture E
WHERE D.societe=J.societe
AND D.date_jour=J.date_jour
AND J.societe=P.societe
AND J.num_journal=P.num_journal
AND P.societe=E.societe
AND P.num_piece=E.num_piece;
Nous avons retenu les traItements suIvants:
1) calculer le mouvement d'un compte pour une prIode
2) rechercher les pIeces et les crItures d'un journal
J) rechercher les crItures d'une pIece
4) vrIfIer qu'un groupe d'crItures est balanc (somme des dbIts est
gale la somme des crdIts pour chaque pIece)
Pour effectuer les joIntures et effectuer les dIffrents acces, nous
dfInIssons les Index suIvants:
CREATE unique index periode_i1
on periode(societe,date_jour);
CREATE unique index journal_i1
on journal(societe,num_journal);
CREATE unique index piece_i1
on piece(societe,num_piece); -- pour accder par les
pices
CREATE index piece_i2;
on piece(societe,num_journal);
CREATE index ecriture_i1
on ecriture(societe,num_piece);
282 Modeliser et realiser une BD
CREATE index ecriture_i2
on ecriture(societe,num_compte); -- pour accder par les
comptes
Pour ces quatres questIons, nous avons crIt une requte SQL utIlIsant la vue
Tout. Les rsultats sont prsents dans un tableau comportant la requte,
son cout d'excutIon et son plan d'excutIon.
Q SQL cot Accs utilis
1 SELECT decode(debit_credit,'D',-
montant,montant)
FROM tout
WHERE societe='SA'
AND num_compte=11
AND periode_comptable='9304';
17 NESTED LOOPS
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS BY ROWID PERIODE
INDEX RANGE SCAN PERIODE_I1
TABLE ACCESS BY ROWID JOURNAL
INDEX RANGE SCAN JOURNAL_I1
TABLE ACCESS BY ROWID PIECE
INDEX RANGE SCAN PIECE_I2
TABLE ACCESS BY ROWID ECRITURE
INDEX RANGE SCAN ECRITURE_I2
2 SELECT *
FROM tout
WHERE societe='SA'
AND num_journal=11;
3 NESTED LOOPS
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS BY ROWID PERIODE
INDEX RANGE SCAN PERIODE_I1
TABLE ACCESS BY ROWID JOURNAL
INDEX UNIQUE SCAN JOURNAL_I1
TABLE ACCESS BY ROWID PIECE
INDEX RANGE SCAN PIECE_I2
TABLE ACCESS BY ROWID ECRITURE
INDEX RANGE SCAN ECRITURE_I1
3 SELECT *
FROM tout
WHERE societe='SA'
AND num_piece=1;
15 NESTED LOOPS
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS BY ROWID PERIODE
INDEX RANGE SCAN PERIODE_I1
TABLE ACCESS BY ROWID JOURNAL
INDEX RANGE SCAN JOURNAL_I1
TABLE ACCESS BY ROWID PIECE
INDEX UNIQUE SCAN PIECE_I1
TABLE ACCESS BY ROWID ECRITURE
INDEX RANGE SCAN ECRITURE_I1
4 SELECT
num_piece,sum(decode(debit_credit,'D',-
montant,montant))
FROM tout
WHERE societe='SA'
AND num_piece between 1 AND 100
GROUP BY num_piece
having sum(decode(debit_credit,'D',-
montant,montant))<>0;
36 NESTED LOOPS
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS BY ROWID PERIODE
INDEX RANGE SCAN PERIODE_I1
TABLE ACCESS BY ROWID JOURNAL
INDEX RANGE SCAN JOURNAL_I1
TABLE ACCESS BY ROWID PIECE
INDEX UNIQUE SCAN PIECE_I1
TABLE ACCESS BY ROWID ECRITURE
INDEX RANGE SCAN ECRITURE_I1
Pour ces tests, nous avous utIlIs une petIte base de donnes d'envIron 5000
crItures, portant sur 4 prIodes.
A premIere vue, pas de FULL SCAN, tous les acces se font par des Index.
EffectIvement dans chaque requte, on spcIfIe la socIt donc on peut
toujours accder avec un Index (juste sur la premIere cl). |algr la
0e U|L SQL 28J
dIversIt des requtes, on accede toujours dans le mme ordre aux tables
PEFD0E JDUFNAL PECE ECFTUFE.
Cette ordre est fIx par la vue Tout. En effet, les valeurs d'acces sont
substItues lexIcalement dans la vue. La contraInte sur la socIt portera
toujours sur le constItuant socIt de prIode, alors que sI l'on dsIre
accder par le numro de journal, Il faut contraIndre celuI de la table
Journal pour profIter des Index.
En effectuant des test sur dIx foIs plus d'entIts, les couts peuvent
facIlement centupler. Le relatIvement bon score de la questIon deux
s'explIque par le faIt que le SC80 a utIlIs l'Index sur le numro de pIece et
que le nombre de ranges ce stade de la rsolutIon taIt faIble (500). La
vue Tout telle qu'elle est dfInIe ne correspond en faIt aucun type d'acces
qu'Il faut prIvIlgIer du poInt de vue des traItements.
Specialiser les vues pour un accs principal
En examInant la vue Tout et nos traItements, on peut constater que l'on doIt
accder, par les journaux, par les pIeces et par les crItures. l faut donc
crer troIs vues, prservant un acces prIvIlgI pour ces types de slectIon
(en gras, on trouve les dIffrences avec la vue Tout.
CREATE VIEW tout_E AS -- par les critures
SELECT
E.societe,J.date_jour,D.periode_comptable,
J.Num_journal,J.lib_journal,
E.num_piece,P.date_valeur,P.lib_piece,
E.num_compte,E.Montant,E.debit_credit,E.lib_ecriture
FROM
periode D,journal J, piece P, Ecriture E
WHERE E.societe=J.societe
AND D.date_jour=J.date_jour
AND E.societe=P.societe
AND J.num_journal=P.num_journal
AND P.societe=E.societe
AND P.num_piece=E.num_piece;
CREATE VIEW tout_J AS -- par les journaux
SELECT
J.societe,J.date_jour,D.periode_comptable,
J.Num_journal,J.lib_journal,
P.num_piece,P.date_valeur,P.lib_piece,
E.num_compte,E.Montant,E.debit_credit,E.lib_ecriture
FROM
periode D, piece P, Ecriture E,journal J
WHERE J.societe=D.societe
AND J.date_jour=D.date_jour
AND J.societe=P.societe
AND J.num_journal=P.num_journal
284 Modeliser et realiser une BD
AND J.societe=E.societe
AND P.num_piece=E.num_piece;
CREATE VIEW tout_P AS -- par les pices
SELECT
P.societe,J.date_jour,D.periode_comptable,
P.Num_journal,J.lib_journal,
P.num_piece,P.date_valeur,P.lib_piece,
E.num_compte,E.Montant,
E.debit_credit,E.lib_ecriture
FROM
periode D, piece P, Ecriture E,journal J
WHERE P.societe=D.societe
AND J.date_jour=D.date_jour
AND P.societe=P.societe
AND J.num_journal=P.num_journal
AND J.societe=E.societe
AND P.num_piece=E.num_piece;
En utIlIsant ces vues, on obtIent le tableau quI suIt
Q SQL co
t
Accs utilis
1 SELECT decode(debit_credit,'D',-
montant,montant)
FROM tout_E
WHERE societe='SA'
AND num_compte=11
AND periode_comptable='9304';
15 NESTED LOOPS
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS FULL PERIODE
TABLE ACCESS BY ROWID
ECRITURE
INDEX RANGE SCAN ECRITURE_I2
TABLE ACCESS BY ROWID PIECE
INDEX UNIQUE SCAN PIECE_I1
TABLE ACCESS BY ROWID JOURNAL
INDEX UNIQUE SCAN JOURNAL_I1
2 SELECT *
FROM tout_J
WHERE societe='SA'
AND num_journal=11;
2 NESTED LOOPS
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS BY ROWID
JOURNAL
INDEX UNIQUE SCAN JOURNAL_I1
TABLE ACCESS BY ROWID PERIODE
INDEX UNIQUE SCAN PERIODE_I1
TABLE ACCESS BY ROWID PIECE
INDEX RANGE SCAN PIECE_I2
TABLE ACCESS BY ROWID ECRITURE
INDEX RANGE SCAN ECRITURE_I1
3 SELECT *
FROM tout_P
WHERE societe='SA'
AND num_piece=1;
2 NESTED LOOPS
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS BY ROWID PIECE
INDEX UNIQUE SCAN PIECE_I1
FILTER
TABLE ACCESS FULL JOURNAL
TABLE ACCESS BY ROWID PERIODE
INDEX UNIQUE SCAN PERIODE_I1
TABLE ACCESS BY ROWID ECRITURE
INDEX RANGE SCAN ECRITURE_I1
0e U|L SQL 285
4 SELECT
num_piece,sum(decode(debit_credit,'D',-
montant,montant))
FROM tout
WHERE societe='SA'
AND num_piece between 1 AND 100
GROUP BY num_piece
having sum(decode(debit_credit,'D',-
montant,montant))<>0;
23 FILTER
SORT GROUP BY
NESTED LOOPS
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS FULL JOURNAL
TABLE ACCESS BY ROWID PIECE
INDEX RANGE SCAN PIECE_I2
INDEX UNIQUE SCAN PERIODE_I1
TABLE ACCESS BY ROWID
ECRITURE
INDEX RANGE SCAN ECRITURE_I1
Dn constate que les questIons 2 et J ont bnfIcI de ce remanIement. Leur
excutIon accede maIntenant dIrectement la table la plus dIscrImInante.
L'excutIon de 4 reste couteuse, car elle est mal formule, la rponse
cette questIon peut tre calcule unIquement dans le contexte de la table
des crItures. La vue nous oblIge faIre des joIntures pour obtenIr des
InformatIons quI sont InutIles pour cette questIon.
Q SQL co
t
Accs utilis
4 SELECT
num_piece,sum(decode(debit_credit,'D',-
montant,montant))
FROM Ecriture
WHERE societe='SA'
AND num_piece between 1 AND 100
GROUP BY num_piece
having sum(decode(debit_credit,'D',-
montant,montant))<>0;
1 FILTER
SORT GROUP BY
TABLE ACCESS BY ROWID
ECRITURE
INDEX RANGE SCAN ECRITURE_I1
Denormalisation
La questIon 1 ne peut pas tre optImIse par une vue, ou par une rductIon
de contexte. En effet, dans ce schma, elle est IntrInsequement couteuse,
car elle ncessIte troIs joIntures, pour accder sImultanment la prIode
et au numro de compte. La seule solutIon consIste dnormalIser, c'est
dIre crer une redondance dans les donnes. 0ans notre cas Il faut ajouter
l'InformatIon prIode sur l'crIture. Les programmes de saIsIe des donnes
doIvent tenIr compte de cette redondance. Le cout de cette dnormalIsatIon
se traduIt aussI dans une augmentatIon de la place utIlIse pour stocker
cette InformatIon supplmentaIre pour chaque crIture. (dIlemme entre
calculer et mmorIser). Nous ajoutons donc le constItuant prIode la table
crIture. l prend pour valeur celle assocIe la pIece et au journal.
CREATE TABLE ECRITURE(
Societe CHAR(3) not null,
Num_Piece NUMBER (6) not null,
Num_Compte NUMBER (6) not null,
Priode CHAR(4) not null,
Montant Number(13,2) not null,
Debit_Credit char(1) not null,
Lib_Ecriture CHAR(30))
Nous remplaons l'Index ecrture_2 par l'Index suIvant portant en plus sur la
prIode:
286 Modeliser et realiser une BD
CREATE index ecriture_i2bis on
ecriture(societe,num_compte,periode);
La questIon 1 peut maIntenant se calculer localement dans le contexte de la
table crIture.
Q SQL co
t
Accs utilis
1 SELECT decode(debit_credit,'D',-
montant,montant)
FROM ecriture
WHERE societe='SA'
AND num_compte=11
AND periode='9304';
1 TABLE ACCESS BY ROWID ECRITURE
INDEX RANGE SCAN ECRITURE_I2BIS
Une requte SQL donne toujours une rponse, maIs cellecI peut arrIver
apres une courte ternIt ... l faut donc tre tres vIgIlant dans l'crIture des
requtes. La dure maxImale d'une requte devraIt tre Inverse sa
frquence.
Frquence dure
moIs heures
jour quart d'heure
heure mInute
mInute seconde
Avant de penser changer de machIne, Il faut examIner mInutIeusement les
requtes quI sont un goulot d'trangle ment. En changeant de machIne, on
peut gagner un facteur 10 (selon ses moyens). En rcrIvant une requte, on
peut gagner parfoIs un facteur 1000.
Nous avons utIlIs l'approche prconIse consIstant :
analyser les donnes
concevoIr le schma normalIs
tablIr des vues pour facIlIter la programmatIon des traItements
choIsIr un schma physIque de stockage
programmer les traItements
Chaque tape taIt optImale
Le schma taIt en troIsIeme forme normale
Les traItements opraIent travers une vue
Tous les Index ncessaIres taIent prsents
Pourtant le rsultat de l'excutIon des traItements avaIent de mauvaIses
performances. La normalIsatIon peut loIgner des InformatIons qu'Il seraIt
souhaItable de garder couples, car elles prennent sens lorsqu'elles sont
ensemble. Les vues peuvent rendre Inoprantes les optImIsatIons. Les Index
peuvent tre utIlIss partIellement. CecI montre que des solutIons
0e U|L SQL 287
localement Idales peuvent mener une solutIon globalement
InsatIsfaIsante.
AfIn d'vIter cecI, Il faut que les contraIntes de performance, d'acces aux
donnes et de spcIfIcatIon des traItements usuels et frquents soIent
consIdrs en parallele avec la conceptIon des donnes. Nous prconIsons
donc une approche:
ne prIvIlgIant pas les donnes aux dpends des traItements.
valIdant les choIx du concepteur (par prototypage par exemple).
L'Indpendance entre les nIveaux conceptuels, logIques et physIques; entre
les modeles de donnes, de traItements et des regles d'IntgrIt donne un
cadre thorIque pour le chercheur et un cadre cognItIf pour le concepteur.
Cependant lors de la ralIsatIon d'un systeme d'InformatIon, les frontIeres de
ces cadres doIvent tre assouplIes, la conceptIon s'y effectue en parallele,
les ItratIons tant nombreuses. Les nIveaux et les modeles devIennent
Interdpendants. Cette Interdpendance est lIe aux objectIfs et aux choIx
des concepteurs.
0e U|L SQL 289
J8. INVLS1
Lnonce
Une socIt de gestIon de portefeuIlle a dcId de faIre voluer ses
applIcatIons de gestIon. Elle a choIsI de les Implanter l'aIde d'un systeme
de gestIon de bases de donnes relatIonnel et de remplacer aInsI ses
ancIennes applIcatIons crItes en 8ASC avec des fIchIers squentIels
Indexs. nvest gere des portefeuIlles de valeur pour dIffrents clIents. Elle
achete et elle vend des tItres. Elle peroIt les revenus. Elle gere les
portefeuIlles en francs suIsses, maIs peut acheter des valeurs dans une autre
monnaIe. Tous les jours, elle Interroge un serveur la bourse quI luI IndIque
le cours du jour pour un tItre et les cours de change.
Un consultant a tudI les InformatIons de nvest et propose l'analyse quI
suIt. l a volontaIrement cart les problemes touchant la comptabIlIt et
la fIscalIt dans la gestIon des portefeuIlles.
nvest gere des valeurs quI sont IdentIfIes par un numro NumVaIeur.
Chaque valeur possede un Cenre quI spcIfIe le type de valeur (une actIon
ou une oblIgatIon par exemple); une ranche IndIquant le domaIne d'actIvIt
conomIque (chImIe, assurance, banque, mtallurgIe ....); le Pays metteur
de la valeur; la monnaIe dans laquelle cette valeur est cote
honnaIeCotatIon; un lIbell pour la valeur LIbeIIeVaIeur. Dn luI assocIe
aussI une apprcIatIon Interne CatgorIe permettant de spcIfIer le type de
placement par rapport aux clIents (ScurIt, FevenuFIxe, SpculatIf, ...).
Pour les oblIgatIons, on trouve un supplment d'InformatIon, IndIquant le
taux d'Intrt Taux, aInsI que la premIere et la dernIere date d'chance des
coupons des oblIgatIons PremEcheance, 0ernEcheance. La premIere date
d'chance correspond une anne apres la date d'mIssIon.
Pour chaque valeur, on mmorIse un hIstorIque journalIer 0ateCotatIon des
Cours de la valeur dans sa monnaIe de cotatIon. Les portefeuIlles sont grs
en francs suIsses; pour effectuer les conversIons de monnaIes, on possede un
hIstorIque journalIer 0ateChange des cours de change CoursChange des
monnaIes trangere honnaIeEtrangere.
Un dossIer est constItu pour chaque clIent IdentIfI par un numro
NumCIIent. Pour chaque clIent, on enregIstre son Nom, Prnom, Adresse et
numro de TIphone. Le clIent peut mettre des contraIntes dans la
composItIon de son portefeuIlle, par exemple qu'Il ne veut pas plus de
100'000 FFS de valeurs spculatIves. Une contraInte assocIe donc un montant
maxImum hontanthax pour une catgorIe et un clIent.
Les transactIons sont IdentIfIes par un numro de transactIon unIque
NumTrans. Dn spcIfIe le clIent, la valeur, le type de transactIon TypeTrans
290 Modeliser et realiser une BD
(Achat, 7ente, SplIt, ....), la quantIt te, le montant de la transactIon
hontantTrans en francs suIsses et la date de la transactIon 0ateTrans.
Lorsqu'un clIent touche un revenu, on IdentIfIe celuIcI par un numro unIque
NumPevenu. Dn spcIfIe le clIent, la valeur, le type de revenu TypePevenu
(0IvIdende, CouponDblIg, ...), le montant du revenu hontantPevenu en
francs suIsses et la date du revenu 0atePevenu.
Le consultant pense qu'avec ces donnes, Il peut faIre des estImatIfs, des
InventaIres, vrIfIer des regles de gestIon (ne pas vendre des tItres que l'on
ne possede pas), etc ...
Domaine des constituants
Adresse texte
8ranchemot (chImIe, assurance, banque, mtallurgIe ....)
CategorIe mot (ScurIt, FevenuFIxe, SpculatIf, ...)
CoursChange nombre
Cours nombre
0ateChange date
0ateCotatIon date
0ateFevenu date
0ateTrans date
0ernEcheance date
Cenre mot (actIon, oblIgatIon, ....)
LIbelle7aleur texte
|onnaIeCotatIonmot (FFS, FF, 0|, SUS, ...)
|onnaIeEtrangeremot (FFS, FF, 0|, SUS, ...)
|ontant|ax nombre
|ontantFevenu nombre
|ontantTrans nombre
Nom mot
NumClIent entIer [1..99999]
NumFevenu entIer
NumTrans entIer
Num7aleur entIer [1..9999999999]
Pays mot
PremEcheance date
Prenom mot
Qte entIer
Taux nombre [0..100]
Telephone texte
TypeFevenu mot (0IvIdende, CouponDblIg, ...)
0e U|L SQL 291
TypeTrans mot (Achat, 7ente, SplIt, ....)
Semantique
Exemple de faIts mmorIser dans notre modele
Le clIent numro J42 se nommant Jean 0upont a achet hIer 100 actIons
amrIcaInes de 8IgHamburger (Numvaleur=140140) de la branche AlImentaIre
au cours de 14JS. Le taux de change taIt de 1.45 FFS/S. Aujourd'huI, Il a
touch un dIvIdende de 10J0 FFS sur ces mmes actIons. Ce clIent a spcIfI
qu'Il voulaIt un maxImum de 100'000 dans les tItres spculatIfs. L'oblIgatIon
de la banque du CasIno (Num7aleur = 1J01J0) est mIse pour 5 ans partIr
du 1 avrIl 2002 18
speculatiI:Categories 100'000 max:
140140:Valeurs
LibelleValeur : stringBigHamburger
Branche : stringAlimentaire
Pays : stringusa
:Revenus
DateOperationaujourd'hui
TypeRevenu : stringdividendes
MontantRevenu : real1030
LibelleValeur : stringBigHamburger
Branche : stringAlimentaire
Pays : stringusa
traite en
DateOperationaujourd'hui
TypeRevenu : stringdividendes
342:Dossiers
Nom : stringDupont
Prenom : stringJean
Nom : stringDupont
Prenom : stringJean
pour
en Iaveur
:Transactions
Qte : integer100
DateOperationhier
TypeTrans : stringachat
Qte : integer100
DateOperationhier
TypeTrans : stringachat
porter sur
130130:Obligations
LibelleValeur : stringBanque du casino
Taux : real18
PremEcheance : date1/4/2002
LibelleValeur : stringBanque du casino
Taux : real18
PremEcheance : date1/4/2002
MontantRevenu : real1030
$:Monnaies
143:
hier
1.45:
hier hier
hier
cote a
echange a
292 Modeliser et realiser une BD
Diagramme des classes
Relations
VaIeur (Num7aleur, LIbelle7aleur, 8ranche, Cenre, Pays,
|onnaIeCotatIon, CategorIe)
DbIIgatIon (Num7aleur, Taux, PremEcheance, 0ernEcheance)
Change (0ateChange, |onnaIeEtrangere, CoursChange)
CotatIon (Num7aleur, 0ateCotatIon, Cours)
0ossIer (NumClIent, Nom, Prenom, Adresse, Telephone)
Obligations
PremEcheance : date
Taux : real
DernEcheance : date
Changes
CoursChange : real
DateChange : date
Cotations
DateCotation : date
Cours : real
PremEcheance : date CoursChange : real
Cours : real
Valeurs
NumValeur : string
LibelleValeur : string
Branche : string
Genre : string
Pays : string
Oprations
DateOperation : date
NumOperation : integer
Revenus
TypeRevenu : string
MontantRevenu : real
DateOperation : date
NumOperation : integer
*
NumValeur : string
LibelleValeur : string
Branche : string
Genre : string
TypeRevenu : string
MontantRevenu : real
Dossiers
NumClient : integer
Nom : string
Prenom : string
Adresse : string
Telephone : string
Contraintes
MontantMax : integer MontantMax : integer
NumClient : integer
Nom : string
Prenom : string
Adresse : string
Telephone : string
*
*
*
1
1
compose
porte sur
1
Transactions
TypeTrans : string
Qte : integer
MontantTrans : real
TypeTrans : string
Qte : integer
MontantTrans : real
Catgories
CodeCategorie : string CodeCategorie : string
1
Pays : string
est
*
1
DateCotation : date
1
*
Taux : real
cours de
Monnaies
CodeMonnaie : string CodeMonnaie : string
1
*
traite en
DateChange : date
1
*
cours de
DernEcheance : date
0e U|L SQL 29J
TransactIon (NumTrans, NumClIent, Num7aleur, TypeTrans, 0ateTrans,
Qte, |ontantTrans)
Pevenu (NumFevenu, NumClIent, Num7aleur, TypeFevenu,
0ateFevenu, |ontantFevenu)
ContraInte (NumClIent, CategorIe, |ontant|ax)
Dependances fonctionnelles
1) Num7aleur LIbelle7aleur, 8ranche, Cenre Pays, |onnaIeCotatIon,
CategorIe
2) Num7aleur Taux, PremEcheance, 0ernEcheance
J) 0ateChange, |onnaIeEtrangere CoursChange
4) Num7aleur, 0ateCotatIon Cours
5) NumClIent Nom, Prenom, Adresse, Telephone
6) NumTrans NumClIent, Num7aleur, TypeTrans, 0ateTrans, Qte,
|ontantTrans
7) NumFevenu NumClIent, Num7aleur, TypeFevenu, 0ateFevenu,
|ontantFevenu
8) NumClIent, CategorIe |ontant|ax
1ables type
7aleur Num7aleur LIbelle7aleur 8ranche Cenre Pays |onnaIeCotatIon CategorIe
DblIgatIon Num7aleur Taux PremEcheance 0ernEcheance
Change 0ateChange |onnaIeEtrangere CoursChange
CotatIon Num7aleur 0ateCotatIon Cours
0ossIer NumClIent Nom Prenom Adresse Telephone
TransactIon NumTrans NumClIent Num7aleur Type
Trans
0ate
Trans
Qte |ontant
Trans
294 Modeliser et realiser une BD
Fevenu NumFevenu NumClIent Num7aleur Type
Fevenu
0ate
Fevenu
|ontant
Fevenu
ContraInte NumClIent CategorIe |ontant|ax
Sur la modelisation
Fpondre aux questIons suIvantes en basant vos arguments unIquement sur la
modlIsatIon
1) Peuton acheter une mme quantIt d'une valeur, le mme jour, un
mme prIx, pour un mme clIent:
2) SI on runIt les relatIons 7aleur et DblIgatIon dans une unIque relatIon:
7aleurbIs(Num7aleur, LIbelle7aleur, 8ranche, Cenre, Pays,
|onnaIeCotatIon, CategorIe, Taux, PremEcheance, 0ernEcheance)
donner les avantages et dsavantages qu'on obtIent, chercher la cl de
cette nouvelle relatIon et dIscuter des anomalIes de mIse jour aInsI
que du respect de la dcomposItIon
J) SI on runIt les relatIons 7aleur et CotatIon dans une unIque relatIon:
7aleurter (Num7aleur, LIbelle7aleur, 8ranche, Cenre, Pays,
|onnaIeCotatIon, CategorIe, 0ateCotatIon, Cours)
donner les avantages et dsavantages qu'on obtIent, chercher la cl de
cette nouvelle relatIon et dIscuter des anomalIes de mIse jour aInsI
que du respect de la dcomposItIon
4) ExplIcItez toutes les dpendances exIstentIelles vrIfIer sur la
modlIsatIon (sous la forme F[C] S[C] )
5) 0onnez l'ordre de cratIon quI permet de crer la relatIon
TransactIon (NumTrans, NumClIent, Num7aleur, TypeTrans, 0ateTrans,
Qte, |ontantTrans)
avec les clauses sur toutes les contraIntes d'IntgrIt
6) magInez une rI quI exIsteraIt dans le champ d'applIcatIon telle que:
a) une prImItIve de la relatIon TransactIon feraIt partIe de la porte de
cette rI et
b) cette rI ne pourraIt pas tre prIse en compte lors du CFEATE de la
relatIon TransactIon (donc elle ne peut fIgurer dans la rponse 5)
Requtes
Fpondre en SQL aux questIons suIvantes:
1) LIste des valeurs mIses en Espagne, pour lesquelles aucune
transactIon n'a t mIse, par ordre alphabtIque
0e U|L SQL 295
2) LIste des oblIgatIons franaIses et suIsses ayant une chance dans le
XX sIecle. ( rem : pour utIlIser une date apres 1999, utIlIser la fonctIon
to_date. ex: to_date('05|AF2020', '00|||YYYY') )
J) EtablIr un InventaIre (QTE actuelle pour chaque valeur d'un portefeuIlle)
pour le clIent J42
4) LIste des cotatIons du jour (22692) dans la monnaIe de base
5) LIste par pays des revenus perus entre le 1191 et le J11291 pour le
clIent 0upont (en le supposant unIque)
6) LIste des valeurs ayant gagn 20 dans les 6 dernIers moIs (dans leur
monnaIe de cotatIon). (rem : utIlIser la fonctIon
months_between(date1,date2))
Rgles d'integrite
...Le clIent peut mettre des contraIntes dans la composItIon de son
portefeuIlle, par exemple qu'Il ne veut pas plus de 100'000 FFS de valeurs
spculatIves. Une contraInte assocIe donc un montant maxImum pour une
catgorIe et un clIent... Ce montant est comparer avec la somme des
montants engags pour les valeurs de cette catgorIe. Le montant engag
pour une valeur est la somme des montants des transactIons concernant
cette valeur.
0onnez la porte de cette rI en remplIssant le tableau de contexte suIvant
(mettre une croIx sI la case appartIent la porte)
PrImItIve
/relatIon
Insrer Sup
prImer
maj maj maj maj maj maj maj
TransactIon Num
Tran
s
Num
ClIe
nt
Num
7ale
ur
Type
Tran
s
0ate
Trans
Qte |ont
antT
rans
7aleur Num
7ale
ur
LIbel
le7al
eur
8ran
che
Cenr
e
Pays |onn
aIeC
otatI
on
Cate
gorIe
0ossIer Num
ClIen
t
Nom Pren
om
Adre
sse
Tele
phon
e
contraInte Num
ClIen
t
Cate
gorI
e
|ont
ant|
ax
0onner une requte SQL quI permette de dtecter les contraIntes quI ne sont
pas respectes dans un dossIer
0e U|L SQL 297
J9. SLCUR
Lnonce
La fIducIaIre SECUF est spcIalIse dans la gestIon des fonds de prvoyance.
Ce march est en pleIne expansIon depuIs que l'tat avaIt rendu oblIgatoIre
l'adhsIon de tous les salarIs d'une entreprIse un fond de prvoyance
convrant l'InvalIdIt et la retraIte. 0es centaInes de fond de prvoyance
s'taIent crs travers tout le pays. Les entreprIses avaIent confIs la
gestIon des fonds des InstItutIons fInancIeres et s'taIent dcharges de la
partIe comptable et admInIstratIve sur les fIducIaIres.
SECUF dans une phase de nouveau dveloppement InformatIque a entreprIs
l'tude d'une base de donnes permettant de grer les InformatIons
ncessaIres ces fonds de prvoyance.
Le champ d'applIcatIon couvert par les ImpratIfs de la gestIon de cette
compagnIe de transport concerne donc la parc de vhIcules, son entretIen,
l'admInIstratIon de chauffeurs et de leur emploI du temps, la gestIon des
appels des clIents la centrale tlphonIque.
Le texte quI suIt est une descrIptIon du champ d'applIcatIon tel qu'Il apparat
la suIte d'une tude avec les comptables (les mots en style gras sont les
constItuants quI sont retenus dans la modlIsatIon)
ExtraIt du rapport
Un fond de prvoyance est IdentIfI par un IdentIfIcateur unIque IdentFond.
Le fond est connu sous une raIson socIale PaIsonFond ayant une adresse
AdrFond pour la correspondance. Une personne cotIsant un fond est un
assur, IdentIfI par un numro IdentAssur. Une personne peut tre
assure par plusIeurs fonds. Un assur est dcrIt par un numro de ScurIt
socIale NumAVS, Il possede un nom Nom, un prnom Prnom, une date de
naIssance NaIssAssur, un sexe Sexe, un tat cIvIl EtatCIvII.
Pour effectuer des calculs actuarIels, Il taIt aussI ncessaIre de connatre
des InformatIons sur les membres de la famIlle de l'assur. Pour les enfants
d'un assur, on enregIstre leur prnom PrnomEnfant et leur date de
naIssance NaIssEnfant. 0ans le cas ou un assur et marI, on doIt aussI
connatre le prnom du conjoInt PrnomConjoInt et sa date de naIssance
NaIssConjoInt.
Un assur faIt partIe d'une certaIne catgorIe CatgorIeAssur par rapport
aux fonds, Il est soIt actIf (verse ses cotIsatIons annuelles), InvalIde (est au
bnfIce d'une rente d'InvalIdIt), retraIt (est au bnfIce d'une rente de
retraIte), dcd (son conjoInt est au bnfIce d'une rente de survIvant
et/ou ses enfants sont au bnfIce d'une rente d'orphelIn) ou quItt (
quItter ce fond, ses cotIsatIons ont t verse sur un autre fond) Un taux
298 Modeliser et realiser une BD
Taux d'actIvIt ou d'InvalIdIt doIt tre IndIqu pour ces catgorIes.
L'appartenance ces catgorIes est hIstorIse, c'est dIre que l'on IndIque le
dbut 0butPrIode et la fIn de la prIode FInPrIode ou l'assur
appartenaIt une catgorIe. En ne spcIfIant pas la fIn de la prIode (valeur
nulle), on IndIque qu'Il s'agIt de la catgorIe actuelle. Ces catgorIes sont
exclusIves entre elles, sauf dans le cas d'une InvalIdIt partIelle ou l'on
admet que l'assur peut avoIr une actIvIt partIelle (la somme des taux ne
devant pas excder 100)
Chaque anne, les assurs actIfs doIvent verser une cotIsatIon
hntCotIsatIon. Cette cotIsatIon est dtermIne en applIquant un certaIn
taux personnel TauxPersonneI au salaIre annuelle SaIaIreAnnueI de l'assur.
Ce taux de partIcIpatIon personnel TauxPartIcIpatIon est tablI en fonctIon
du sexe de l'assur et de son age. 0e plus chaque anne, l'tat fIx une
fourchette mImum SaIaIrehIn et maxImum SaIaIrehax pour les salaIres
soumIs la partIcIpatIon au fond de prvoyance. 0'autres types de cotIsatIon
TypeCotIsatIon sont possIbles, l'apport InItIal quand un assur rentre dans le
fond, la cloture quand un assur quItte le fond, les Intrts annuels. Le
montant d'une cotIsatIon est posItIf sauf dans le cas de la cloture.
Les prestatIons hntPrestatIon verses mensuellement un assur. Dn note
le dbut 0butPrestatIon et la fIn FInPrestatIon de la prIode pendant
laquelle on verse une certaIne rente. Dn IndIque aussI le type de prestatIon
verse TypePrestatIon.
Domaine des constituants
AdrFond texte
Age entIer [18..120]
Anne entIer [1980..2100]
CatgorIeAssur mot (actIf,InvalIde,retraIt,dcd,quItt)
0ateCotIsatIon date
0butPrIode date
0butPrestatIon date
EtatCIvIl mot (clIbataIre,marI,dIvorc,veuf_ve)
FInPrIode date
FInPrestatIon date
dentAssur entIer [10000..99999]
dentFond entIer[100..999]
|ntCotIsatIon rel
|ntPrestatIon rel
NaIssAssur date
NaIssConjoInt date
NaIssEnfant date
Nom texte
0e U|L SQL 299
NumA7S entIer [10000000000..99999999999]
Prnom texte
PrnomConjoInt texte
PrnomEnfant texte
FaIsonFond texte
SalaIreAnnuel rel
SalaIre|ax rel
SalaIre|In rel
Sexe mot (H,F)
TauxPartIcIpatIonrel [0..1]
TauxPersonnel rel
Taux rel [0..100]
TypeCotIsatIon mot(ApportnItIal, CotIsAnnuelle, ntrtAnnuel, Cloture)
TypePrestatIon mot (rente,InvalIdIt,survIvant,orphelIn)
Schema des relations
arme (Sexe, Age, TauxPartIcIpatIon)
Fourchette (Anne, SalaIre|In, SalaIre|ax)
Assur (dentAssur, NumA7S, Nom, Prnom, Sexe, NaIssAssur,
EtatCIvIl)
0ansFond (dentAssur, dentFond)
ConjoInt (dentAssur, PrnomConjoInt, NaIssConjoInt)
Fond (dentFond, FaIsonFond, AdrFond)
Enfant (dentAssur, PrnomEnfant, NaIssEnfant)
CatgorIe (dentAssur, 0butPrIode, CatgorIeAssur, FInPrIode,
Taux)
CotIsatIon (dentAssur, dentFond, TypeCotIsatIon, 0ateCotIsatIon,
SalaIreAnnuel, TauxPersonnel, |ntCotIsatIon)
PrestatIon (dentAssur, dentFond, TypePrestatIon, 0butPrestatIon,
FInPrestatIon, |ntPrestatIon)
Dependances fonctionnelles
(les Instances des relatIons valIdent ces d.f. !)
1) Sexe,Age TauxPartIcIpatIon
2) Anne SalaIre|In, SalaIre|ax
J) dentAssur NumA7S, Nom, Prnom, Sexe, NaIssAssur, EtatCIvIl,
PrnomConjoInt, NaIssConjoInt
4) dentFond FaIsonFond, AdrFond
5) dentAssur,PrnomEnfant NaIssEnfant
300 Modeliser et realiser une BD
6) dentAssur,0butPrIode,CatgorIeAssur FInPrIode, Taux
7) dentFond, dentAssur,TypeCotIsatIon,0ateCotIsatIon SalaIreAnnuel,
TauxPersonnel, |ntCotIsatIon
8)dentFond, dentAssur,TypePrestatIon,0butPrestatIon FInPrestatIon,
|ntPrestatIon
9) 0ateCotIsatIon, NaIssAssur Age
10) NumA7S dentAssur
Diagramme des cas d'utilisation
Secur
Assure actiI
Gestionnaire du Iond
Cotiser
InIormer les assures
Assure preste
Actuaire
Calculer les risques
Verser les prestations
Organe de contrle
Surveiller
0e U|L SQL J01
Diagramme des classes
Semantique
FemplIr les tables correspondant aux Instances des relatIons afIn d'exprImer
le texte quI suIt:
Assurs
NumAVS : string
IdentAssure : real
Nom : string
Prenom : string
NaissAssure : date
EtatCivil : string
Enfants
PrenomEnIant : string
NaissEnIant : date
Catgories
DebutPeriode : date
FinPeriode : date
TypeCotisation : date
Taux : integer
NumAVS : string
IdentAssure : real
Nom : string
Prenom : string
NaissAssure : date
EtatCivil : string
PrenomEnIant : string
NaissEnIant : date
Prestations
TypePrestation : string
DebutPrestation : date
FinPrestation : date
MntPrestation : real
Cotisations
typeDeCotisation : string
DateCotisation : date
SalaireAnnuel : real
TauxPersonnel : real
MntCotisation : real
Conjoints
PrenomConjoint : string
NaissConjoint : date
TypePrestation : string
DebutPrestation : date
FinPrestation : date
MntPrestation : real
typeDeCotisation : string
DateCotisation : date
SalaireAnnuel : real
TauxPersonnel : real
MntCotisation : real
PrenomConjoint : string
NaissConjoint : date
DebutPeriode : date
FinPeriode : date
TypeCotisation : date
Taux : integer
Fonds
IdentFond : string
RaisonFond : string
AdrFond : string
IdentFond : string
RaisonFond : string
AdrFond : string
Fourchettes
Annee : undeIined
SalaireMin : real
SalaireMax : real
Barmes
TauxParticipation : real
Sexe : char
Age : integer
TauxParticipation : real
Sexe : char
Age : integer
Annee : undeIined
SalaireMin : real
SalaireMax : real
302 Modeliser et realiser une BD
En 199J, le salaIre assujettI mInImum et maxImum sont respectIvement
18'000. et 56'000.. L'assur (No 147J9) actIf 100 depuIs le J/11/1985 est
|. 0upond Paul n en 4/10/1950 marI HenrIette ne le 19/2/1952. ls ont
deux enfants |arIe ne le 1/9/1974 et Edgar n le 4/2/1977, Pour les
hommes de 4J ans le taux est de 11. Une CotIsatIon annuelle au J1/12/90 a
t enregIstre pour |. 0upond pour un salaIre de 48600. l est membre du
fond LIfe portant le numro 421.
1able type
8arme Sexe Age TauxPartIcIpatIon
Fourchette Anne SalaIre|In SalaIre|ax
Assur dent
Assur
NumA7S Nom Prnom Sexe NaIssAssur Etat
cIvIl
0ansFond dentAssur dentFond
ConjoInt dentAssur PrnomConjoInt NaIssConjoInt
Enfant dentAssur PrnomEnfant NaIssEnfant
Fond dentFond FaIsonSocIale AdrFond
CatgorIe dentAssur 0but
PrIode
CatgorIe
Assur
FIn
PrIode
Taux
CotIsatIon dent
Assur
dent
Fond
Type
CotIsatIon
0ate
CotIsatIon
SalaIre
Annuel
Taux
Personnel
|nt
CotIsatIon
0e U|L SQL J0J
PrestatIon dent
Assur
dent
Fond
Type
PrestatIon
0but
PrestatIon
FIn
PrestatIon
|nt
PrestatIon
Sur la modelisation
Fpondre aux questIons suIvantes en basant vos arguments unIquement sur la
modlIsatIon
1) Un assur peutIl avoIr un nombre dIffrent d'enfant pour deux
fonds dont Il est adhrent:
2) Un assur peutIl avoIr pour une date de cotIsatIon donne
plusIeurs taux de partIcIpatIon:
J) Un assur peutIl tre sImultanment dans les catgorIes InvalIde,
retraIt et quItt :
4) En utIlIsant F01 (l'outIl rechercher des cls du laboratoIre de
80), avec les dpendances fonctIonnelles de l'nonc, on trouve
les cl suIvantes.
Anne IdentAssur IdentFond PrnomEnfant 0butPrIode
CatgorIeAssur TypeCotIsatIon 0ateCotIsatIon TypePrestatIon
0butPrestatIon
Anne NumAvs IdentFond PrnomEnfant 0butPrIode
CatgorIeAssur TypeCotIsatIon 0ateCotIsatIon TypePrestatIon
0butPrestatIon
En supposant que l'on substItue partout le constItuant NumAVS au
constItuant IdentAssur, en justIfIant votre rponse avec la
thorIe, dfInIr ce que trouvera F01 apres une telle substItutIon.
5) 0crIvez ce quI se passe, sI l'on supprIme la relatIon 0ansFond
(IdentAssur, IdentFond) et que l'elle soIt remplace par la vue
suIvante:
CREATE VIEW DansFond (IdentAssur, IdentFond)
AS SELECT distinct IdentAssur, IdentFond
FROM cotisation;
6) ExplIcItez les dpendances fonctIonnelles exIstentIelles vrIfIer
sur la modlIsatIon (sous la forme F[C] S[C] ):
Requtes
Fpondre en SQL aux questIons suIvantes:
1) 0onnez une lIste de tous les fonds par ordre alphabtIque
2) 0onnez la lIste des assurs du fond 'ForEver' par ordre
alphabtIque
304 Modeliser et realiser une BD
J) 0onnez le montant total des cotIsatIons de |.SmIth (pour tous les
fonds)
4) 0onnez le montant total des prestatIons par type de prestatIon
pour le fond No 421
5) 0onnez la rpartItIon des tats cIvIl en pour l'ensemble des
fonds
6) 0onnez la lIste des personnes quI taIent retraItes le 1jan90
dans le fond 'ForEver'
7) Trouver toutes les cotIsatIons quI ne font pas rfrence un
assur
Rgles d'integrite
...Cette cotIsatIon est dtermIne en applIquant un certaIn taux personnel
TauxPersonneI au salaIre annuelle SaIaIreAnnueI de l'assur. Ce taux de
partIcIpatIon personnel TauxPartIcIpatIon est tablI en fonctIon du sexe de
l'assur et de son age...
0onnez la porte de cette rI en remplIssant le tableau de contexte suIvant
(mettre une croIx sI la case appartIent la porte)
PrImItIve
/relatIon
Insrer Sup
prImer
maj maj maj maj maj maj maj
Assur de
ntA
ssur
Nu
mA
7S
Nom Prn
om
Sexe NaIs
sAss
ur
Eta
tcIv
Il
CotIsatIon de
ntA
ssur
Typ
eCo
tIsa
tIon
0ate
CotI
satIo
n
SalaI
reAn
nuel
Taux
Pers
onne
l
|nt
CotI
satI
on
de
ntF
ond
8arme Sex
e
Age Taux
PartI
cIpa
tIon
0onner une requte SQL quI permette de dtecter les cotIsatIons quI n'ont
pas le bon taux par rapport l'age de la personne au moment de la
cotIsatIon .
(l'expressIon suIvante calcule l'age de la personne !)
to_char(0ateCotIsatIon),'YYYY')to_char(0ateCotIsatIon),'YYYY')
0e U|L SQL J05
20. UL1IMA
Lnonce
Une socIt fabrIquant des composants lectronIques a dcId de faIre
voluer ses applIcatIons de gestIon. Elle a choIsI de les Implanter l'aIde d'un
systeme de gestIon de base de donnes relatIonnelle et aInsI de remplacer
ses applIcatIons crItes en CD8DL avec des fIchIers squentIels Indexs.
Cependant l'IntgratIon et le partage des InformatIons par plusIeurs
applIcatIons ont faIt merger de manIere aIgue le probleme de la scurIt et
de la confIdentIalIt. En effet, comment donner acces la table des
personnes aux applIcatIons de controle de productIon sans leur donner acces
aux salaIres de ces mmes personnes.
Un groupe scurIt ULT|A a donc t form pour tudIer ce probleme.
L'Ide tant que la scurIt doIt tre Intgre des le dbut dans la
conceptIon des autres applIcatIons.
Le groupe ULT|A a tudI la structure organIsatIonnelle de l'entreprIse,
savoIr qu'une personne est IdentIfIe par un numro d'employ NumEmp et
dcrIte par un Nom, un Prnom et qu'elle travaIlle pour un seul
dpartement 0ept. Un dpartement peut dpendre hIrarchIquement d'un
autre dpartement 0eptSup. LIbeIIe0ept est une descrIptIon tendue du
dpartement.
Un rsultat de l'tude de ULT|A est que la structure organIsatIonnelle de
l'entreprIse n'est pas adquate pour grer la confIdentIalIt des donnes. En
effet, des personnes travaIllant au seIn d'un mme dpartement ont acces
des InformatIons dIffrentes, l'apprentI du bureau du personnel et son
dIrecteur ont des droIts dIffrents. Cependant cette structure a t
conserve car elle peut mettre en vIdence les InformatIons partages par
les dIffrents dpartements.
Une autre structure taIt donc ncessaIre. Elle est dcrIte par un groupe
d'InformatIons IdentIfI par Croupe, (avec un lIbell LIbeIIeCroupe). 0e plus
un groupe peut hrIter les InformatIons d'un autre groupe HerIte0e. Un
employ peut aInsI tre rattach aux dIffrents groupes d'InformatIon
auxquels Il a droIt par dfaut.
Ce systeme tant dans un premIer temps lImIt aux InformatIons du SC80
(lettres, feuIlles de calcul ne sont pas Inclues), les InformatIons sont donc les
tables IdentIfIes par NomTabIe et une descrIptIon SemantIque aInsI que le
nombre d'entIts approxImatIfs NbrEntItes. Les constItuants des tables sont
IdentIfIs par NomConstItuant, un Type et un degr de SecurIte (0 publIc ...
9 = tres confIdentIel ) est aussI donn
306 Modeliser et realiser une BD
La descrIptIon des droIts par dfaut est donne par un 0roIt, que l'on
attrIbue un groupe sur le constItuant d'une table sur une certaIne prIode
(de 0but FIn)
La descrIptIon des droIts personnels est donne par un 0roIt, que l'on
attrIbue un groupe sur le constItuant d'une table sur une certaIne prIode
(de 0but FIn). Ces droIts sont ceux qu'une personne en plus des droIts
donns par son rattachement aux groupes d'InformatIon.
La fIgure suIvante montre les lIens d'hrItage, la personne rattache au
groupe C2 possede par hrItage les droIts du groupe C0.
Domaine des constituants
0ebut date
0ept mot (Compta SalaIre, FabrIc, Pers, nform ....)
0eptSup mot (Compta SalaIre, FabrIc, Pers, nform ....)
0roIt mot (SELECT, CFEATE, delete, update)
FIn date
Croupe mot (FessHum, Adresse, PrIx, ComtaCen, ...)
HerIte0e mot (FessHum, Adresse, PrIx, ComtaCen, ...)
LIbelle0ept texte
LIbelleCroupe texte
NbrEntItes entIer
NomConstItuant mot (Tous_Cst, Nom, 0ate7aleur, PIece, ...)
NomTable mot (Employe, EcrIture, Nomemclature, ...)
G0
G1
G2
G3
G4
droit
hrite
rattach
droit
personnel
0e U|L SQL J07
Nom texte
NumEmp entIer [1..99999]
Prenom texte
SecurIte entIer [0..9]
SemantIque texte
Type mot (Integer, char, date, real)
Relations
(une cl de la relatIon est IndIque par un soulIgnement)
0epartement (0ept, 0eptSup, LIbelle0ept)
Personnes (NumEmp, 0ept, Nom, Prenom)
Croupes (Croupe, HrIte0e, LIbelleCroupe)
Pattacher (NumEmp, Croupe)
TabIes (NomTable, SemantIque, NbrEntItes)
ConstItuants (NomTable,NomConstItuant, Type, SecurIte)
0roItCroupe (Croupe, NomTable, NomConstItuant, 0roIt, 0but, FIn)
0roItPers (NumEmp, NomTable, NomConstItuant, 0roIt, 0but, FIn)
Dn admet aussI pour la suIte de l'nonc qu'Il exIste une vue
TousLesCroues(6rpRccne,6rpAncetre)
quI pour un groupe racIne donne tous les anctres (c'est dIre tous les
groupes dont Il hrIte) CecI permet d'avoIr explIcItement la lIste des groupes
auxquels on a acces travers le mcanIsme d'hrItage.
Dependances fonctionnelles
(les Instances des relatIons valIdent ces d.f. !)
1) 0ept 0eptSup, LIbelle0ept
2) NumEmp 0ept, Nom, Prenom
J) Croupe HerIte0e, LIbelleCroupe
4) NomTable SemantIque, NbrEntItes
5) NomTable,NomConstItuant Type, ScurIt
6) Croupe,NomTable,NomConstItuant,0roIt,0but FIn
7) NumEmp,NomTable,NomConstItuant,0roIt,0but FIn
308 Modeliser et realiser une BD
Diagramme des classes
Semantique
FemplIr les tables correspondant aux Instances des relatIons afIn d'exprImer
le texte quI suIt:
Jean SrIen (employ numro 54) travaIlle au dpartement Fourn (les
fournIsseurs) quI dpend de la Compta. l a acces au groupe Four_CA quI
contIent les InformatIons sur les chIffres d'affaIres et hrIte du groupe
Four_SocIal, les InformatIons sur les raIsons socIales des fournIsseurs. La
table HIsto_Four_CA, l'hIstorIque des chIffres d'affaIre contIent envIron
10'000 ranges. Elle est compose entre autre d'une colonne Annee et d'une
Dpartements
LibelleDept : string
Dept : string
Groupes
LibelleGroupe : string
Groupe : string
Tables
NomTable : string
Semantique : string
NbrEntites : integer
Constituants
NomConstituant : string
Type : string
Securite : integer
LibelleDept : string
LibelleGroupe : string
*
NomTable : string
Semantique : string
NbrEntites : integer
enIant
Type : string
Securite : integer
Personnes
Numemp : integer
Prenom : string
Nom : string
DroitPers
Droit : string
Debut : date
Fin : date
Numemp : integer
Prenom : string
NomConstituant : string
Droit : string
Debut : date
Fin : date
Nom : string
*
Dept : string
* 1
*
Groupe : string
*
*
appartient
inI
rattache a
*
DroitGroupe
Droit : string
Debut : date
Fin : date
*
*
Droit : string
Debut : date
Fin : date
* 1
base sur
1
1
sup
inclus
parent
herite
0e U|L SQL J09
colonne CA. CA est de type real avec un degr de scurIt 6. Annee est de
type Integer avec un degr de scurIt 0. Le groupe Four_CA a le droIt
SELECT sur CA et Jean SrIen a le droIt update sur CA depuIs le 1192
1ables 1ype
0epartement 0ept 0eptsup LIbelle0ept
Croupes Croupe HerIte0e LIbelleCroupe
Personnes Numemp 0ept Nom Prenom
Fattacher Numemp Croupe
Tables NomTable SemantIque NbrEntItes
ConstItuants NomTable NomConstItuant Type SecurIte
0roItCroupe Croupe NomTable NomConstItuant 0roIt 0ebut FIn
0roItPers Numemp NomTable NomConstItuant 0roIt 0ebut FIn
Sur la modelisation
Fpondre aux questIons suIvantes en basant vos arguments unIquement sur la
modlIsatIon
1) Une personne peutelle tre assocIe une table, un constItuant
et un droIt IdentIque pour des prIodes dIffrentes (dbut fIn):
310 Modeliser et realiser une BD
2) En supprImant le constItuant HerIte0e, peuton encore exprImer
des InformatIons IdentIques dans la 80 (sI ouI comment, sInon
pourquoI):
J) ExplIcItez les dpendances fonctIonnelles exIstentIelles vrIfIer
sur la modlIsatIon (sous la forme F[C] S[C] )
4) 0onnez l'ordre de cratIon quI permet de crer la relatIon
0roItCroupe (Croupe, NomTable, NomConstItuant, 0roIt, 0but,
FIn)
avec les clauses sur les contraIntes d'IntgrIt
5) 0onnez un exemple de rI quI pourraIt exIster dans ce champ
d'applIcatIon et quI ne peut tre prIs en compte lors du CFEATE
pour la relatIon 0roItCroupe (donc quI ne peut fIgurer dans la
rponse 4)
6) En ajoutant la df NumEmp Croupe, que cela sIgnIfIet'Il et
comment peutt'on en tenIr compte dans la dcomposItIon:
Requtes
Fpondre en SQL aux questIons suIvantes:
1a) Trouver la lIste des employs ayant explIcItement acces au groupe
d'InformatIon Four_CA
1b) Trouver la lIste des employs ayant ImplIcItement acces au groupe
d'InformatIon Four_CA
2) Trouver les employs quI ont acces (SELECT,maj,...) au
constItuant SalaIre, travers les droIts de groupe.
J) 0onner le degr moyen, max de scurIt du groupe Four_CA
(sans tenIr compte des constItuants hrIts) en fonctIon du degr
de scurIt des constItuants auxquels Il a acces
4) 0onnez les nouveaux droIts du groupe Four_CA entre le 1191 et
le 1192
5) Le nombre d'employs par dpartement
6) Les groupes dont aucun autre est hrItIer.
Rgles d'integrite
En reprenant l'nonc, le groupe ULT|A ajouter que l'hrItage doIt se
faIre de manIere prserver un ordre par rapport au degr de scurIt des
groupes (dfInI comme le maxImum du degr des constItuants auxquels Il a
acces). 0onc Un groupe ne peut hrIter que d'un groupe ayant un degr
InfrIeur ou gal
0onnez la porte de cette rI en remplIssant le tableau de contexte suIvant
(mettre une croIx sI la case appartIent la porte)
PrImItIve
/relatIon
Insrer Sup
prImer
maj maj maj maj maj maj
0roItCrou
pe
Croupe NomTable NomConst
Ituant
0roIt 0ebut FIn
0e U|L SQL J11
ConstItuan
ts
NomTable NomConst
Ituant
Type SecurIte
Croupe Croupe HerIte0e LIbelleCr
oupe
0onner une requte SQL quI permette de dtecter les groupes quI ne
satIsfont pas la regle.
0e U|L SQL J1J
2J. BIGSMAC
La socIt 8Csmac est, depuIs cInq ans, spcIalIse dans la vente
d'ordInateurs IndIvIduels. Elle a faIt face plusIeurs tourmentes dans le
pass: changement de structures du march, chute des prIx, dIversIfIcatIon
des produIts et des servIces. Actuellement, elle veut prendre une part actIve
sur un march dcentralIs, tendu aux clIents loIgns des grandes
concentratIons urbaInes. Pour cela, elle dsIre mettre au poInt une base de
donnes accessIble par mInItel. Le clIent peut y trouver les servIces suIvants:
tre conseIll sur la confIguratIon adapte ses besoIns
acheter des artIcles au dtaIl
accder aux donnes technIques des produIts
connatre la compatIbIlIt entre les produIts
connatre les dlaIs de lIvraIson pour les artIcles hors stock
Apres une premIere runIon, on a obtenu les InformatIons quI suIvent.
Un clIent est IdentIfI par son NoCIIent, on luI connat un nom, un prnom,
une adresse et un numro de Carte de CrdIt NoCarteCrdIt par lequel on
luI dbIte son compte pour ses commandes. Une commande est IdentIfIe
par son NoCmd; on luI assocIe une date dateCmd, un dIaI quI correspond
au dlaI maxImum de lIvraIson des artIcles de la commande et le prIx total
de la commande prIx_Cmd. La commande se dcompose en lIgnes, chacune
correspondant un artIcle (quantIt de 1). Une InformatIon IndIque sI
l'artIcle est rserv dans le stock dans le cas ou toute la commande n'est pas
encore lIvrable. Un prIx est IndIqu pour chaque artIcle. Un artIcle est
IdentIfI par sa catgorIe et un NoArt.
Pour dfInIr certaInes confIguratIons type, 8Csmac a dfInI des usages
(domestIque, bureau, serveur, CAD, PAD, ...) pour orIenter le clIent. Use est
le code de l'usage et IIb_usage son lIbell. Aux usages sont assocIs des
logIcIels et des confIguratIons. Une confIguratIon est IdentIfIe par un
NoConfIg; elle est dcrIte par le lIbell IIb_confIg, un rabaIs est accord sur
tous les artIcles de la confIguratIon et le prIx total correspond prIx_confIg.
0ans une confIguratIon peut entrer les catgorIes d'artIcles suIvantes:
CatInDut: les ImprImantes et scanners quI sont dcrIts par les parametres
technIques.
taIIIe_doc la taIlle du document (A4, AJ)
prcIsIon_dpI la prcIsIon des ImpressIons (J00, 600, ...)
coIor la possIblIt d'ImprImer en couleur
nbr_coIor le nombre de couleurs
vItesse la vItesse d'ImpressIon en pages par mInute
314 Modeliser et realiser une BD
Cat0Isque: les dIsques et les moyens de stockages auxIlIaIres quI sont dcrIts
par les parametres technIques.
VItesse_de transfert en |8ytes par seconde
accs_moyen le temps moyen d'un acces une InformatIon
capacIt la capacIt de stockage
crIture la possIbIlIt d'crIre (C0FD|)
CatEcran: les crans quI sont dcrIts par les parametres technIques.
TaIIIe en pouces
pt_haut le nombre de poInts en hauteur
pt_Iarg le nombre de poInts en largeur
coIor la possIblIt d'affIcher en couleur
nbr_coIor le nombre de couleurs
CatCPU: les unIts centrales avec processeur quI sont dcrItes par les
parametres technIques.
processeur son type
horIoge la vItesse de son horloge
FPU l'exIstence d'une unIt arIthmtIque
ethernet l'exIstence d'une Interface de communIcatIon
nb_sIot le nombre de cartes d'Interface possIble
CatAcc: les accessoIres quI sont dcrIts par les parametres technIques.
IIb_accessoIre une descrIptIon
CatLog: les logIcIels quI sont dcrIts par les parametres technIques.
IogIcIeI une descrIptIon
versIon le numro de versIon
domaIne le domaIne d'utIlIsatIon
mmoIre_exIge la mmoIre recommande par le fabrIcant
Une confIguratIon assocIe donc un certaIn nombre de ces artIcles. Au
mInImum, Il faut un CPU, un dIsque et un cran. Le clIent peut aussI
effectuer sa propre confIguratIon; pour cela Il est aId dans la dtectIon des
IncompatIlIts entre un CPU et des artIcles.
Pour chaque artIcle, on constItue un hIstorIque des prIx et des quantIts
achetes ces condItIons. 0ans un Intervalle de temps (depuIs jusqu), on a
le prIx d'achat (prIx_achat), le prIx clIent (prIx_cIIent), la quantIt encore
en stock (qte_stock) et le dIaI de raprovIsIonnement. Ces donnes
permettent de fIxer le prIx des confIguratIons et des commandes. Dn peut
aussI calculer les marges et les prIx moyens d'achat et de ventes sur des
artIcles restant en stock.
Le consultant pense qu'avec ces donnes, Il peut satIsfaIre les demandes
prIncIpales exprImes par la socIt.
0e U|L SQL J15
Domaine des constituants
acces_moyen nombre (en mIllIsecondes)
adresse texte
capacIt entIer [1..99999] (en |8ytes)
Cat mot (ACC, CPU, 0SK, ECF, D, LDC)
CatAcc mot (ACC)
CatCPU mot (CPU)
Cat0Isque mot (0SK)
CatEcran mot (ECF)
CatnDut mot (D)
CatLog mot (LDC)
color mot (non, ouI)
dateCmd date
dlaI entIer [1..52] (en semaInes)
depuIs date
domaIne mot (jeux, traIt_texte, tableur, sgbd, dessIn,... )
crIture mot (non, ouI)
ethernet mot (non, ouI)
FPU mot (non, ouI)
horloge nombre [10..1000] (en |Hz)
jusqu date
lIb_accessoIre texte
lIb_confIg texte
lIb_logIcIel texte
lIb_usage texte
mmoIre_exIgeentIer [1..16000] ( en K8ytes)
nbr_color entIer [1..24]
nb_slot entIer [1..8]
NoArt entIer [1..99999]
NoArt_cpu (Idem que NoArt)
NoCarteCrdIt texte
NoClIent entIer [1..99999]
NoCmd entIer [1..99999]
NoConfIg entIer [1..99999]
nom texte
prnom texte
prcIsIon_dpI entIer [1..2400] (en poInts par pouce)
prIx nombre
316 Modeliser et realiser une BD
prIx_achat nombre
prIx_clIent nombre
prIx_Cmd nombre
prIx_confIg nombre
processeur mot(68040, 68060, 80J86, 80486, ...)
pt_haut entIer [100..2400]
pt_larg entIer [100..2400]
qte_stock entIer [0..1000]
rabaIs_confIg nombre
remarque texte
rserv entIer [0..1]
TaIlle entIer [9..21] (en pouces)
taIlle_doc mot(A4, AJ, ....)
use mot (domestIque, bureau, serveur, CAD, PAD, ...)
versIon texte
vItesse entIer [1..100] (en pages par mInute)
vItesse_transfert nombre (en |8ytes par seconde)
Diagramme des classes
L'vIdence de ce cas est la relatIon d'hrItage suIvante :
Disques
vitesseTransIert : integer
accesMoyen : integer
capacite : integer
ecriture : boolean
UniteCPU
Processeur : string
horloge : integer
FPU : boolean
ethernet : boolean
nbslot : integer
Logiciels
memoireExigee :
integer
version : string
liblogiciel :
string
Domaine : string
memoireExigee :
integer
Processeur : string
Article
NoArt : integer
Ecrans
nbrcolor : integer
Taille : integer
pthaut : integer
ptlargeur : integer
color : boolean
Accessoires
Libaccessoire : string
InOut
TailleDoc : string
PrecisionDPI : integer
color : boolean
nbrcolor : integer
vitesse : string
version : string
liblogiciel :
string
Domaine : string
nbrcolor : integer
Taille : integer
pthaut : integer
ptlargeur : integer
color : boolean
NoArt : integer
TailleDoc : string
PrecisionDPI : integer
color : boolean
nbrcolor : integer
vitesse : string
vitesseTransIert : integer
accesMoyen : integer
capacite : integer
ecriture : boolean
Libaccessoire : string
horloge : integer
FPU : boolean
ethernet : boolean
nbslot : integer
0e U|L SQL J17
Justement les vIdences sont trompeuses et dans le cas prsent, la dIversIt
et l'volutIon possIble du matrIel vendre seraIt mIeux gr par la
modlIsatIon suIvante :
Utilisations
Libusage : string
Use : integer
Configurations
rabaisconIig : integer
libconIig : string
prixconIig : real
Logiciels
Compatible
Remarque : string
Libusage : string
rabaisconIig : integer
*
1
1
*
Clients
NoClient : integer
Nom : string
Prenom : string
Adresse : string
NoCarteCredit : string
Commandes
NoCmd : integer
dateCmd : date
delai : date
prix : real
NoCmd : integer
dateCmd : date
delai : date
prix : real
NoClient : integer
Nom : string
Prenom : string
Adresse : string
NoCarteCredit : string
*
1
Prix
depuis : date
jusqua : date
prixClient : real
prixAchat : real
Qtestock : integer
delai : integer
depuis : date
jusqua : date
prixClient : real
prixAchat : real
Qtestock : integer
delai : integer
*
LigneCMD
reserve : integer
Prix : real
libconIig : string
prixconIig : real
*
*
reserve : integer
Prix : real
* *
*
1
Article
NoArt : integer
Disques Ecrans UniteCPU Accessoires InOut
Use : integer
*
Remarque : string
NoArt : integer
*
*
318 Modeliser et realiser une BD
Relations
(une cl de la relatIon est IndIque par un soulIgnement)
ClIents (NoClIent, nom, prnom, adresse, NoCarteCrdIt)
Commande (NoCmd, NoClIent, dateCmd, dlaI, prIx_Cmd)
LIgne_Cmd (NoCmd, Cat, NoArt, rserv, prIx)
UtIlIsatIon (use, lIb_usage)
FaIt_pour (use, CatLog, NoArt)
ConseIll (use, NoConfIg)
ConfIguratIon ( NoConfIg, lIb_confIg, rabaIs_confIg, prIx_confIg)
nConfIg (NoConfIg, Cat, NoArt)
nDut (CatnDut, NoArt, taIlle_doc, prcIsIon_dpI, color,
nbr_color, vItesse)
0Isques (Cat0Isque, NoArt, vItesse_transfert, acces_moyen,
capacIt, crIture)
Ecrans (CatEcran, NoArt, TaIlle, pt_haut, pt_larg, color, nbr_color)
UnIteCPU (CatCPU, NoArt, processeur, horloge, FPU, ethernet,
nb_slot)
AccessoIres (CatAcc, NoArt, lIb_accessoIre)
LogIcIels (CatLog, NoArt, lIb_logIcIel, versIon, domaIne,
mmoIre_exIge)
CompatIble (CatCPU, NoArt_cpu, Cat, NoArt, remarque)
prIx (Cat, NoArt, depuIs, jusqu, prIx_clIent, prIx_achat,
qte_stock, dlaI)
Article2
NoArt : integer
Description
Libdescription : string
Catgories
Categorie : string
Valeurs
ValeurR : string
NoArt : integer
Categorie : string
Libdescription : string
ValeurR : string
*
1 1
*
* *
0e U|L SQL J19
Dependances fonctionnelles
(les Instances des relatIons valIdent ces d.f. !)
1) NoClIent nom, prnom, adresse, NoCarteCrdIt
2) NoCmd NoClIent, dateCmd, dlaI, prIx_Cmd
J) NoCmd, Cat, NoArt rserv, prIx
4) use lIb_usage
5) NoConfIg lIb_confIg, rabaIs_confIg, prIx_confIg
6) CatnDut, NoArt taIlle_doc, prcIsIon_dpI, color, nbr_color, vItesse
7) Cat0Isque, NoArt vItesse_transfert, acces_moyen, capacIt, crIture
8) CatEcran, NoArt TaIlle, pt_haut, pt_larg, color, nbr_color
9) CatCPU, NoArt processeur, horloge, FPU, ethernet, nb_slot
10) CatAcc, NoArt lIb_accessoIre
11) CatLog, NoArt lIb_logIcIel, versIon, domaIne, mmoIre_exIge
12) CatCPU, NoArt_cpu, Cat, NoArt remarque
1J) Cat, NoArt , depuIs jusqu, prIx_clIent, prIx_achat, qte_stock
14) Cat, NoArt dlaI
Semantique
FemplIr les tables correspondant aux Instances des relatIons afIn d'exprImer
le texte quI suIt:
HIer le clIent no 577 Paul NIoumane (carte crdIt 8798798) a command
(no J4J) une confIguratIon STAFTEF (confIg. no 5) avec 10 de rabaIs.
CellecI se compose de:
un processeur 680486 100 |HZ avec FPU et 2 slot (art. no 100)
un cran 16'', 256 couleurs (art. no 200)
un dIsque de J20 |byte (art. no J00)
Pour la prIode de 1 juIn 9J au 1 septembre 9J, le dlaI d'approvIsIonnement
de ces artIcles est de 5 semaInes et les prIx de vente de ces artIcles sont les
suIvants:
no 100, 1200 FFS.
no 200, 600 FFS.
no J00, 1000 FFS.
1ables type
ClIents NoClIent nom prnom adresse NoCarteCrdIt
Commande NoCmd NoClIent dateCmd dlaI prIx_Cmd
320 Modeliser et realiser une BD
LIgne_Cmd NoCmd Cat NoArt rserv prIx
ConfIguratIon NoConfIg LIb_confIg rabaIs_confIg prIx_confIg
nConfIg NoConfIg Cat NoArt
UnIteCPU CatCPU NoArt processeur horloge FPU ethernet nb_slot
Ecrans CatEcran NoArt TaIlle pt_haut pt_larg color nbr_color
0Isques Cat0Isque NoArt vItesse_transfert acces_moyen capacIt crIture
nDut CatnDut NoArt taIlle_doc precIsIon_dpI color nbr_color vItesse
CompatIble CatCPU NoArt_cpu Cat NoArt remarque
prIx Cat NoArt depuIs jusqu prIx_clIent prIx_achat qte_stock dlaI
Sur la modelisation
Fpondre aux questIons suIvantes en basant vos arguments unIquement sur la
modlIsatIon
1) Peuton avoIr plusIeurs confIguratIons conseIlles pour un mme usage:
2) SoIt la df et la relatIon suIvantes:
Cat, NoArt dlaI
0e U|L SQL J21
prIx(Cat, NoArt, depuIs, jusqu, prIx_clIent, prIx_achat, qte_stock,
dlaI)
0Iscuter des anomalIes de mIse jour. Peuton proposer une
amlIoratIon de la dcomposItIon :
J) SI on runIt les relatIons nDut, 0Isques, Ecrans, UnIteCPU et AccessoIres
dans une unIque relatIon:
|atrIel (Cat, NoArt, taIlle_doc, prcIsIon_dpI, color, nbr_color,
vItesse, vItesse_transfert, acces_moyen, capacIt, crIture, TaIlle,
pt_haut, pt_larg, processeur, horloge, FPU, ethernet, nb_slot,
lIb_accessoIre)
donner les avantages et dsavantages qu'on obtIent, chercher la cl de
cette nouvelle relatIon et dIscuter des anomalIes de mIse jour
4) ExplIcItez toutes les dpendances d'InclusIon vrIfIer sur la
modlIsatIon (sous la forme F[C] S[0] )
5) 0onnez l'ordre de cratIon SQL quI permet de crer la relatIon
LIgne_Cmd(NoCmd, Cat, NoArt, rserv, prIx)
avec les clauses sur toutes les contraIntes d'IntgrIt
6) magInez une rI quI exIsteraIt dans le champ d'applIcatIon telle que:
a) une prImItIve de la relatIon Commande feraIt partIe de la porte de
cette rI et
b) cette rI ne pourraIt pas tre prIse en compte lors du CFEATE de la
relatIon Commande
Requtes
Fpondre en SQL aux questIons suIvantes:
1) LIste des artIcles des confIguratIons ddIes la CAD par ordre croIssant
du prIx de la confIguratIon, de la catgorIe et du numro de l'artIcle.
2) 0onner les prIx actuels des crans en couleur
J) 0onner le lIbell des usages pour lesquels le nombre de logIcIels dpasse
20.
4) EtablIr la lIste des commandes dont le dlaI de lIvraIson a t dpass
(date1date2 = nbr de jours) ou est Inconnu
5) 0onner la prIode ou l'ImprImante no 100 a atteInt son prIx le plus bas
6) Chercher les noms et prnoms des clIents quI ont achet des artIcles,
lors d'une commande, sans acheter de CPU
Rgles d'integrite
...Les confIguratIons proposes doIvent tre compatIbles... .
0onner Ia porte de cette rI en rempIIssant Ie tabIeau de contexte
suIvant (mettre une croIx sI Ia case appartIent Ia porte)
322 Modeliser et realiser une BD
prImI
tIve/
relat
Ion
Ins
rer
supp
rIme
r
maj maj maj maj maj maj maj
0onner une requte SQL quI permette de dtecter les confIguratIons quI
contIennent des IncompatIbIlIs (CPUImprImantes, CPUdIsques, etc...)
(IndIcatIon: commencer par dfInIr une vue quI assocIe une confIguratIon,
son CPU et ses autres artIcles)
0e U|L SQL J2J
22. DUI
La socIt 0UF (0IstrIbuteur UnIversel FranaIs) est, depuIs cInquante ans,
spcIalIse dans la dIstrIbutIon des lIvres et des revues. Elle joue le role
d'IntermdIaIre entre les dIteurs quI sont membres de son groupe et les
lIbraIres. Elle a faIt face plusIeurs tourmentes dans le pass: changement
de structures du march, chute des prIx, dIversIfIcatIon des servIces.
Actuellement, elle veut transformer son outIl de gestIon en un outIl d'aIde
la dcIsIon pour facIlIter le dImensIonnement des offIces (les lIbraIres
reoIvent chaque moIs un ensemble de lIvres d'offIce, qu'Ils payent maIs
qu'Ils peuvent retourner au dIstrIbuteur) quI sont envoys aux lIbraIres. Pour
cela, elle dsIre mettre au poInt une base de donnes. Les dIteurs et les
lIbraIres pourront y trouver les servIces suIvants:
ventes, retours pour chaque tItre, auteur
ventes, retours par rgIon
ventes, retours par genre lIttraIre
tre un outIl de gestIon des stocks
tre un outIl de gestIon fInancIer
Apres une premIere runIon, on a obtenu les InformatIons quI suIvent.
Le consultant pense qu'avec ces donnes, Il peut satIsfaIre les demandes
prIncIpales exprImes par la socIt.
Les dIteurs
Les dIteurs sont IdentIfIs par un numro d'dIteur NoEdIteur, on connat
pour chacun une raIson SocIale PaIsonSocIaIeEd, une adresse AdresseEd et
un soIde fInancIer reprsentant le total payer cet dIteur. Un dIteur
produIt des lIvres quI sont IdentIfIs par un numro de rfrence NoPef, on
connat pour chacun son tItre, son auteur, sa date de parutIon
datepubIIcatIon, son prIx de vente en lIbraIrIe prIxvente et son prIx de
dIstrIbutIon prIxdIstrIbutIon. Un lIvre peut tre assocI plusIeurs genres
(numro de genre Nogenre). Les auteurs sont IdentIfIs par un numro
d'auteur NoAuteur, on connat pour chacun son nom et son prnom.
L'dIteur lIvre prIodIquement des nouveaux ouvrages (ou des rdItIons)
pour rapprovIsIonner le stock de 0UF. Chaque lIvraIson est assocIe une
date et une quantIt.
Chaque dIteur possede un journal des crItures comptables quI luI sont
Imputables. Une crIture est assocIe un dIteur, un lIbell LIb, une date
d'opratIon date_op et un montant mnt.
Les IIbraIrIes
Les lIbraIrIes sont IdentIfIes par un numro de lIbraIrIe NoIIbraIrIe, on
connat pour chacune une raIson SocIale PaIsonSocIaIeLIb, une adresse
324 Modeliser et realiser une BD
AdresseLIb et un soIde fInancIer reprsentant le total recevoIr de cette
lIbraIrIe.
Une lIbraIrIe effectue rgulIerement des transactIons avec 0UF. Chaque
transactIon est dcompose en lIgnes concernant un lIvre pour une certaIne
quantIt qte (on en dduIt un prIx) et un type de transactIon type_trans. La
transactIon est effectue une date dateTrans et TotaITrans rcapItule le
total des lIgnes de la transactIon.
Chaque lIbraIrIe possede un journal des crItures comptables quI luI sont
Imputables. Une crIture est assocIe une lIbraIrIe, un lIbell LIb, une date
d'opratIon date_op et un montant mnt.
Pour sImplIfIer l'tude, le consultant a faIt quelques Impasses sur les
payements en monnaIes trangeres, les reprsentants chargs du contact
avec les lIbraIres, ...
Domaine des constituants
AdresseEd texte
AdresseLIb texte
datelIvraIson date
dateTrans date
date_op date
datepublIcatIon date
lIb mot ('payement','facture', ...)
lIbgenre mot ('socIologIe','roman','hIstoIre','art', ...)
mnt nombre
NoAuteur entIer [1..99999]
NoEdIteur entIer [1..99999]
NoCenre entIer [1..99999]
NoLIbraIrIe entIer [1..99999]
NoLIgne entIer [1..999]
nom mot ('0UPDNT', ...)
NoFef entIer [1..99999]
NoTrans entIer [1..99999]
prnom Texte
prIx nombre
prIxdIstrIbutIon nombre
prIxvente nombre
Qte entIer [999..999]
qte_lIvree entIer [99999..99999]
FaIsonSocIaleEd mot ('La renaIssance', 'KalImard...)
FaIsonSocIaleLIbmot ('Aux vIeux lIvres', ...)
0e U|L SQL J25
FegIon mot ('ParIs','Lyon','Canada',...
Solde nombre
TItre texte
TotalTrans nombre
type_trans mot ('dpot','offIce','retour','commande',...)
Relations
(une cl de la relatIon est IndIque par un soulIgnement)
Auteur (NoAuteur, nom, prnom)
EdIteur (NoEdIteur, FaIsonSocIaleEd, AdresseEd, Solde)
EcrIture_Ed (NoEdIteur, date_op, LIb, mnt)
Duvrage (NoFef, TItre, NoEdIteur, NoAuteur, datepublIcatIon,
prIxvente, prIxdIstrIbutIon )
CenreDuvrage (NoFef, Nogenre)
Cenre (Nogenre, genre)
Stock (NoFef, datelIvraIson, qte_lIvree)
LIbraIrIe (NoLIbraIrIe, FaIsonSocIaleLIb, AdresseLIb, FegIon, Solde)
TransactIon (NoTrans, NoLIbraIrIe, dateTrans, TotalTrans)
LIgne_Trans (NoTrans, NoLIgne, NoFef, type_trans, Qte, prIx)
EcrIture_LIb (NoLIbraIrIe, date_op, LIb, mnt)
Dependances fonctionnelles
(les Instances des relatIons valIdent ces d.f. !)
1) NoAuteur nom, prnom)
2) NoEdIteur FaIsonSocIaleEd, AdresseEd, Solde)
J) NoEdIteur, date_op mnt
4) NoFef TItre, NoEdIteur, NoAuteur, datepublIcatIon, prIxvente,
prIxdIstrIbutIon
5) Nogenre genre)
6) NoFef, datelIvraIson qte_lIvree
7) NoLIbraIrIe FaIsonSocIaleLIb, AdresseLIb, FegIon, Solde
8) NoTrans NoLIbraIrIe, dateTrans, TotalTrans
9) NoTrans, NoLIgne NoFef, type_trans, Qte, prIx
10) NoLIbraIrIe, date_op mnt
326 Modeliser et realiser une BD
Diagramme des classes
Cette premIere modlIsatIon prsente les dIteurs et les lIbraIres comme
deux entIts dIffrentes
La modlIsatIon suIvante ne faIt plus de dIstInctIon entre les dIteurs et les
lIbraIres.
Auteurs
NoAuteur : integer
Nom : string
Prenom : string
Genre
NoGenre : integer
LibelleGenre : string
LignesTrans
Qte : integer
NoLigne : integer
TypeTrans : string
Prix : real
Qte : integer
Editeurs
NoEditeur : integer
RaisonSocialeEd : string
AdresseEd : string
Solde : real
Ouvrages
NoReI : integer
DatePublication : date
PrixVente : real
PrixDistribution : real
Titre : string
Librairies
Solde : real
NoLibrairie : integer
RaisonSocialeLib : string
AdresseLib : string
Region : string
NoReI : integer
DatePublication : date
PrixVente : real
PrixDistribution : real
Solde : real
NoGenre : integer
LibelleGenre : string
EcrituresEdit
DateOp : date
Lib : string
Mnt : real
DateOp : date
Lib : string
Mnt : real
NoEditeur : integer
RaisonSocialeEd : string
AdresseEd : string
Solde : real
*
1
EcrituresLib
dateOp : date
Lib : string
Mnt : real
NoLibrairie : integer
RaisonSocialeLib : string
AdresseLib : string
Region : string
dateOp : date
Lib : string
Mnt : real
1
*
Stock
DateLivraison : date
qtelivree : integer
*
NoAuteur : integer
*
DateLivraison : date
1 *
qtelivree : integer
1
*
Titre : string
Nom : string
Prenom : string
*
*
Transactions
NoTrans : integer
DateTrans : date
TotalTrans : real
NoTrans : integer
DateTrans : date
TotalTrans : real
NoLigne : integer
TypeTrans : string
*
1
1
*
*
1
Prix : real
0e U|L SQL J27
Ouvrages
NoReI : integer
Titre : string
DatePublication : date
PrixVente : real
PrixDistribution : real
Genre
NoGenre : integer
LibelleGenre : string
NoReI : integer
LibelleGenre : string
Partenaires
NoPartenaire : integer
RaisonSociale : string
Adresse : string
Solde : real
NoPartenaire : integer
RaisonSociale : string
Adresse : string
Solde : real
Editeurs'
LignesTrans
NoLigne : integer
TypeTrans : string
Qte : integer
Prix : real
Transactions
NoTrans : integer
DateTrans : date
TotalTrans : real
NoTrans : integer
DateTrans : date
TotalTrans : real
1
*
*
1
Ecritures
dateOp : date
Lib : string
Mnt : real
dateOp : date
Lib : string
Mnt : real
*
1
*
1
NoLigne : integer
TypeTrans : string
Qte : integer
Prix : real
*
1
Librairies'
Regions : string Regions : string
*
*
NoGenre : integer
Auteurs
NoAuteur : integer
Nom : string
Prenom : string
Titre : string
DatePublication : date
PrixVente : real
PrixDistribution : real
*
*
NoAuteur : integer
Nom : string
Prenom : string
Semantique
FemplIr les tables correspondant aux Instances des relatIons afIn d'exprImer
le texte quI suIt:
L'dIteur NET (no 10) a lIvr 2000 lIvres de son dernIer ouvrage Java et
nternet (ref 12J) de James Sun (auteur 25). L'ouvrage est class dans les
genres technologIe (no 4) et InformatIque (no 7). Son prIx de dIstrIbutIon est
de 60 francs. L'dIteur a t crdIter de 20,000 francs pour avance sur
recette.
328 Modeliser et realiser une BD
La lIbraIre CUTEN8EFC de Lyon (n0 JJJ) reu son offIce du moIs (1.7.96)
pour une valeur de 12400 francs (transactIon 555), on y trouvaIt 10
exemplaIres de Java et nternet. Cette transactIon a faIt l'objet d'une
facture.
1ables type
Auteur NoAuteur nom prnom
EdIteur NoEdIteur FaIsonSocIaleEd AdresseEd Solde
EcrIture_Ed NoEdIteur date_op LIb mnt
Duvrag
e
NoFe
f
TItr
e
NoEdIteu
r
NoAuteu
r
datepublIcatIo
n
prIxvent
e
prIxdIstrIbutIo
n
CenreDuvrage NoFef Nogenre
Cenre Nogenre genre
Stock NoFef datelIvraIson qte_lIvree
LIbraIrIe NoLIbraIrIe FaIsonSocIaleLIb AdresseLIb FegIon Solde
TransactIon NoTrans NoLIbraIrIe dateTrans TotalTrans
LIgne_Trans NoTrans NoLIgne NoFef type_trans Qte prIx
0e U|L SQL J29
EcrIture_LIb NoLIbraIrIe date_op LIb mnt
Sur la modelisation
Fpondre aux questIons suIvantes en basant vos arguments unIquement sur la
modlIsatIon (domaIne des constItuants, relatIons et dpendances
fonctIonnelles).
Un lIvre peutIl tre crIt par plusIeurs auteurs:
o sI ouI comment socker IntroductIon C crIt par A.dunIx et
8.Chelle:
o sI non comment modIfIer le schma des relatIons et des df:
EcrIture_LIb et EcrIture_Ed sont tres semblables peuton faIre une
fusIon et sous quelles condItIons :
ExplIcIter toutes les dpendances d'InclusIon vrIfIer sur la
modlIsatIon (sous la forme F[C] S[0] )
0onner la requte SQL quI permet de crer la relatIon :
Duvrage (NoFef, TItre, NoEdIteur, NoAuteur, datepublIcatIon,
prIxvente, prIxdIstrIbutIon )
avec les clauses sur toutes les contraintes d'intgrit
magIner une regle d'IntgrIt dont le contexte seraIt [Auteur,
Duvrage, EdIteur] maIs que l'on ne peut exprImer lors de la cratIon du
schma (pas un check, prImary key, ou une foreIgn key ...).
Requtes
Fpondre en SQL aux questIons suIvantes:
(tracez les motscls nonutIlIss sI ncessaIre)
1) 0onner la lIste des rfrences par ordre croIssant de la date de
publIcatIon.
2) 0onner le nom et le prnom des auteurs ayant publI chez NET en
1996.
J) 0onner le nombre total d'exemplaIres vendus de Java et nternet
en juIn 1996.
4) 0onner le chIffre d'affaIre des ventes par rgIon en 1995.
5) 0onner la lIste des rfrences ayant un retour de plus de 50 (2
lIvres plus (qte posItIve) de 1 retourne (qte ngatIve) )
330 Modeliser et realiser une BD
Rgles d'integrite
Pour vIter des abus sur les retours, 0UF veut attrIbuer un maxImum de
retours par genre (Cenre (Nogenre, genre, max_retour))
0onner la porte de cette rI en remplIssant le tableau de contexte suIvant
(mettre une croIx sI la case appartIent la porte)
prImItIve/
relatIon
Insrer supprIm
er
maj maj maj maj maj maj
EcrIre une vue permettant de retrouver les anomalIes sur maxImum de
retour.
0e U|L SQL JJ1
23. IAML
Lnonce
Fame
22
est une cole clebre quI forme de jeunes danseurs, musIcIens et
comdIens. Fpute pour son srIeux et son nIveau lev, elle attIre les
jeunes du monde entIer. Crce au dynamIsme de la dIrectrIce de l'cole,
Fame n'a cess de s'agrandIr et de se dvelopper ces dernIeres annes:
augmentatIon du nombre des salles, dIversIfIcatIon des cours,
renouvellement du matrIel, augmentatIon du nombre d'tudIants et
d'enseIgnants. 7IctIme de ce succes, la dIrectrIce de l'cole a de la peIne
grer toutes ces InformatIons. 0es amIs luI conseIllent d'utIlIser un systeme
de gestIon de bases de donnes relatIonnel pour stocker et manIpuler les
donnes de l'cole. Elle faIt donc appel des InformatIcIens de gestIon et
leur dcrIt le champ d'applIcatIon suIvant au cours d'une runIon:
L'cole offre troIs fIlIeres: danse, musIque et thtre. Elle dcerne des
dIplomes dans chacune de ces fIlIeres (p.ex: danse classIque, art
dramatIque, etc...). Un dIplome est IdentIfI par un sIgle (SIgIe0Ip) et Il a
un lIbell (LIb0Ip). l est rattach une fIlIere (FIIIre). Son obtentIon
ncessIte un nombre mInImum de crdIts (NbCrdIts).
Le plan d'tudes d'un dIplome est compos d'un ensemble de cours. Un cours
est IdentIfI par un numro (NoCours). l possede un tItre (TItre) et Il est
rattach une fIlIere (p.ex: le cours de ballet est rattach la fIlIere
danse). Lorsqu'un cours est dans le plan d'tudes d'un dIplome, Il est
oblIgatoIre ou optIonnel (Type) et Il est pondr par un nombre de crdIts
(CrdIts). Un cours d'une fIlIere peut fIgurer dans le plan d'tudes d'un
dIplome rattach une autre fIlIere (p.ex: le cours ballet est un cours
optIon pour le dIplome art dramatIque de la fIlIere thtre).
L'cole comporte vIngt salles. Chaque salle est IdentIfIe par un numro
(NoSaIIe), dcrIte par un lIbell (LIbeIISaIIe) et contIent du matrIel
(EquIpement). Un cours est donn par un enseIgnant dans une salle de
l'cole; l'enseIgnant et la salle peuvent changer d'une anne une autre.
Chaque enseIgnant est IdentIfI par un numro (NoEnseIgnant). Dn connat
son nom (Nom), son prnom (Prnom), sa natIonalIt (Pays) et son adresse
(AdresseE).
Un tudIant est IdentIfI par un numro d'ImmatrIculatIon (NoImmat). l a un
nom (Nom), un prnom (Prnom), une natIonalIt (Pays) et une adresse
(Adresse). l s'InscrIt en une anne (AnneIns) un dIplome et l'obtIent plus
tard (AnneDbt) avec une mentIon (hentIon). Un tudIant ne peut pas
22
L'nonc de base de ce travaIl est due LIna AljadIr (et est un fIlm connu des annes
80)
332 Modeliser et realiser une BD
effectuer deux dIplomes en mme temps. Par contre, Il peut commencer un
deuxIeme dIplome apres avoIr termIn le premIer. l se peut qu'un tudIant
n'obtIenne pas son dIplome (Interrompu) en raIson d'un dpart volontaIre ou
d'une exclusIon.
Pour obtenIr son dIplome, un tudIant doIt suIvre tous les cours oblIgatoIres
du plan d'tudes correspondant et un certaIn nombre de cours optIon pour
totalIser un nombre de crdIts gal ou suprIeur celuI requIs par son
dIplome. Un tudIant obtIent les crdIts d'un cours unIquement s'Il russIt
l'examen de ce cours en fIn d'anne (PussIte). S'Il choue, l'tudIant peut se
rInscrIre et passer l'examen l'anne suIvante. S'Il choue la deuxIeme
tentatIve, Il est exclu de l'cole.
Domaine des constituants
Adresse texte
Anne entIer [1950..2200]
Annens entIer [1950..2200]
AnneDbt entIer [1950..2200]
CrdIts entIer [5..10]
EquIpement texte
FIlIere mot (danse, musIque, thtre)
nterrompu mot (dpart, exclusIon)
LIbell0Ip texte
LIbellSalle texte
|entIon mot (sans_mentIon, assez_bIen, bIen, tres_bIen)
NbCrdIts entIer [60..100]
NoCours entIer [1..99]
NoEnseIgnant entIer [1..99]
Nommat texte
Nom mot
NoSalle entIer [1..20]
Pays mot
Prnom mot
FussI mot (ouI, non)
SIgle0Ip mot
TItre texte
Type mot (oblIgatoIre, optIonnel)
0e U|L SQL JJJ
Diagramme de classes
Relations
(une cl de la relatIon est IndIque par un soulIgnement)
0Iplome (SIgle0Ip, LIbell0Ip, FIlIere, NbCrdIts)
Cours(NoCours, TItre, FIlIere)
PlanEtudes(SIgle0Ip, NoCours, Type, CrdIts)
Diplome
SigleDip : string
LibelleDip : string
NbCredits : integer
Cours
NoCours : integer
Titre : string Planetudes
Type : string
Credits : integer
Salles
NoSalle : integer
LibelleSalle : string
Equipement : string
NoCours : integer
Titre : string
Type : string
donne par
*
NoSalle : integer
LibelleSalle : string
Equipement : string
InscriptionDip
AnneeIns : integer
AnneeObt : integer
Interrompu : string
Mention : string
InscriptionCours
Annee : integer
Reussi : boolean
AnneeIns : integer
AnneeObt : integer
Interrompu : string
SigleDip : string
LibelleDip : string
NbCredits : integer
Personnes
NoPers : integer
Nom : string
Prenom : string
Pays : string
Adresse : string
Etudiants Enseignants
NoPers : integer
Nom : string
Prenom : string
Pays : string
Adresse : string
1
* *
Mention : string
Annee : integer
Reussi : boolean
1
*
*
* *
Planning
Annee : integer Annee : integer
1
*
dans
*
*
Filires
Filiere : string Filiere : string
Credits : integer
1
1
*
334 Modeliser et realiser une BD
Salle(NoSalle, LIbellSalle, EquIpement)
EnseIgnant (NoEnseIgnant, NomE, PrnomE, PaysE, AdresseE)
HoraIre (NoCours, AnneH, NoEnseIgnant, NoSalle)
EtudIant (Nommat, Nom, Prnom, Pays, Adresse)
nscrIptIon0Ip(Nommat, Annens, SIgle0Ip, AnneDbt, |entIon, nterrompu)
nscrIptIonCours(Nommat, NoCours, Anne, FussI)
Dependances fonctionnelles
(les Instances des relatIons valIdent ces d.f. !)
1) SIgle0Ip LIbell0Ip, FIlIere, NbCrdIts
2) NoCours TItre, FIlIere
J) SIgle0Ip, NoCours Type, CrdIts
4) NoSalle LIbellSalle, EquIpement
5) NoEnseIgnant NomE, PrnomE, PaysE, AdresseE
6) NoCours, AnneH NoEnseIgnant, NoSalle
7) Nommat Nom, Prnom, Pays, Adresse
8) Nommat, Annens SIgle0Ip, AnneDbt, |entIon, nterrompu
9) Nommat, SIgle0Ip Annens, AnneDbt
10) Nommat, NoCours, Anne FussI
Semantique
FemplIr les tables correspondant aux Instances des relatIons afIn d'exprImer
le texte quI suIt:
0ans la fIlIere danse fIgure le dIplome danse contemporaIne. l a le sIgle
0CL et ncessIte 110 crdIts.
Son plan d'tudes contIent les cours oblIgatoIres ballet 1 (no 54), ballet 2
(no 52), musIque contemporaIne 1 (no 24), et le cours optIon art
moderne (no 10). Les deux premIers sont rattachs la fIlIere danse,
tandIs que le troIsIeme et le quatrIeme sont dans la fIlIere musIque et
thtre respectIvement.
Le cours ballet 1 est donn cette anne par |me JulIa 0urand (no 7) la
salle de danse (no 15) quI est quIpe d'un lecteur C0.
L'tudIante japonaIse Sue SuzukI (no 9911), quI s'est InscrIte au dIplome
danse comptemporaIne en 1999, suIt cette anne les cours ballet 2 et art
moderne.
0Iplome SIgle0Ip LIbell0Ip FIlIere NbCrdIts
Cours NoCours TItre FIlIere
0e U|L SQL JJ5
PlanEtudes SIgle0Ip NoCours Type CrdIts
Salle NoSalle LIbellSalle EquIpemen
t
EnseIgnant NoEnseIgnant NomE PrnomE PaysE AdresseE
HoraIre NoCours AnneH NoEnseIgnant NoSalle
EtudIant Nommat Nom Prnom Pays Adresse
nscrIptIon0Ip Nommat Annens SIgle0Ip AnneDbt |entIon nter
rompu
nscrIptIonCours Nommat NoCours Anne FussI
Sur la modelisation
Fpondre aux questIons suIvantes en basant vos arguments unIquement sur
la modlIsatIon (domaIne des constItuants, relatIons et dpendances
fonctIonnelles).
SI toutes les InformatIons taIent mIses dans une seule.relatIon FU,
quelle(s) cl(s) auraIt cette relatIon (la relatIon unIverselle)
EstIl possIble d'obtenIr la relatIon FU, au moyen des relatIons du
schma par composItIon.:
ExplIcIter toutes les dpendances d'InclusIon vrIfIer sur la
modlIsatIon (sous la forme F[C] S[0] )
0onner la requte SQL quI permet de crer la relatIon
336 Modeliser et realiser une BD
HoraIre (NoCours, AnneH, NoEnseIgnant, NoSalle)
avec Ies cIauses sur toutes Ies contraIntes d'IntgrIt
magIner une regle d'IntgrIt dont le contexte seraIt [HoraIre, Cours]
quI ne soIt pas une dpendance d'InclusIon.
Repondre en SQL aux questions suivantes:
0onner la lIste des dIplomes par ordre croIssant du nombre de crdIts.
0onner le nom et le prnom des tudIants ayant obtenu un dIplome en
1994.
0onner le tItre, la fIlIere et le crdIt des cours optIonnels du dIplome
danse classIque.
0onner le nombre d'tudIants InscrIts en 95 pour chaque cours.
0onner le tItre des cours quI ne sont oblIgatoIres dans aucune fIlIere.
Vues
EcrIre une requte SQL quI permet de crer la vue SItuatIonActuelle. Cette
vue donne pour un tudIant InscrIt actuellement un dIplome le nombre de
crdIts qu'Il a totalIss jusqu' prsent pour ce dIplome.
Rgles d'integrite
Un tudIant ne peut obtenIr son dIplome que sI la somme des crdIts des
cours qu'Il a russIs est suprIeure ou gale celle demande par son
dIplome.
0onner la porte de cette rI en remplIssant le tableau de contexte
suIvant (mettre une croIx sI la case appartIent la porte)
prImItIve/
relatIon
Insrer supprImer maj maj maj maj maj maj
CItez et explIquez quelles sont les opratIons quI pourraIent paratre
partIculIerement Injustes et cruelles aux yeux des leves ayant russI
un cours et que devraIt s'InterdIre la dIrectIon de l'cole :
EcrIre un trIgger correpondant une croIx du tableau de contexte
(rutIlIser la vue sItuatIonActuelle!).
0e U|L SQL JJ7
24. LLLC1A
La socIt de sondage ELECTA est spcIalIse dans l'tude des rsultats
concernant des votatIons natIonales. Dn luI a command une tude sur les
dernIeres votatIons franaIses.
ELECTA dans une phase de nouveaux dveloppements InformatIques a
entreprIs l'tude d'une base de donnes permettant de grer les InformatIons
ncessaIres ces analyses.
Le texte quI suIt est une descrIptIon du champ d'applIcatIon tel qu'Il apparat
la suIte d'une tude avec les analystes (les mots en style gras sont les
constItuants quI sont retenus dans la modlIsatIon)
ExtraIt du rapport
La France est dcoupe en dpartements (LIb0ept) ayant un numro (0ept).
Les dpartements sont dcoups en cIrconscrIptIons (LIbCIrc) ayant un
numro (CIrc). Les bureaux de votes (urVot) sont attachs aux
cIrconscrIptIons.
Le monde polItIque est dcoup en dIffrentes appelatIons (ApPoI) ayant
chacune un sIgle (SIg). Les candIdats (Cand) ont un nom (Nom) et un Prnom
(Prnom). Une votatIon est IdentIfIe par son anne (EIecAn), elle a lIeu en
deux tours (Tour). Dn compte le nombre d'lecteurs (NbEIect), le nombre de
votants (NbVot), le nombre d'abstentIons (NbAbs) et le nombre de voIx pour
chaque candItat (NbvoIx). Par cIrconscrIptIon, un seul candIdat est lu
(CandEIu)
Domaine des constituants
ApPoI texte
urVot entIer
Cand entIer
CandEIu entIer
CIrc entIer
0ept entIer [1..95]
EIecAn entIer [9J, 97, ...]
LIbCIrc texte
LIb0ept texte
NbAbs entIer
NbEIect entIer
NbvoIx entIer
NbVot entIer
Nom mot (|Ignon, 0urand, ...)
338 Modeliser et realiser une BD
Prnom mot (jean, paul, anne, ...)
SIg mot (FPF, U0F, PS, PP|, ...)
Tour entIer[1..2]
Diagramme de classes
Qui dit que la democratie c`est simple !
Relations
ureauVote (EIecAn, Tour, urVot, CIrc, NbEIect, NbVot, NbAbs)
CIrconscrIptIon (CIrc, LIbCIrc, 0ept, LIb0ept)
PoIItIque (SIg, ApPoI)
CandIdat (Cand, Nom, Prnom)
InscrIptIon (EIecAn, Cand, SIg, CIrc)
Dpartements
Dept : integer
Libdept : string
BureauxVote
BurVot : string
PartiPolitiques
Sigle : string
ApPol : string
Rsultats
NbVoix : integer
Tour : integer
inscription
* *
AnneElectorale
ElecAN : integer ElecAN : integer
Sigle : string
ApPol : string
*
*
*
*
Circonscriptions
Libcirc : string Libcirc : string
Dept : integer
Libdept : string
*
*
*
1
1
*
Candidats
Prenom : string
Nom : string
NbVoix : integer
Tour : integer
Prenom : string
Nom : string
*
resultat
*
elu
*
Votation
NbElect : integer
NbVot : integer
NbAbs : integer
Tour : integer
NbElect : integer
NbVot : integer
NbAbs : integer
Tour : integer
BurVot : string
*
1
0e U|L SQL JJ9
PesuItatTour (EIecAn, Tour, urVot, Cand, NbvoIx )
PesuItatEIec (EIecAn, CIrc, CandEIu)
Z (CandEIu, Cand)
Dependances fonctionnelles
1. ElecAn, Tour, 8ur7ot NbElect, Nb7ot, NbAbs
2. 8ur7ot CIrc
J. CIrc LIbCIrc, 0ept
4. 0ept LIb0ept
5. SIg ApPol
6. Cand Nom, Prnom
7. ElecAn, Cand SIg, CIrc
8. ElecAn, Tour, 8ur7ot, Cand NbvoIx
9. ElecAn, CIrc CandElu
10. CandElu Cand
Sur la modelisation
1)
a) ExplIquez ce que sIgnIfIe NbvoIx dans la relatIon PesuItatTour,
en utIlIsant les df pour supporter votre explIcatIon.
b) Le calcul 100 * NbvoIx l NbEIect, pour une cIrconscrIptIon et un
rsultat de tour, reprsentet'Il le pourcentage de voIx obtenu par
ce candIdat pour cette cIconscrIptIon :
2) 0termInez sI la dcomposItIon est totale
A
p
P
o
l
B
u
r
V
o
t
C
a
n
d
C
a
n
d
E
l
u
C
i
r
c
D
e
p
t
E
l
e
c
A
n
L
i
b
C
i
r
c
L
i
b
D
e
p
t
N
b
A
b
s
N
b
v
o
i
x
N
b
V
o
t
N
o
m
P
r
n
o
m
S
i
g
T
o
u
r
N
b
E
l
e
c
t
ureauVote
CIrconscrIp.
PoIItIque
CandIdat
InscrIptIon
PesuItatTour
PesuItatEIec
Z
J) 0onnez le chemIn de composItIon (pour retrouver la relatIon
unIverselle) auquel vous tes arrIv
340 Modeliser et realiser une BD
4) ExplIquez le role de Z (dans l'algorIthme de dcomposItIon totale).
0oIton rellement socker Z sI l'on saIt que CandElu = Cand
5) La relatIon cIrconscrIptIon n'est pas en troIsIeme forme normale.
ExplIquez pourquoI.
a) En termes d'anomalIes de mIse jour
b) En termes de df
6) UtIlIsez le thoreme de la dcomposItIon bInaIre pour dcomposer la
relatIon cIrconscrIptIon.
7) les les contraIntes rfrencIelles suIvantes sont vrIfIer:
a) InscrIptIon [dentAssur] PoIItIque [SIg]
b) InscrIptIon [Cand] CandIdat [Cand]
nous devons effectuer les prImItIves suIvantes
1) Insert Into CandIdat ( 888,'|oI', 'ElIe');
2) Insert Into InscrIptIon (1999, 888, 'PL', 789);
3) Insert Into PoIItIque ('PL','PartI LIbre');
ndIquer dans le tableau suIvant la premIere regle quI n'est pas valIde
ou sI la squence est ok
squence de
prImItIves
ne valIde pas a) ne valIde pas b) ok
12J
1J2
J12
21J
2J1
J21
8) La base de donnes utIlIse par ELECT ne possede pas la possIbIlIt de
vrIfIeer automatIquement les contraIntes rfrencIelles. 0onner pour
l'exemple suIvant la porte de la contraInte: Tous les InscrIptIons sont
attachs un candIdat quI exIste. 0onner la porte de cette rI en
remplIssant le tableau de contexte suIvant (mettre une croIx sI la case
appartIent la porte)
prImItIve/
relatIon
Insrer supprImer maj maj maj maj maj maj
0e U|L SQL J41
2S. CONILR
Lnonce
CDNFEF est une assocIatIon quI organIse des confrences dans dIffrents
domaInes, pour le compte de dIffrents groupes de recherche. CDNFEF
organIse toute la confrence pour ces groupes depuIs la dIstrIbutIon des
appels aux contrIbutIons jusqu' la locatIon des salles. AfIn de rester
comptItIf, le conseIl d'admInIstratIon de CDNFEF s'est Interrog sur
l'opportunIt de ralIser l'organIsatIon des confrences entIerement avec les
outIls d'nternet.
A cette fIn, Ils ont engag une procdure d'analyse de l'exIstant. Et Ils se
sont plus partIculIerement concentrs sur la soumIssIon des papIers.
ls ont trouv que les acteurs de cette actIvIt soumettre des papIers
taIent:
les auteurs (ceux quI soumettent les papIers)
les rfrs (ceux quI commentent et jugent les papIers)
Le scnarIo retenu est gnralement le suIvant:
L'auteur reoIt un appel soumettre un papIer une confrence (une
publIcIt)
L'auteur envoIe une lettre d'IntentIon de communIquer un papIer
Le comIt d'organIsatIon luI envoIe des InformatIons sur la forme de la
communIcatIon (nbr de mots, format, ...)
L'auteur envoIe son papIer en 4 exemplaIres
Apres la date de soumIssIon, le comIt d'organIsatIon se runIt et
dtermIne sur la base d'une lIste de rfrs, l'attrIbutIon des papIers
aux rfrs.
Dn envoIe chaque rfr un ensemble de papIers, avec une fIche
d'valuatIon pour chaque papIer.
Chaque rfr renvoIe les fIches d'valuatIon remplIes avec
d'ventuelles annotatIons sur les papIers
Le comIt scIentIfIque se runIt pour slectIonner les papIers pour la
confrence. Chaque papIer est soIt accept soIt refus.
Le comIt scIentIfIque communIque son travaIl au comIt
d'organIsatIon.
Le comIt d'organIsatIon renvoIe aux auteurs les fIches d'valuatIon et
les papIers annots par les rfrs aInsI que la dcIsIon d'acceptatIon
ou de refus
Les auteurs accepts renvoIent une copIe dfInItIve de leur papIer
pour l'ImpressIon des actes de la confrence.
342 Modeliser et realiser une BD
...
Questions
1) 0crIvez ce scnarIo avec un graphe utIlIsant les symboles des
usecase
2) A partIr du graphe, dfInIssez la responsabIlIt du comIt
scIentIfIque aInsI que les objets avec lesquels Il travaIlle.
J) 0crIvez comment avec les outIls nternet (Web, emaIl, ...) et les
bases de donnes, Il est peuttre possIble de satIsfaIre CDNFEF.
0e U|L SQL J4J
26. 39,2 Le matin
Lnonce
|onsIeur l'admInIstrateur se trouvaIt assIs derrIere son bureau, un
observateur extrIeur auraIt pu penser qu'Il rvaIt. En faIt Il pensaIt la
rdactIon d'une tude qu'Il devaIt envoyer la semaIne prochaIne aux moyens
et coordInatIons de l'InformatIque admInIstratIve quI supervIsaIt l'ensemble
des projets InformatIques.
L'admInIstratIon de cette cole de commerce avec ses deux mIlle leves, ses
cInq cents enseIgnants n'allaIt pas toujours toute seule, car les moyens en
personnel taIent lImIts quatre secrtaIres. La seule chappatoIre
semblaIt tre l'InformatIsatIon d'un certaIn nombre de tches rptItIves.
Le poInt le plus chaud de l'anne taIt la rentre et sa prparatIon. Une foIs
l'horaIre tablI, tche quI consIstaIt satIsfaIre les contraIntes d'horaIres
des enseIgnants et celles des cours du plan d'tude de chaque degr, Il
fallaIt tablIr deux types de documents :
le plan des cours par classe, un pour chaque leve;
l'horaIre de l'enseIgnant.
l se pencha pour examIner les documents, Ils taIent IdentIques dans leur
prsentatIon, sous forme de grIlle horaIre :
Les jours taIent (LU, |A, |E, 7E, SA).
Les tranches horaIre
1 : 08h.00 08h.45
2 : 08h.50 09h.J5
J : 10h.00 10h.45
4 : 10h.50 11h.J5
5 : 14h.00 14h.45
6 : 14h.50 15h.J5
7 : 15h.50 16h.J5
8 : 16h.50 17h.J5.
Le nom des enseIgnants fIguraIt sur certaIns documents.
La classe taIt note par un chIffre dsIgnant le degr et une lettre
(ex. JH). Les classes avaIent en moyenne 20 leves.
Les dIscIplInes (souvent abrges) : droIt, comptabIlIt, franaIs,
anglaIs, dactylographIe.
SI ce systeme InformatIque pouvaIt rpondre dIffrents types
d'InterrogatIons, Il y avaIt une actIvIt qu'Il fallaIt qu'Il assume, celle dont
s'occupaIt |me Xeres; Il s'agIssaIt du servIce des remplacements. En effet,
chaque jour Il fallaIt veIller ce que tous les cours soIent donns mme en
344 Modeliser et realiser une BD
cas de maladIe d'un professeur. Et ce n'taIt qu'en dernIer recours que l'on
donnaIt cong aux leves.
Cette actIvIt l'InquItaIt un peu, car d'une part |adame Xeres allaIt partIr
la retraIte et que d'autre part elle exIgeaIt que la personne quI s'en occupe
arrIve avant tout le monde 7 heures pour prendre les messages (sur le
rpondeur tlphonIque) des matres quI taIent tombs malades depuIs la
veIlle. Et parmI les autres secrtaIres de l'cole aucune n'avaIt montr
d'Intrt pour cette tche quI n'taIt pas tres complexe, maIs quI demandaIt
de l'organIsatIon. Une foIs Il en avaIt parl avec |me Xeres quI luI avaIt
dclar :
7oIl comment je procede :
Le matIn j'arrIve, j'coute toute la bande du rpondeur et je note au
fur et mesure le nom des enseIgnants quI seront absents et la dure
suppose de leur absence, sI elle est connue.
EnsuIte je vaIs chercher la fIche de chaque enseIgnant et je repere
lesquels ont des heures d'enseIgnement cette journe. 8Ien entendu, Il
faut se proccuper des heures de la matIne en premIer lIeu.
Apres je vaIs consulter le fIchIer des remplaants. l y en a 200
envIron, maIs la dIffIcult est de trouver ceux quI sont dIsponIbles
pour la tranche horaIre consIdre car chacun suIt des cours
l'UnIversIt et Ils ne sont pas toujours dIsponIbles. 0e plus Il faut qu'Ils
soIent capables d'enseIgner la matIere. Heureusement que j'aI une
bonne mmoIre car ce fIchIer n'est pas pratIque; Il est class par ordre
alphabtIque et ne se prte pas ce type de recherche (voIr fIche en
annexe).
EnsuIte, je tlphone au remplaant pour vrIfIer s'Il luI est possIble
de donner ce cours et je luI IndIque l'heure des cours qu'Il doIt
remplacer, le degr de la classe et la dIscIplIne. Je luI donne aussI le
nom du professeur et son numro de tlphone pour qu'Il puIsse
prendre des renseIgnements sur le programme suIvre.
Souvent je doIs tlphoner plusIeurs remplaants car Ils ne sont pas
chez eux ou Ils effectuent dj des remplacements pour d'autres
coles.
Plus tard dans la journe, je recherche des remplaants satIsfaIsant
les mmes crIteres maIs sur une plus longue dure sI l'absence de
l'enseIgnant doIt se prolonger.
DuI, une bonne mmoIre se dIt l'admInIstrateur en examInant une fIche
type d'horaIre de classe. Le nombre de professeurs absents taIt
relatIvement faIble : de J, maIs en hIver ce chIffre pouvaIt monter jusqu'
8. En rsum, ce qu'Il luI fallaIt, c'taIt un systeme permettant de se
substItuer ce bac de cartes de remplaants quI taIt tres dIffIcIle utIlIser.
0e U|L SQL J45
fIgure 1 : fIche horaIre de classe
L'admInIstrateur commena rdIger sa demande et son analyse.
Nous vous demandons d'effectuer l'analyse que va faIre cet admInIstrateur. l
s'agIt d'analyser le champ d'applIcatIon, en partIculIer les dIffrents acteurs
et Intervenants et leurs actIvIts, de dcrIre les donnes quI doIvent tre
stockes, d'tablIr une modlIsatIon possIble de cellescI (en utIlIsant U|L
les cas d'utIlIsatIon, les classes et les objets) , d'envIsager les archItectures
InformatIques possIbles pour supporter et facIlIter ces actIvIts.
fIgure 2: fIche horaIre de professeur
LU
Dactylo
Franais
Franais
Anglais
Anglais
InIo
InIo
MA
Droit
Droit
Histoire
Compta
Compta
ME
Economie
Anglais
Anglais
Geographie
Compta
Compta
Steno
Steno
VE
Dactylo
Franais
Franais
Allemand
Allemand
Gestion
Gestion
SA
Math
Math
Economie
Economie
Tranche
Horaire
1
2
3
4
5
6
7
8
Horaire de classe
Numero de la classe : 3H
Horaire - ProIesseur
Nom: Hugo
Adresse: 15, avenue de France
MA
Histoire/3H
Franais/3G
Franais/3G
LU
Franais/3H
Franais/3H
ME
VE
Franais/3H
Franais/3H
Histoire/3G
SA
Franais/3G
Franais/3G
Tranche
Horaire
1
2
3
4
5
6
7
8
Prenom: Victor
Num.Tel. : 15.15.15
346 Modeliser et realiser une BD
fIgure J: fIche du remplaant
Diagramme des cas d'utilisation
Horaire - ProIesseur
Nom: .................... ...............
Adresse: ................ ................
Annee immatriculation : . .........
Falculte: ............... ................
Disciplines possibles :
Prenom: ................. ........
Num.Tel. : .............. ........
Licence : ............... ..........
MA
LU
ME
VE
SA
Tranche
Horaire
1
2
3
4
5
6
7
8
1) ...................... ....
2) ...................... ....
3) ...................... ....
4) ...................... ....
Table de disponibilite : (mettre une croix si disponible)
39,2 le matin
enseignant
remplacant
etudiant
organiser les remplacements
remplacer
Proposer ses services
Annoncer son absence
Actiivites de
39,2 le
matin
include~~
secretaire
0e U|L SQL J47
39,2 le matin
enseignant
remplacant
etudiant
organiser les remplacements
remplacer
Proposer ses services
Annoncer son absence
Actiivites de
39,2 le
matin
include~~
secretaire
348 Modeliser et realiser une BD
Diagramme des classes
fIgure: J9,2 le matIn
Classes
Idclasse : string
degre : integer
Tranches
heure : string
jour : string
Remplacants
anneeImatriculation : integer
repondre au telephone()
s'inscrire()
licence : string
decider()
Disciplines
discipline : string
anneeImatriculation : integer
repondre au telephone()
discipline : string
Prfrence
preIerence : integer preIerence : integer
rpondeur
messages : undeIined
ecouter()
enregistrer()
messages : undeIined
Personnes
nom : string
prenom : string
adresse : string
telephone : string
Enseignants
dateEngagement : Date
Enseignements
dateEngagement : Date
s'inscrire()
nom : string
prenom : string
adresse : string
telephone : string
*
donne 1
licence : string
ecouter()
enregistrer()
*
destine a
1
*
decider()
heure : string
jour : string
disponible
*
*
*
1
concerne
planiIie le
*
*
Idclasse : string
degre : integer 1
0e U|L SQL J49
27. QCM ligth
Une petIte rvolutIon secoue l'Agence NatIonale pour la ScurIt FoutIere
(ANSF) depuIs quelques moIs, l'ANSF a dcId d'InformatIser la gnratIon
des examens thorIques du code de la route. Les examens, dj sous la
forme de QuestIonnaIres ChoIx |ultIples (QC|), seront entIerement
InformatIss. Une premIere tape consIste :
entrer dans une base de donnes, l'ensemble des questIons d'examen
par domaIne;
gnrer automatIquement des QC|;
Installer des salles d'examen InformatIses.
La seconde tape prvoIt:
l'tude statIstIque des rponses;
l'dItIon d'un logIcIel grand publIc (accompagnant le code de la route);
une tude sur la pdagogIe.
Une prtude a tablI les InformatIons quI suIvent:
L'enseIgnement est rpartI en dIffrentes catgorIes (CD0E, PFDFTE,
SECDUFS|E, ...) IdentIfIes par d_0omaIne. A chaque domaIne, on assocIe
un lIbell LIb_0omaIne. Selon l'Importance du domaIne, un nombre mInImal
Nbr_|In_questIons de questIons est exIg pour chaque domaIne.
Chaque domaIne est couvert par un ensemble de questIons possIbles (Un
QC| est un sousensemble de ces questIons). Une questIon est IdentIfIe par
un numro d_QuestIon. L'nonc de la questIon est un texte LIb_QuestIon.
Une questIon est assocIe un seul domaIne. Un renvoI A_revoIr prcIse la
ou les pages quI concernent cette questIon. Un nIveau de dIffIcult
NIveau_dIffIcult de 1 10 value chaque questIon.
A chaque questIon est assocI un ensemble de rponses possIbles. Une seule
rponse est correctE. Une rponse est IdentIfIe d_Feponse par A, 8, C , ...
(une des possIblIts du QC|). L'nonc de la rponse est un texte
LIb_Feponse. Une rponse est assocIe une seule questIon. Pour chaque
rponse, on value sI elle est juste (ouI/non).
Les InformatIons dcrItes cIdessus permettent de dcrIre, pour chaque
domaIne, un ensemble de questIons et leurs rponses. A partIr de ces
InformatIons, Il est possIble de gnrer des QC|.
Un QC| est IdenfI par un numro d_QC|. Dn luI assocIe la date de
l'examen 0ate_examen pour lequel Il a t cr. Les questIons du QC| sont
numrotes de 1 100 No_QuestIon_QC|. Chaque questIon du QC| est
assocI une seule questIon possIble d'un des domaInes enseIgns.
350 Modeliser et realiser une BD
Un examen est l'ensemble des rponses apportes par une personne un
QC|. 0onc chaque QC| faIt l'objet d'un ensemble d'examens.
Une personne est IdentIfIe par numro d_Personne. Une personne porte un
prnom et un nom. Un examen est remplI par une seule personne et porte
sur un seul QC|. Pour chaque questIon, de l'examen, on conserve les
rponses de la personne. Ces dernIeres permettent de donner un rsultat
l'examen resultat_obtenu.
Domaine des constituants
A_revoIr texte
0ate_examen date
d_0omaIne mot (CD0E, PFDFTE, SECDUFS|E, ...)
d_personne entIer [1..9999999]
d_QC| entIer [1..9999]
d_QuestIon entIer [1..9999]
d_Feponse mot (A, 8,C)
Juste mot (ouI, non)
LIb_0omaIne texte
LIb_QuestIon texte
LIb_Fponse texte
Nbr_|In_questIons entIer [J..10]
NIveau_dIffIcult entIer [1..10]
nom texte
No_QuestIon_QC| entIer [1..100]
prenom texte
resultat_obtenu entIer [0..100]
Relations
0omaInes_EnseIgns (d_0omaIne, LIb_0omaIne, Nbr_|In_questIons)
QuestIons_PossIbles(d_QuestIon, LIb_QuestIon, d_0omaIne,
NIveau_dIffIcult, A_revoIr)
Feponses_PossIbles(d_QuestIon,d_Feponse, LIb_Fponse, Juste)
QC|(d_QC|, 0ate_examen)
QuestIon_QC|(d_QC|, No_QuestIon_QC|, d_QuestIon)
Personnes( d_personne, nom, prenom)
Examen(d_personne, d_QC|, resultat_obtenu)
Feponses_Examen(d_personne, d_QC|, No_QuestIon_QC|, d_Feponse)
0e U|L SQL J51
Dependances fonctionnelles
1) d_0omaIne LIb_0omaIne, Nbr_questIons
2) d_QuestIon, LIb_QuestIon, d_0omaIne, NIveau_dIffIcult, A_revoIr
J) d_QuestIon,d_Feponse LIb_Fponse, Juste
4) d_QC| 0ate_examen
5) d_QC|, No_QuestIon_QC| d_QuestIon
6) d_personne nom, prenom
7) d_personne, d_QC| resultat_obtenu
8) d_personne, d_QC|, No_QuestIon_QC| d_Feponse)
Semantique
PempIIr Ies tabIes correspondant aux Instances des reIatIons afIn
d'exprImer Ie texte quI suIt:
Caston LeFoux (personne12J) rpondu la JJeme questIon de son examen
QC| (144) par le choIx 8.
La JJeme questIon de ce QC| est la qestIon (numro 4500) quI
appartIennent au domaIne SCNALSATDN. Son nonc est L'InterdIctIon de
cIrculer est un panneau. Son nIveau de dIffIcult est J.
Les rponses choIx sont:
A) cIrculaIre, avec un bord blanc et un fond rouge (faux)
8) cIrculaIre, avec un bord rouge et un fond blanc (juste)
Un QC| comporte au mInImum 10 questIons sur le domaIne SCNALSATDN.
0omaInes_enseIgns d_0omaIne LIb_0omaIne Nbr_|In_questIons
QuestIons_
PossIbles
d_QuestIon LIb_QuestIon d_0omaIne NIveau_
dIffIcult
A_revoIr
Feponses_PossIbles d_QuestIon d_Feponse LIb_Fponse Juste
QC| d_QC| 0ate_examen
QuestIon_QC| d_QC| No_QuestIon_QC| d_QuestIon
352 Modeliser et realiser une BD
Personnes d_personne nom prenom
Examen d_personne d_QC| resultat_obtenu
Feponses_Examen d_personne d_QC| No_QuestIon_QC| d_Feponse
Questions de modelisation
CompIter Ie schma quI suIt en pIaant Ies assocIatIons manquantes et
en donnant des cardInaIIts en rapport avec notre nonc.
REPONSESPOSSIBLES
ID_REPONSE
LIB_REPONSE
QUESTIONSPOSSIBLES
ID_QUESTION
LIB_QUESTION
NIVEAU_DIFFICULTE
A_REVOIR
QUESTIONSDUQCM
NO_QUESTION_QCM
QCM
ID_QCM
DATE_EXAMEN
PERSONNES
ID_PERSONNE
PRENOM
NOM
EXAMEN
RESULTAT_EXAMEN
DOMAINESENSEIGNES
ID_DOMAINE
LIB_DOMAINE
NBR_QUESTIONS
0e U|L SQL J5J
Repondre en SQL
1) LIste des domaInes par ordre alphabtIque
2) LIste des personnes (Nom et prnom) ayant 0 faute.(100 poInts)
J) 0IffIcult moyenne des questIons possIbles par domaIne
4) LIste des questIons possIbles ayant aucune rponse possIble juste
(erreur de saIsIe)
5) LIbell des questIons et des rponses justes du QC| 144 par
ordre croIssant.
6) Quel est l'nonc de cette requte :
select a.id_qcm, sum(b.niveau_diffficult)
from Questions_du_QCM a , Questions_Possibles b
where a.id_question=b.id_question
group by a.id_qcm
order by sum(b.niveau_diffficult)
7) Quel est l'nonc de cette requte :
select nom, prenom
from Personnes p, Examen e, QCM q
where p.id_personne=e.id_personne
snd e.id_qcm=q.id_qcm
and q.date_examen between '1-jan-94' and '31-dec-94'
8) Quel est l'nonc de cette requte :
select nom, prenom, count(e.id_personne)
from Personnes p, Examen e
where p.id_personne=e.id_personne
group by nom, prenom
having count(e.id_personne) >=5
0e U|L SQL J55
28. ML1GL
(|enuIserIe En Tout Cenre et EbnIsterIe)
|ETCE
2J
est une entreprIse de menuIserIe, dont la plupart de l'actIvIt est
orIente dans l'quIpement des nouveaux btIments. Elle fournIt et pose
dans les Immeubles les cadres de porte, les portes, les cadres de fentre et
les armoIres. L'entreprIse est dIvIse en quatre dpartements :
le bureau technIque quI tablIt les soumIssIons et quI s'occupe des
nouvelles conceptIons;
l'atelIer quI commande les matIeres premIeres, fabrIque et prpare les
lments d'un contrat pass |ETCE;
le dpartement chantIer quI est charg du montage et de la pose des
lments dans les Immeubles;
le dpartement de gestIon quI s'occupe de la comptabIlIt et de la
gestIon admInIstratIve de l'entreprIse.
PV de Ia PunIon :
0ans le bureau du dIrecteur de |ETCE sont runIs le 0Irecteur (0), le
CestIonnaIre (C), le chef d'atelIer (A), le technIcIen (T) et le Chef de
chantIer (C) (dans le dIalogue quI suIt nous n'utIlIserons que l'InItIale des
personnages pour dsIgner celuI quI parle).
0 : 7ous n'Ignorez pas que nous avons, Il y a 6 moIs, prIs la dcIsIon de
fabrIquer nousmmes les armoIres et que nous avons effectu des
InvestIssements dans plusIeurs machInes spcIalIses. Avant cette dcIsIon,
nous achetIons chez AF|D8LDC les armoIres toutes quIpes que nous
n'avIons plus qu' poser. 0epuIs, nous achetons chez ACLD SA le boIs quI est
prdcoup et sur lequel nous faIsons toutes les opratIons ncessaIres
l'obtentIon d'une armoIre. Nous avIons sousestIm les dIffIcults de gestIon,
de coordInatIon et de calcul que demandent ces opratIons. 0es erreurs de
calcul, de fabrIcatIon nous ont oblIgs envoyer au rebut des lments de
chez ACLD SA car Ils n'avaIent pas les bonnes dImensIons ou bIen, comme
cela est arrIv sur le dernIer chantIer, dmonter une partIe des blocs dj
poss, car le perage pour fIxer la barre de penderIe taIt trop bas. 0e plus,
l'nervement et les heures supplmentaIres demandes par la gestIon de
cette nouvelle fabrIcatIon contrIbuent un mauvaIs clImat de travaIl. Je
comprends bIen que chacun de vous faIt de son mIeux et je tIens ce que la
bonne humeur quI rgnaIt dans notre entreprIse revIenne. |.C., que j'aI
engag Il y a deux ans pour restructurer et modernIser nos outIls de gestIon
2J
sujet labor avec le professeur JeanClaude Courbon
356 Modeliser et realiser une BD
et d'analyse fInancIere, peut certaInement nous aIder dans ce cas aussI. l
peut nous effectuer une analyse de la sItuatIon, quI nous servIra ensuIte
comme cahIer des charges pour prendre contact avec des entreprIses de
servIces InformatIques. Cette faon de procder nous avaIt pargn bIen des
peInes, Il y a dj deux ans, lors de notre prIse de contact avec les
InformatIcIens purs. |.C., je vous laIsse la parole.
C : Je croIs que le plus sImple est de suIvre le parcours d'une armoIre depuIs
le dpart jusqu' sa pose. Du cela dbutetIl : (C sort un bloc et prend des
notes).
T : En ce quI concerne le bureau d'tude technIque, nous recevons les
demandes de soumIssIon, que nous effectuons sur plan ou apres vIsIte du
chantIer. La soumIssIon consIste tablIr le prIx dtaIll de l'ensemble
poser, celuIcI varIe en fonctIon du nombre de botes poser.
C : Qu'entendezvous par bote :
T : Une bote est l'lment le plus sImple d'un ensemble d'armoIres. Nous
mesurons la longueur totale de l'ensemble que nous dIvIsons en botes, selon
les dsIrs de l'archItecte, par exemple une longueur de 160 cm peut tre
dIvIse en troIs botes (60cm 50cm 50cm). Un autre poInt Important est la
sItuatIon de l'armoIre par rapport au mur, nous avons quatre cas :
(le technIcIen sort son stylo et dessIne).
fIgure 1 : sItuatIon d'un bloc d'armoIres
A : En effet, c'est Important car lors de la commande du boIs, Il faut en tenIr
compte car les cots vIsIbles doIvent tre aussI recouverts du stratIfI
demand par le clIent.
T : La couleur du stratIfI faIt partIe de la soumIssIon, car le prIx change en
fonctIon des couleurs, le blanc tant le moIns cher.
C : l y a quelque chose que ne ne comprends pas, sI l'on juxtapose des
botes, Il y a deux paroIs pour les partIes que se touchent, c'est une perte.
C : 7ous avez raIson, on parle de botes maIs en faIt Il s'agIt de botes sur
lesquelles Il manque le cot gauche, et quI ont aInsI une forme de C, sur la
dernIere on ajoute un panneau de termInaIson pour complter le tout.
Niche Angle gauche visible
Angle droit visible Arriere visible
0e U|L SQL J57
C. dessIne aussI !
fIgure 2 : assemblage d'un bloc d'armoIre
C : Ah ouI, je voIs, contInuons avec la soumIssIon.
T : 7oyons ! Un ensemble de botes a la mme hauteur, mme profondeur.
|aIs chaque bote a sa propre largeur et une ou deux portes. S'Il n'y a qu'une
porte Il faut prcIser sI elle s'ouvre gauche ou droIte. (l allume une
cIgarette.)
Je voIs que l'on a faIt le tour de l'extrIeur de la bote. |aIntenant, passons
son amnagement IntrIeur. L'archItecte doIt prcIser le nombre de
rayonnages par bote et sI ventuellement Il y a une penderIe. Dn est
complet :
C : DuI.
C : Comment s'tablIt le prIx de la soumIssIon :
T : C'est assez sImple, avec l'exprIence, nous avons prIs des temps de pose
et de fabrIcatIon moyens et nous nous sommes aperus que ceuxcI taIent
en fonctIon du nombre de portes d'une bote, nous comptons donc en portes.
par porte l'atelIer 1h.J0
et par porte sur le chantIer 2h.00.
C : A Fr. 52. l'heure d'ouvrIer, selon notre dernIere analyse.
T : DuI, c'est cela. L'autre lment Important est la surface de boIs utIlIse
Fr. 9,50 / m2 pour le blanc et des surplus pour les autres couleurs.
A : 7ous oublIez les garnItures, vIs, serrures, poIgnes et les gonds. Dn
compte envIron Fr. 40. de garnIture par bote.
T : 7ous avez raIson. Avec tous ces lments, on calcule le prIx de la
soumIssIon que l'on envoIe au clIent. TroIs cas se prsentent, Il accepte
cellecI, ou bIen Il la refuse et dans certaIns cas on nous demande certaInes
modIfIcatIons, ce quI nous oblIge tout recalculer. Les soumIssIons
comportent entre 50 et J00 botes.
C : DuI, c'est beaucoup de travaIl quand on saIt que nous avons effectu 450
soumIssIons l'anne passe et que nous avons 20 de taux d'adjudIcatIon pour
des soumIssIons.
0 : C'est, je pense, tres Important, de lImIter les InvestIssements en temps
humaIn dans les soumIssIons, tout en conservant une prcIsIon et une
comptItIvIt des prIx sur le march. Et en plus cela prend beaucoup de
place, ces dossIers, quand on pense que certaInes soumIssIons sont gardes
deux ans.
358 Modeliser et realiser une BD
C : Quelqu'un veutIl un caf :
C;T;A : ouI, volontIers.
0 : DuI, je vaIs aller les chercher, je croIs que nous en avons termIn avec
les soumIssIons, contInuez sans moI. (Le dIrecteur sort).
T : DuI, des que la soumIssIon est accepte nous la transfrons l'atelIer.
A : C'est l que nous Intervenons, nous effectuons une commande ACLD SA
des dIffrents panneaux de boIs stratIfI en IndIquant les mesures dsIres
aInsI que la couleur. 0es que nous les rceptIonnons, nous les calIbrons, car
Ils sont dcoups grossIerement, ensuIte nous effectuons toutes les
opratIons de prparatIon l'assemblage, c'estdIre :
pose des charnIeres sur les portes;
perage des trous pour les rayonnages;
collage des bandes de stratIfI sur les bords apparents des panneaux;
et dIverses prparatIons concernant les dos des botes, les poIgnes ...
C : Du se sItuent les dIffIcults :
A : Elles sont sur les calculs des dIffrentes cotes de perage et sur les
dImensIons de panneaux commander. Les calculs sont sImples, maIs Il ne
faut pas oublIer des dtaIls comme de tenIr compte de l'paIsseur des
panneaux euxmmes. Ce travaIl est rptItIf et ennuyeux, et malgr son
Importance, Il arrIve que l'on se trompe.
C : Etesvous sI sur de sa sImplIcIt :
A : Dh ouI, pour l'apprentI j'aI prpar un schmatype, avec les dIffrentes
cotes, et les regles de calcul. l luI suffIt d'applIquer systmatIquement les
regles de calcul pour obtenIr les bonnes dImensIons.
C : Et que se passetIl ensuIte, lorsque tout est prpar :
C : C'est l'quIpe du chantIer quI travaIlle, elle passe au magasIn chercher les
garnItures :
8 vIs d'assemblage sImple par bote
1 poIgne par rayon
4 taquets par rayon
(les trIngles habIt sI ncessaIre).
Dn charge, bIen sur, les panneaux prpars sur un camIon et l'on va monter
le tout dans un Immeuble. (Le dIrecteur revIent avec les cafs.)
C : Quels sont les problemes quI peuvent apparatre sur le chantIer :
C : Normalement aucun sI toutes les tapes prcdentes se sont droules
correctement ... ParfoIs, on perd du temps reconnatre les lments d'une
bote, Il seraIt pratIque de pouvoIr tIqueter les pIles, pour sImplIfIer le
montage.
0 : DuI, c'est vraI. |aIs je croIs que les tapes en amont sont prIorItaIres. C,
avezvous suffIsamment d'InformatIon pour esquIsser un systeme
d'InformatIon assIstant la gestIon de cette nouvelle fabrIcatIon :
0e U|L SQL J59
C : Un dernIer poInt. QuI d'entre vous est susceptIble de se servIr d'un
systeme InformatIs mettre en place :
T : |oI, oblIgatoIrement pour grer toutes les soumIssIons et les contrats
sIgns.
A : Nous en aurons besoIn pour tablIr les commandes chez ACLD SA, maIs
aussI pour pouvoIr consulter les lments de rglage des machInes.
C : |oI, Il suffIt d'un lIstIng, surtout sI l'tIquetage est bIen faIt.
0 : C'est tout :
C : DuI, je pense. l est mIdI, je vaIs aller manger et je feraI cette analyse
cet apresmIdI. Et je propose que nous nous runIssIons 17 heures pour en
dbattre.
(Les gens se dIsent aurevoIr et partent manger. C ramasse un dessIn faIt
par A reprsentant un bloc d'armoIre).
fIgure J : un bloc d'armoIres
Nous vous demandons d'effectuer l'analyse que va faIre ce |onsIeur C., de
reconstruIre le parcours de cette armoIre, des dIffrents acteurs et
Intervenants, des tches qu'Ils effectuent, de dcrIre les donnes quI doIvent
tre stockes, de dcrIre une modlIsatIon possIble de cellescI, d'envIsager
les archItectures InformatIques possIbles pour supporter et facIlIter cette
nouvelle fabrIcatIon.
CertaInes InformatIons sont absentes du dIalogue, par exemple un clIent a
une adresse, un chantIer a une adresse, etc. Nous vous demandons de les
complter avec le bon sens, en mentIonnant nous faIsons l'hypothese que
.... Par aIlleurs, d'autres InformatIons peuvent tre Inconnues de |onsIeur
C., et nous vous demandons de dresser une lIste de questIons que devra
poser C. lors de la runIon 17 heures pour affIner son analyse.
bote 2 bote 1 bote n
largeur 1
largeur totale
hauteur
proIondeur
360 Modeliser et realiser une BD
Diagramme des classes
Domaine des constituants
PaIsonSocIaIe texte
Accept boolen (DuI, Non)
Adresse entIer
CouIeur mot(blanc, rouge, vert, .)
0ateSoumIssIon date
0ebutTravaux date
FInTravaux date
Hauteur rel
Largeur rel
LargeurTotaIe rel
NbroIte entIer
NbreExempIaIreentIer
NbrePorte entIer [1..2]
NbrePayon entIer
NooIte entIer
NoChantIer rel
NoCIIent entIer
NoEnsembIe entIer
Boites
NoBoite : integer
Largeur : real
NbrePorte : integer
OuverturePorte : string
NbreRayon : integer
Penderie : boolean
NoBoite : integer
Largeur : real
NbrePorte : integer
OuverturePorte : string
NbreRayon : integer
Penderie : boolean
Armoires
NoEnsemble : real
Hauteur : real
ProIondeur : real
Visibilite : string
LargueurTotale()
NbreBoite()
SurIaceTotale()
NbreExemplaire : integer
Couleurs
Couleur : string
Prix : real
NoEnsemble : real
Hauteur : real
ProIondeur : real
Visibilite : string
LargueurTotale()
NbreBoite()
SurIaceTotale()
NbreExemplaire : integer
Couleur : string
Prix : real
1
Clients
RaisonSociale : undeIined
Adresse : undeIined
StatistisqueSoumission()
RaisonSociale : undeIined
Adresse : undeIined
StatistisqueSoumission()
1
Soumissions
NoChantier : integer
DateSoumission : date
DebutTravaux : date
FinTravaux : date
PrixTotal()
Accepte : boolean
NoChantier : integer
DateSoumission : date
DebutTravaux : date
FinTravaux : date
PrixTotal()
Accepte : boolean
*
1 * * 1
*
0e U|L SQL J61
DuverturePorte mot( Cauche, 0roIte, Centrale)
PenderIe boolen (DuI, Non)
PrIx rel
PrIxTotaI rel
Profondeur rel
SurfaceTotaIe rel
VIsIbIIIt mot( NIche, AngleCauche, .)
Relations
(une cl de la relatIon est IndIque par un soulIgnement)
Dn remarque le choIx d'Implmenter les mthodes comme des attrIbuts
stocks.
CLIENTS (NoClIent , FaIsonSocIale, Adresse)
CDULEUPS (Couleur, PrIx)
SDUhISSIDNS (NoChantIer, NoClIent, 0ateSoumIssIon, 0ebutTravaux,
FInTravaux, Accept, PrIxTotal)
APhDIPES (NoEnsemble, NoChantIer, Profondeur, 7IsIbIlIt,
NbreExemplaIre, LargeurTotale, Nbr8oIte, SurfaceTotale)
DITES (No8oIte, NoEnsemble, Largeur, NbrePorte, DuverturePorte,
NbreFayon, PenderIe)
Questions
1) 0onnez le dIagramme des cas d'utIlIsatIon.
2) La modlIsatIon est entIerement fate avec des assocIatIons, peuton
utIlIser dans certaIn cas la composItIon sI ouI pourquoI.
Cas ou on peut utIlIser la composItIon :
Cas ou on peut pas utIlIser la composItIon :
Compltez le dIagramme suIvant :
Soumissions
Clients
Armoires Boites
Couleurs
J) Pour mmorIser les constantes de calcul, le concepteur hsIte entre deux
modlIsatIons de classe. AIdez le en dressant un tableau des avantages et
InconvnIents (pensez en termes de complexIt et d'volutIvIt !)
362 Modeliser et realiser une BD
constante1 constante2
Avantages
Inconvenients
4) Pour mesurer les prIx de revIent, Il a t dcIder de rajouter les lments
suIvants la modlIsatIon. Quelles sont les relatIons ajouter :
5) 0onner l'ordre SQL pour crer la table 8DTES et Insrer un exemple de
donnes dans cellecI avec un ordre SQL.
Constantes1
NomConst : string
ValeurConst : real
Constantes2
TempsPosePorte : real
TempsMontagePorte : real
CoutHeureOuvrier : real
Visserie : real
Soumissions
NoChantier : integer
DateSoumission : date
DebutTravaux : date
FinTravaux : date
PrixTotal()
Accepte : boolean
Ouvriers
NoOuvrier : integer
Nom : string
Prenom : string
TariIHoraire : real
Heures
NbreHeuresEIIectuees : integer
* *
NoChantier : integer
DateSoumission : date
DebutTravaux : date
FinTravaux : date
PrixTotal()
Accepte : boolean
NoOuvrier : integer
Nom : string
Prenom : string
TariIHoraire : real
NbreHeuresEIIectuees : integer
0e U|L SQL J6J
6) Fpondre en Langage AlgbrIque sI possIble et en SQL aux questIons
suIvantes:
1) 0onnez une lIste de tous les clIents par ordre alphabtIque
2) 0onnez une lIste des clIents dont une des soumIssIons acceptes
taIent d'un montant suprIeur un mIllIon de francs
J) 0onnez une reqte quI permette de calculer le taux
d'adjudIcatIon (nbr de soumIssIons / nbr de celle quI sont
accepts)
4) 0onnez une lIste des armoIres dont la largeur totale n'est pas
gale la somme de la largeur de ses boItes.
0e U|L SQL J65
29. L1UDL DL CAS : A B C D
24
P.8. plaa dans la platIne une nouveaut qu'Il n'avaIt pas encore coute, quI
sIlencIeusement fut avale par le lecteur. l ImagIna le rayon du laser la
recherche des trous du dIsque compact (C0). Les cIrcuIts lectronIques quI
reconstruIsaIent le sIgnal sonore. DuI, c'taIt vraIment de la musIque cela !
0errIere son comptoIr, Il regarda le magasIn, mInuscule peuttre, maIs quI
contenaIt dj 9.000 C0s. l essaya de se le rappeler 9 moIs auparavant, vIde
quand avec son assocI Il taIt venu le vIsIter. l se dIt qu'Ils avaIent encore
une certaIne navet, ce qu'Ils voulaIent c'taIt vendre des dIsques, crer un
magasIn de C0s ou l'on pourraIt couter le dIsque, obtenIr un renseIgnement,
faIre une rservatIon, dIscuter musIque et bIen entendu acheter un C0 au
prIx le plus avantageux. En rsum, les C0s au prIx des grandes surfaces avec
tous les servIces et les aspects humaIns d'un petIt commerant.
Ces objectIfs avaIent faIllI tourner court. En effet, Ils avaIent sous estIm les
charges de gestIon et de manIpulatIon exIges par ce magasIn. Ces actIvIts
taIent telles qu'Ils avaIent de moIns en moIns de temps consacrer aux
clIents. l y a deux moIs, Ils avaIent dcIds d'InformatIser une partIe des
actIvIts de gestIon du magasIn. Cette ordInateur seraIt un peu comme le
troIsIeme assocI (quI dans la sItuatIon actuelle n'auraIt pas pu tre
rtrIbu).
0e l'InformatIque, Il n'avaIt pas de connaIssances spcIfIques maIs les
premIers contacts avec cet unIvers furent frustrants, Il n'avaIt trouv que
des gens quI parlaIent |byte, |S/0DS, CCA, Lotus, 80, FS2J2, .... Son
expressIon favorIte C'est |artIen taIt tout faIt de cIrconstance. En effet,
aucun ne s'taIt Intress son probleme; tous ne voulaIent que luI vendre
un ordInateur. Cependant, cecI taIt une carIcature, car Il avaIt trouv une
personne quI avant de luI parler dans un langage hermtIque l'avaIt cout
et s'taIt dplac dans le magasIn pour examIner les actIvIts quotIdIennes
InformatIser.
Ce soIr, Il se sentaIt rassur. |. Ccoute semblaIt avoIr comprIs leur
probleme. l s'taIt promen dans le magasIn toute la journe, avaIt pos des
questIons, prIs des notes, observ leur comportement.
L'actIvIt du magasIn taIt entIerement orIente vers le C0. Quand un C0
arrIvaIt, on effectuaIt les opratIons suIvantes :
S'Il est nouveau, on luI attrIbue un numro et l'on cre un fIche sur
carte.
Dn enregIstre sur la fIche le nombre d'exemplaIre quI sont entrs.
24
sujet labor avec le professeur JeanClaude Courbon
366 Modeliser et realiser une BD
Dn place dans le prsentoIr la pochette du C0 (avec un numro
IdentIfIant la fIche correspondante).
Dn place le dIsque dans un tIroIr fermm clef. (|algr ces
opratIons, on enregIstraIt encore quelques vols de pochettes vIdes !).
Lorsqu'un clIent achetaIt un C0, avec le numro InscrIt, on dcrmentaIt le
stock d'une unIt sur la fIche et l'on recherchaIt le dIsque dans le tIroIr.
Le fIchIer taIt spar en troIs bacs de cartes de couleurs dIffrentes,
IndIquant un style de musIque :
8leu ClassIque
Jaune Fock 7arIt
Fouge Jazz
|. Ccoute avaIt demand sI la numrotatIon actuelle pourraIt tre modIfIe
afIn de ne pas transporter des InformatIons (la couleur) quI n'auraIent plus
leur place dans un systeme InformatIs. P.8. avaIt rpondu que seul le style
de musIque luI ImportaIt.
Ces fIches taIent la mmoIre de l'entreprIse A8C0, tout y taIent not,
maIs c'taIt une mmoIre d'amnsIque car comment rechercher un tItre, un
auteur dans J000 fIches : Comment grer les commandes, les ruptures de
stock :
En examInant une fIche, on voyaIt que chacune comportaIt, un auteur, un
style, un tItre, un numro Interne (pour son classement dans le magasIn), un
dIteur, un numro externe (celuI quI est marqu par l'dIteur) et dIffrents
parametres de gestIon tels que la quantIt en stock ou en commande et son
code de prIx de vente.
L'estImatIon de la demande taIt le poInt le plus dlIcat de la gestIon des
C0s. CertaIns C0s allaIent tre vendus plusIeurs dIzaInes d'exemplaIres sur
quelques moIs alors que d'autres ne seraIent que le faIt de la demande d'un
unIque clIent pendant plusIeurs annes. l y avaIt une centaIne de tItres qu'Il
fallaIt surveIller quotIdIennement. La courbe des ventes s'amoraIt
lgerement au dpart, puIs elle atteIgnaIt un plateau quI se maIntenaIt
pendant un certaIn temps puIs c'taIt la chute soudaIne.
fIgure 1 : 7entes quotIdIennes d'un tItre
l fallaIt donc estImer les ventes futures probables et se rapprovIsIonner en
consquence en vItant qu'un stock Important reste Invendu.
TEMPS
VENTE
0e U|L SQL J67
Les commandes s'effectuaIent chez les dIstrIbuteurs suIsses des maIsons
d'dItIon des dIsques. SoIt un reprsentant passaIt au magasIn ou bIen P8 ou
son assocI tlphonaIt au dIstrIbuteur et passaIt sa commande. Une
commande faIsaIt l'objet d'un bulletIn de lIvraIson et sur celuIcI pour un C0
command on avaIt troIs possIbIlIts :
l taIt lIvr.
l taIt en rupture de stock (manque suIvra) et parfoIs une anne plus
tard on recevaIt le C0.
l n'taIt pas dIsponIble en SuIsse.
Le cas 2) taIt noter soIgneusement car le relIquat d'une commande taIt
consIdrer dans le stock car Il seraIt tot ou tard lIvr. Le cas J) pouvaIt faIre
l'objet d'une ImportatIon de l'tranger donc d'une nouvelle commande. Le
cas 1) demandaIt une vrIfIcatIon assIdue, car l Il fallaIt controler que :
Les C0s lIvrs avaIent bIen t commands.
Les quantIts taIent exactes.
La facture correspondaIt ce quI avaIt t convenu sur les prIx.
En effet, le prIx d'achat des C0s taIt source de ngocIatIon, le prIx taIt
dIscut en fonctIon de la quantIt commande et du chIffre d'affaIre que le
magasIn avaIt ralIs avec le dIstrIbuteur. 0'aIlleurs P8 tenaIt ce que
l'ordInateur luI IndIque le chIffre d'affaIre ralIs avec le dIstrIbuteur. CecI
allaIt dans la stratgIe payer le C0 au meIlleur prIx et vendre le C0 au
meIlleur prIx par rapport la concurrence. Ces rabaIs de quantIt suIvaIent
une chelle. Par exemple pour 4 C0s on payaIt prIx fort et pour 100 on avaIt
un rabaIs de J0. CecI renforaIt la ncessIt d'estImer les ventes
journalIeres, car Il valaIt mIeux commander le lot optImal en une seule foIs
plutot qu'en plusIeurs commandes. FInalement, un autre cas se prsentaIt, le
prcommande. l s'agIssaIt de la sortIe d'une nouveaut quI taIt annonce
plusIeurs moIs l'avance et quI le mme jour seraIt sur toute la planete,
dans tous les magasIns de C0. Ce cas taIt encore plus pIneux que les
autres car Il fallaIt estImer un an l'avance les chances de succes d'une
nouveaut.
368 Modeliser et realiser une BD
fIgure 2 : fIche pour un C0
Avant que |. Ccoute parte, P8 luI avaIt rsum ses dsIrs :
Le stock en temps rel.
L'estImatIon des ventes journalIeres.
Le controle des lIvraIsons.
Les IndIcatIons de ngocIatIons avec les dIstrIbuteurs.
|. Ccoute est rentr chez luI avec des InformatIons sImIlaIres celles
donnes dans cette tude de cas.
0crIvez le travaIl qu'Il va faIre, donnez la modlIsatIon de donnes.
EtablIssez une (ou des) proposItIons de systeme InformatIque avec leurs
justIfIcatIons.
Diagramme des cas d'utilisation
abcd
client
Iournisseur
acheter un CD
Iaire commander un CD
commander des CD
receptionner les CD
gerant
analyser les ventes
article : .............................. No ...........
.............................................................
.............................................................
Date QTE Fournisseur Entre Sortie Stock Client Observation
Gabriel Peter 2519
titre SO
Virgin
257 587
50
49
45
44
43
42
40
MV
1/9/86
3/9/86
4/9/86
5/9/86
7/9/86
8/9/86
commande le 10/9/86
11/9/86
10/9/86
40
+10
50
0e U|L SQL J69
Diagramme des classes
CommentaIres :
Dn remarquera que le suIvI des lIvraIsons n'est pas sImple en effet une
lIvraIson physIque peut :
Concerner une lIgne de commande et tre juste quantIt
Fegrouper plusIeurs lIgnes de commande (regroupement chez le
fournIsseur)
Etre Incomplete (ncessIte plusIeurs lIvraIsons)
Fiche Article
NoInterne : integer
ReIFournisseur : string
QTE en magasin()
QTE en commande()
Titre : string
Auteur : string
Genre : string
LigneCMD
NoLigneCMD : integer
Quantite : integer
PrixUnitaire : real
Livraisons
NoLIV : integer
dateLIV : date
LigneLIV
NoLigneLIV : integer
Quantite : integer
PrixUnitaire : real
PrixVente
CodePrix : string
Prix : real
NoLigneCMD : integer
Quantite : integer
PrixUnitaire : real
NoLIV : integer
NoLigneLIV : integer
Quantite : integer
PrixUnitaire : real
CodePrix : string
NoInterne : integer
ReIFournisseur : string
QTE en magasin()
QTE en commande()
Fournisseurs
NoFournisseur : integer
RaisonSociale : undeIined
Adresse : string
Vente
DateJour : date
Quantite : integer
NoFournisseur : integer
RaisonSociale : undeIined
Adresse : string
1
1
DateJour : date
Quantite : integer Prix : real
Titre : string
Auteur : string
Genre : string
*
1
*
1
* *
Commandes
NoCMD : integer
dateCMD : date
1 *
1
dateLIV : date
*
*
*
NoCMD : integer
dateCMD : date
*
1
Attribution
QteAttribuee : integer QteAttribuee : integer
Clients
NoClient : integer
Nom : string
Prenom : string
Adresse : string
Telephone : undeIined
MontantFidelite : real
*
*
NoClient : integer
Nom : string
Prenom : string
Adresse : string
Telephone : undeIined
MontantFidelite : real
*
0..1
0e U|L SQL J71
30. PLANS, PLANS, RA1APLAN
|. Saroule avaIt t engag dans un dpartement de l'admInIstratIon
publIque. l avaIt choIsI l'admInIstratIon car, depuIs ses tudes l'unIversIt,
Il aImaIt les organIsatIons et la gestIon de leur InformatIon, en somme les
systemes complexes. Le dpartement auquel Il appartenaIt taIt charg du
rseau routIer, plus de 10.000 kIlometres de routes et de tous les ouvrages
(tunnel, pont, ...). Ce dpartement possdaIt un servIce quI archIvaIt les
plans et les documents concernant l'excutIon des chantIers relatIfs au
rseau routIer.
Le servIce des archIves employaIt une dIzaIne de personnes quI rpondaIent
aux dIffrents besoIns du dpartement. Par exemple, lors de l'entretIen ou
de la rfectIon d'une route, Ils fournIssaIent les plans ncessaIres aux
travaux. SI un chantIer modIfIaIt les plans exIstants, Ils taIent chargs de
mettre jour l'tat des archIves. 8Ien entendu, autour de ces routes,
d'autres InformatIons cIrculaIent, celles relatIves au controle prIodIque
des ouvrages, au constat des dgts dus aux IntemprIes et toutes les
InformatIons sur les couts de constructIon et d'entretIen quI n'taIent pas du
ressort du servIce des archIves.
A son entre, |. Saroule avaIt peru la lenteur et l'IneffIcacIt du servIce des
archIves, dues entre autres au manque de personnel, la masse consIdrable
de documents et la grande dImensIon des plans (format A0). Cette
IneffIcacIt du servIce se traduIsaIt dans le reste du dpartement par des
retards et des Incompltudes dans les dossIers. Par exemple, des
renseIgnements sImples du genre: Quel est le bureau d'IngnIeur quI s'est
occup du dernIer chantIer de la sectIon 5 du tronon 14 de la route
natIonale 11 : pouvaIent rester dans le servIce des archIves sur la pIle des
urgents pendant plusIeurs jours. l s'agIssaIt donc de questIons auxquels un
systeme InformatIs auraIt pu apporter rapIdement des rponses prcIses.
Pour faIre face ces problemes de gestIon, le dpartement avaIt dbloqu
un crdIt d'InformatIsatIon du dpartement quI s'taleraIt sur une prIode de
cInq ans. Une petIte quIpe d'InformatIcIens seraIt recrute pour la
ralIsatIon et la maIntenance du systeme. |aIs au pralable, Il fallaIt que les
besoIns du dpartement soIent claIrement explIcIts. Un groupe de travaIl
avaIt donc t form et |. Saroule devaIt au seIn de ce groupe tudIer les
besoIns du servIce des archIves.
Pour mIeux cerner, les donnes manIpules par le servIce des archIves et
afIn d'Illustrer son dossIer, Il avaIt faIt un croquIs (fIgure 1)
S'Il avaIt du commenter ce schma, Il auraIt dIt Le rseau routIer se rpartIt
entre plusIeurs catgorIes de routes: les autoroutes, les routes natIonales,
les routes cantonales, les routes communales. Chacune est IdentIfIe par un
nom unIque (A10, FN17, FC206, ....). Chaque route est dcoupe en
372 Modeliser et realiser une BD
tronons et chaque tronon est luImme dcoup en sectIons. A chaque
sectIon est assocI l'ensemble des chantIers concernant cette sectIon. Les
chantIers sont reprs par une date de dbut et de fIn. La supervIsIon d'un
chantIer est excute par un bureau d'IngnIeur. Ce dernIer est dcrIt par un
ensemble de caractrIstIques (nom, adresse, ...) utIlIses dans la
correspondance ou dans les dIffrents rapports excuts par le dpartement.
Chaque chantIer apporte une nouvelle versIon des plans de la sectIon (un
plan d'ensemble et les dIffrents plans de dtaIl). En ce quI concerne le
rangement, chaque plan est rang dans un local quI comporte un certaIn
nombre d'armoIres dIvIses ellesmmes en plusIeurs tIroIrs.
Les sectIons avaIent en moyenne une longueur de 1 kIlometre et les tronons
entre J et 20 kIlometres. Chaque sectIon possdaIt un chantIer (celuI de sa
cratIon), maIs certaInes sectIons avaIt dj subI une quInzaIne de
modIfIcatIons (et donc autant de chantIers).
Un autre poInt Important du systeme d'InformatIon laborer taIt celuI des
mIcrofIlms. En effet, le volume des archIves taIt devenu tellement
Important qu'une partIe des plans, ceux concernant des chantIers ancIens,
taIent actuellement stocks dans un autre btIment. l avaIt t dcId de
mIcrofIlmer ces plans. Le systeme InformatIque devraIt donc donner une
IndIcatIon sur la nature des plans (grandeur nature ou mIcrofIlm). Par
aIlleurs, le systeme devraIt aussI slectIonner les plans mIcrofIlmer sur des
crIteres tels que le nombre de versIons et l'ancIennet des chantIers pour
une mme sectIon.
CecI permettraIt de ne conserver sur papIer que les versIons les plus
rcentes et aInsI de mInImIser la surface des locaux d'archIves.
La dIsponIbIlIt des InformatIons du servIce des archIves dans l'ensemble du
dpartement taIt souhaItable. Chaque servIce devraIt donc avoIr acces aux
donnes, maIs seul le servIce des archIves auraIt la possIbIlIt de faIre des
modIfIcatIons. AInsI les demandes les plus sImples (quI s'est occup de tel
chantIer :) seraIent dIrectement satIsfaItes. Pour les demandes ncessItant
par exemple la copIe d'un plan, Il faudraIt envIsager un moyen de
communIcatIon entre les dIffrents servIces du dpartement et le servIce des
archIves.
|. Saroule resta encore tard dans son bureau pour rdIger son analyse
prlImInaIre pour la runIon du groupe de travaIl.
Nous vous demandons d'effectuer l'analyse que va faIre ce |onsIeur Saroule,
d'examIner le servIce des archIves, les dIffrents acteurs et Intervenants, les
tches qu'Ils effectuent, de dcrIre les donnes quI doIvent tre stockes, de
dcrIre une modlIsatIon possIble de cellescI, d'envIsager les archItectures
InformatIques possIbles pour supporter et facIlIter ce systeme d'InformatIon
aInsI que les types d'utIlIsatIon qu'Il permettra et les procdures pour les
accomplIr.
0e U|L SQL J7J
CertaInes InformatIons sont absentes de l'nonc. Nous vous demandons de
les complter avec le bon sens, en mentIonnant nous faIsons l'hypothese
que ....
fIgure 1
chantier: elargissement de la chaussee
date du 1.2.87 au 1.6.87
RN15 tronon 6
sect 1
sect 2
sect 3
sect 4
bureau d'ingenieur XXX
local 102
armoire12
tiroir 4
plans
0e U|L SQL J75
3J. BIBLIOGRAPHIL
[AF|74] Armstrong W. W.
0ependency structures of data base relatIonshIps ProceedIng FP 1974,
North Holland
[8DE76] 8oehm 8.W.
Software EngIneerIng, EEE, TransactIon computer C25, 0ecember 1976
[8DN99] 8onjour |. ; Falquet C. ; Cuyot J. ; Le Crand A.
Java : de l'esprIt la mthode, dIstrIbutIon d'applIcatIons sur nternet
EdItIon 7uIbert, 1999
[8FE90] 8reton P.
Une hIstoIre de l'InformatIque EdItIon de la 0couverte, 1990
[CHE74] ChenIque F.
Comprendre lc loyque moderne. Ed. 0unod 1974
[CLD81] ClocksIn W.F.; |ellIsh C.S.
, SprInger7erlag, 1981
[CD070] Codd E.F.
A relatIonal |odel of 0ata for Large Shared 0ata 8anks CommunIcatIon
AC|, 7ol 1J, No 6, June 1970
[0AT87] 0ate C.J.
A yude to the SQL stcndcrd AddIsonWesley 1987
[0EL82] 0elobel C.; AdIba |.
8cses de donnes et systmes relctonnels, 0unod 1982
[FAL89] Falquet C.
lnterroycton de bcses de donnes c lcde dun modle smcntque Ed.
Systemes et nformatIon Ceneve, 1989
[FFY76] Fry J.P.; SIbley E.H.
EvolutIon of data base management systems, ComputIng Surveys AC|, 7ol
8, No 1, 1976
[CDL72] ColdstIne H.
The computer FFD| Pascal to von Neuman PrInceton UnIversIty Press,
1972
[CFA81] Cray J.N.
the transactIon concept: vIrtues AN0 lImItatIons ProceedIng 7th
nternatIoal conferenc 1981, EEE 7ery Large 0ata base System.
[HDT89] HottoIs C.
Penser lc loyque. Ed. 0e 8oeck UnIversIt 1989
[HDU88] HouIllere P.
Le schma dIrecteur d'un systeme d'InformatIon, Eyrolles, 1988
376 Modeliser et realiser une BD
[JAC92] . Jacobson, |. ChrIsterson, P. Jonsson, C. Dvergard
DbjectDrIented software engIneerIng : A use case AddIsonWesley 1992
[JAC94] . Jacobson, |. CrIss, A. Jacobson
The object advantage : 8usIness Process FeengIneerIng wIth object
techonology AddIsonWesley 1994
[JAC97] . Jacobson, ,|. CrIss, P. Jonsson
software Feuse : ArchItecture, Process and DranIzatIon for 8usIness
Success AddIsonWesley 1997
[JEN75] Jensen K.; WIrth N.
PASCAL user mcnucl AN0 report, SprInger 7erlag, 1975
[KDW79] KowalskI F.
Loyc ]or problem solvny, North Holland, 1979
[LED88] Lonard |.
Structure des bcses de donnes. Ed. 0unod 1988
[LS94] LIskov 8.; WIng J.
"A 8ehavIoral NotIon of SubtypIng", AC| TransactIons on ProgrammIng
Languages and Systems, 7ol 16, No 6, November, 1994, pages 18111841
[|SH92] |Ishra P.; EIch |.H.
JoIn processIng In FelatIonal 0atabases, AC| computIng surveys, 7ol 24, No
1, |arch 1992
[NAU6J] Naur P.
Feport on the algorIthmIc langage ALCDL 60, AC| 6, No 1, 196J
[D|C99] Dbject |anagement Croup
UnIfIed |odellIng Language dernIere versIon: www.omg.org
[PAP79] PapadImItrIou C.H.
serIalIzabIlIty of concurrent database updates. Journal AC|, 7ol 26, No 4 ,
Dct. 1979
[PHA90] Le Pham Ngung Huong
DptImIsatIon globale des controles d'IntgrIt dans une base de donnes
EdItIons systemes et InformatIon, 1990
[FEE50] Fees |.
The federal computIng machIne program reproduIt dans Annals of hIstory
of computIng vol 7, No 2, 1985
[ULL82] Ullman J. 0.
Prncples o] 0ctcbcse systems Computer ScIence Press, 1982
[WAF99] J. 8. Warmer; A. C. Kleppe
The Db]ect Constrcnt Lcnyucye: Precse Modelny wth 0ML , AddIson
Wesley, 1999
[WF76] WIrth NIklaus
Alyorthms + 0ctc Structures = Proyrcms , PrentIce Hall, 1976
J77
J79
32. Index
, 148
_, 148
1NF, 40, 2J6
2NF, 2J8
JNF, 2J9
abstractIon, 15, 60
Access, 160
ccteur, 50, 54
Acteur, 62
acyclIques, 218
agrgatIon, 154
AgrgatIon, J7, 11J
algebre relatIonnelle, 12J, 257
ALCDL 60, 96
AlgorIthme, 2J4
de recherche de cls, 216
lI au df, 209
alias, 14J
all, 146
aII, 14J, 150, 154, 260
AND, 146
anomalIe, 185, 191, 195, 225, 24J
anomalIes de mIse jour, 2J6
any, 146
any, 150, 158, 260
appartenance
un ensemble, 146, 147
un Intervalle, 146, 149
une chane de caracteres, 146
Appartenance
une chane de caracteres, 148
arborescence, 156
crt, 124
Armstrong, 202
asc, 158
assocIatIon, 25, 108
attrIbu, 112
AssocIatIon bInaIre, J0
assocIatIons, 22, 25
atomIcIt, 176
attrIbuts, 24, 112
augmentatIon, 202
autojoInture, 145
avg, 154
axIome, 202
axIomes, 88
8ackusNaurForm, 96
8arbres, 258
base
complete, 209, 210, 221
Irredondante, 211, 267
base de donnes I|d, 9J
besoIns, 50
between, 146
between, 149
8ETWEEN, 260
bIcondItIonnel, 87
bIen forme, 1J1
bInaIres, 102
8NF, 96
8ooch, 17
8PF, 50, 5J
by rowId, 262
calcul
des classes, 90
des proposItIons, 90
caractere, 101
cardInalIt, 27, J1, 108
cardInalIt de la relatIon, 124
cas d'utIlIsatIon, 50
chane de caracteres, 144
chanes de caracteres, 86, 101
character, 101
charnIere, 199
charnIere, 129
Check, 192
chemIns d'acces;, 261, 26J
classe, 21, 105
Classe, 55
Classe d'assocIatIon, J2
classes, 20
classIfIcatIon, 4J
clauses de Horn, 249
cl, 106, 199, 215
prImaIre, 194
unIque, 219
Codd, 199
colonne, 100
columnconstraInt, 192
commIt
ImplIcIte, 180
commIt, 180
communIcable, 15
comparaIson, 146
compltude, 20J
Compltude, 206
comportement, 20
comportement homogene, 86
J80
Composants, 54
composItIon, J8, 41, 11J
concatn, 144
concurrence, 141
concurrence, 17J, 176, 187
condItIon, 146
CondItIon, 141
condItIonnel, 87
confIrmatIon, 180
conjonctIon, 87
CDNNECT 8Y, 251
ConnectClause, 141, 156
connecteurs logIques, 126
consquence logIque, 202
consquence logIque, 201
conservatIon de l'InformatIon, 225
consIstance, 176
consIstance, 186
consIstent, 185
constante non sIgne, 144
constItuant, 100
constItuant, 86
contraInte, J4
contraInte de navIgabIlIt, J7
contraInte entre assocIatIons, J7
contraInte entre roles, J6
contraIntes, 101
Controleur, 62
conversIon de type, 147
Count, 154
couts
de valIdatIon, 188
couverture, 208
covarIance, 47
CFEATETA8LE, 192
CFEATE7EW, 244
cratIon, 174
cratIon, 178
cratIon d'une entIt, 101
croIssant, 158
cycle de vIe, 18
d'tatstransItIons, 64
date, 101
declaratIondomaIne, 97
declaratIonrelatIon, 97
0clenchement, 55
dcomposItIon
bInaIre, 2J0
d'une relatIon, 225
joInIable, 226
proprIt, 227
0composItIon, 204
d'une relatIon, 221
totale, 228
dcroIssant, 158
dductIon, 249
dduIre, 202
delete, 180
deletecommand, 180
dnombrable, 84
dnombrer, 154
0normalIsatIon, 272
dpend fonctIonnellement, 199
dpendance
calcule, 247
d'InclusIon, 190
lmentaIre, 207
fonctIonnelle, 199
drIvatIon, 20J
desc, 158
dtermIne, 199
dveloppement, 52
dIagnostIc, 191
dIagramme, 55
0Iagramme d'objets, 24
0Iagramme de classes, 22
dIagrammes, 66
syntaxIques, 96
syntaxIques de SQL, 100
dIffrence, 124
dIsjonctIon, 87
dIsplayed column, 141
dIstInct, 142, 154
dIstrIbutIvIt, 90
dom, 86
domaIne, 84
domaInes, 84
doublons, 156
doublons, 142
durabIlIt, 176
dynamIques, 187
ebf, 1J1
lments, 64
enjeux, 59
ensemble
de constItuants, 92
de dpendances fonctIonnelles, 201
de donnes, 86
de prImItIves, 190
de relatIons, 9J
de valeurs, 84
des constItuants, 86
des domaInes, 86
des entIts, 94
des Instances, 185
des rI, 185
ensembles, 84
entIt, 20
entIt, 100
EntIt, 62
entIt r, 92
quIjoInture, 128
J81
EquIvalence, 209
quIvalence, 204
quIvalence des ordonnancements, 177
et logIque, 146
tat, 20
consIstent, 176
toIle, 200
vnement., 171
exclusIve, 181
exIsts, 146
exists, 150, 157
ExIsts, 260
expressIon, 144
expressIons
algbrIques, 1J0, 1J7
arIthmtIques, 14J
calcules, 141
proposItIonnelles, 89
expset, 148
facteur, 144
Factor, 144
FactorIser, 45
faux, 87
]ermeture, 186, 201
fonctIon
de regroupement, 144
de slectIon, 127
proposItIonnelle, 90
fonctIon, 144
Forme canonIque, 205
forme normale, 40
Forme normale 8oyceCodd, 240
formule, 1J0
FPDh, 1J7, 145, 24J
frontIere, 15, 59
gnralIsatIon, 4J, 46, 114
CnralIsatIon, 41
gestIon de la concurrence, 177, 178
grammaIre d'un langage, 96
graphIque des df, 200
GROUP BY, 154, 244
CroupClause, 141, 154
hashcodIng, 258
having, 147, 154
hrItage, 41, 4J
hrItage multIple, 48
HrItage |ultIple, 46
HeurIstIque, 219
IdentIfIcateur de range, 261
IdentIfIcateurs, 97
ImplmentatIon physIque, 256
in, 146, 260
In, 147
Indpendance logIque, 246
Index, 258, 262
Index, 26J, 268
InformatIons redondantes, 179
InItIalIser une table, 152
InsatIsfaIsable, 186
Insrer, 102
Insert, 178
Insertcommand, 178
InsertIon, 178
Instance, 104, 124
de la relatIon, 9J
de R, 9J
nteractIons, 56
Interdpendance, 274
nterface, 62
Interface graphIque, 160
InterprtatIons correctes, 1J1
Interprter une valeur, 87
InterrelatIon., 188
InterrogatIon, 12J, 1J2, 225
Intersect, 156
Intra
relatIon,, 188
tuple, 188, 190
InvarIant, 199
InvarIants, 170
Irredondant, 186, 208
IsomorphIsme, 90
Jacobson, 18, 50
Java, 106
]onture, 192, 259, 264, 268
externe, 1J0
naturelle, 140
naturelle, 129
par boucle ImbrIque, 264
par trI et fusIon, 264
]onture, 127, 1J7
JoInture
externe, 151
journal, 177
l'arIt, J0
L'encapsulatIon, 22
l'Instance, 24
langage
de descrIptIon de modlIsatIon, 96
de descrIptIon des donnes, 96, 100
de manIpulatIon de donnes, 178
langage procdural, 106
langages
de programmatIon, 84
langages de programmatIon, 101
l'volutIon de l'InformatIque, 12
IIens, 24, J5
lIgne, 100
like, 146
lIke, 149, 260
lIsIbIlIt, 10J
LIskov, 44
J82
lIsteIntervalle, 97
lIstevaleur, 97
Lockmode, 181
logIcalfactor, 146
l'D|C, 17
l'optImIsatIon ;des requtes SQL. Jusqu' prsent, nous
avons faIt abstractIon de l'ImplmentatIon
physIque.I.ImplmentatIon physIque; des relatIons et
nous avons dcrIt le fonctIonnement de la machIne SQL
en termes purement logIques. Les Instances des relatIons
dans un SC80 sont stockes physIquement; au schma
logIque des relatIons est assocI un schma
physIque.I.schma, 256
machIne SQL, 1J7, 159
machIne SQL, 1J8
masque de saIsIe, 18J
masques de saIsIe, 184
matchstrIng, 149
max, 154
maxImum, 154
mcanIsmes de scurIt, 14J
mthode, 106
mthodes, 20, 22
min, 154
mInImum, 154
minus, 156
mIse jour, 174, 176, 179
modele, 15, 105
|odele de dpIoyement, 19, 6J
|odele de raIIsatIon, 19, 6J
|odele des cas d'utIIIsatIon, 18, 6J
|odele des cIasses, 18, 6J
|odele des tats, 18, 6J
|odele des InteractIons, 18, 6J
modele |d, 104
modlIsatIon, 12, 97
modlIsatIon, 85
modlIsatIon |d, 9J
modlIsatIon graphIque, 1J2
modlIsatIons
quIvalentes, 199
modIfIcatIon, 225, 245
|D0FCATDN
0ES 0DNNEES, 170
moyenne, 154
ngatIon, 87
nombres, 86
vIrgule fIxe, 102
en vIrgule flottante, 101
entIers, 102
not, 146
Not Null, 192
notatIon, 22
nowaIt, 181
noyau du SC80, 184
null, 115, 146, 150, 246
null, 151
Null, 192
nuplet, 92
objectIf, 15
objectIfs, 51
Dbjets, 20
occurence, 171
DCL, 65
DId, 106
DDSE, 17
oprateurs
arIthmtIques, 144
de comparaIson, 126, 147
de projectIon, 126
ensemblIstes, 156
logIque, 128
logIques, 87, 146
opratIons
de comparaIson, 86
de slectIon, 85
ensemblIstes, 141
optImIsatIon, 159
optImIseur, 257
OR, 146
DrderClause, 141, 158
ordre
de joInture, 264
hIrarchIque, 156
lexIcographIque, 85
ou loyque, 124, 146
package, 2J
paquetages, 65
PASCAL, 18J
PASCAL, 96
patron, 148
performance, 256, 27J
performance, 26J
plan d'excutIon;., 269
porte d'une regle, 189
prdIcat, 88, 184
quantIfI, 146
prdIcat, 90, 102, 146
prservatIon des df, 225
PrservatIon des df, 2J2
prImary key, 106
PrImary Key, 192
prImItIve de modIfIcatIon, 188
prImItIves de modIfIcatIon, 171, 174
PrIncIpe de substItutIon, 44
prior, 156
processus, 62
de conceptIon, 199
de modlIsatIon, 100
d'InterrogatIon, 1J1
produIt
cartsIen, 84, 92, 100, 126, 141, 145, 257
produt, 126, 1J7
J8J
cartsIen, 90
programmatIon, 22, 40
programmatIon logIque, 249
projectIon, 14J
de F, 221
pro]ecton, 125, 1J7, 141
PFDLDC, 249
proposItIon, 89
compose, 87
sImple, 87
proposItIon, 87
proposItIons
logIques, 84
protocoles lgaux, 176
Pseudo transItIvIt, 204
puts, 217
quantIfIcateur unIversel, 151
quantIfIcatIon
exIstentIelle, 89
unIverselle, 89
quantIfI, 150
racIne, 157
raffInements, 41
raItement, 256
range scan, 26J
read only, 180
recherche des cls, 219
recherche des InvarIants, 184
rcupratIon des erreurs, 176
rcursIvIt, 250
rcursIvIt, 154
redondances logIques, 24J
rcrIture, 257, 259
rcrIture de la requte, 245
Feferences, 192
rflexIvIt, 202
regles d'IntgrIt, 101, 176, 184, 225
en SQL, 192
regroupement, 141, 14J, 144
regroupement, 154
relatIon, 105
d'ordre, 85, 147
parentenfant, 157
unIverselle, 247
relcton, 124, 1J7
ncre, 84, 91
relatIon d'extensIon, 57
relatIon d'InclusIon, 57
relatIon de communIcatIon, 57
renommer une colonne, 14J
reprsentatIons
logIques, 246
reprIse, 177
requtes SQL, 1J7
restructuratIon, 199
rutIlIsatIon, 45
rIsque, 59
roles multIples, 26
rollback, 181
row
exclusIve, 181
share, 181
rowId, 261
Fumbaugh, 17
satIsfaIsable, 185
saturatIon, 205, 215
savepoInt, 180
scnarIo, 55
ScnarIo, 61
schma
de relatIon, 201
physIque, 256
scurIt des donnes, 17J
SELECT, 1J7, 24J
SELECTcommand, 141
selectedtable, 145
selectedtable, 141
slectIon, 257
slecton, 127, 1J7
slectIon en SQL, 1J7
smantIque, 102
de la relatIon, 92
smantIque, 94
semIjoInture, 129
gauche, 1J0
sensIbIlIt d'une prImItIve, 190
squence
de prImItIves, 176
squences, 64
Set-CIause, 141, 156
SC80 hIstorIque, 172
share, 181
row exclusIve, 182
somme, 154
source, 217
sousrequte, 150, 152, 178
spcIfIcatIon, 50, 51
SQL, 12J
start wIth, 157
statIques, 187
statIstIques, 259
strotype, 65
strotypes, 2J
Strotypes, 5J
stockage, 256
structure, 9J
structur, 10
structure de table, 100, 101, 10J
structures de donnes, 257
Subquery, 152
subqueryCFEATE, 182
substItutIon, 24J
J84
sum, 154
suppressIon, 174, 175
SuppressIon, 180
symboles
nontermInaux, 96
termInaux, 96
syntaxe SQL, 96
systeme de dductIon, 202
systemes InformatIques, 94
table squentIelle, 261
tablename.*, 14J
tables, 100
tautologIe, 90
tautologIe, 88
terme, 144
thoremes, 88
thtajoInture, 127
tIers exclu, 90
traductIons, 118
transactIon, 59, 171, 176, 180
annule, 181
confIrme, 181
errone, 177
Inacheve, 176
transactIon, 186
transactIoncommand, 180
transItIvIt, 202
trI, 158
trI, 141
trIvIal, 185
type, 84, 101
boolen, 86
date, 86
domaIne, 188
mot, 85
mot ordonn, 85
numrIque, 86
texte, 85
types numrIques, 102
typologIe des domaInes, 85
ull scan table, 262
unIcIt, 190
unon, 124, 1J7, 156
UnIon, 204
unIque, 26J
UnIque, 192
UnIque scan, 26J
update, 179
Update, 107
UpdateClause, 141
Updatecommand, 179
utIlIsateurs, 50
valeur par dfaut, 101
valIdatIon
globale, 191
locale, 191
valIde, 185
valIdIt, 20J
valIdIt des donnes, 86
varIable lIbre, 89
varIables, 20, 88
lIbres, 84
vrIfIcatIon, 184
verrouIllage, 141
verrous, 177, 178, 181
versIon, 45
vIde, 148
7EW, 244
vraI, 87
vue, 115, 24J, 268, 270
vues, 107
WHEPE, 1J7, 146, 154, 179, 24J
WIrth, 96
wIth check optIon, 246
J85