Vous êtes sur la page 1sur 13

Cours de travaux dirigs en introduction aux

systmes dinformation
UFR AES Universit Montpellier I (2006/2007)
Par Javier GIL QUIJANO (javiergquijano@gmail.com)
Retour la page principale

Construction de la matrice de dpendance


Rgles suivre pour la construction de la Matrice de dpendance fonctionnelle
1. Deux donnes sont en dpendance fonctionnelle, si la connaissance dune valeur de la
1re (donne source) permet de dterminer la connaissance dUNE ET SEULEMENT
dUNE valeur de la 2nde (donne but).
Exemple : Supposons que un tablissement universitaire est situ dans une et seulement
dans une ville. Si lon connat le nom dun tablissement on peut dterminer le nom ville
o il est situ (il y a seulement une valeur de nom de ville possible).

Le nom de la ville (but) dpende fonctionnellement du nom de ltablissement


universitaire (source).
Ex. : NomEtablissement NomVilleEtablissement (Luniversit Montpellier
I est situ Montpellier).

Dans le sens inverse il ny a pas de dpendance fonctionnelle : si lon connat le nom


de la ville on peut connatre PLUSIEURS noms duniversits au lieu dun
seul. A Montpellier il existe les universits Montpellier I, Montpellier II, Montpellier
III

2. Toute donne dpende fonctionnellement delle-mme : Ceci est not par une * dans la
matrice de dpendance fonctionnelle
3. Les constantes ne dpendent pas fonctionnellement dautres donnes : Les constantes ne
sont pas le but daucune dpendance fonctionnelle
4. Toutes les donnes ( lexception des constantes et des identifiants) doivent tre le but
dune dpendance fonctionnelle : La matrice de dpendance fonctionnelle ne doit pas faire
apparatre des lignes sans 1 ( lexception des lignes contenant de constantes et des
identifiants).
5. Toutes les donnes ne doivent dpendre fonctionnellement que dUNE et SEULEMENT
UNE donne : Dans chaque ligne de la matrice ne doit avoir quun 1. Si une donne est le
but de plusieurs dpendances fonctionnelles, on choisit une des dpendances et on limine
les autres.
6. Si lon arrive pas a placer des dpendances fonctionnelles dans toutes les lignes, mme
aprs lajout de nouveaux identifiants, il existe deux possibilits : soit la donne appartient

une RELATION, soit cette donne nest pas pertinente et il faut donc lliminer de notre
modle.

Construction pas pas de la matrice :


Remarque : La matrice de dpendance fonctionnelle est un tableau qui permet de trouver les
dpendances fonctionnelles entre les diffrentes donnes. Elle permet de croiser les donnes
avec elle mmes pour dtecter ces dpendances.
Mthode :
La matrice de dpendance fonctionnelle est une matrice carre o les colonnes reprsentent
les sources des dpendances et les lignes les buts. Toute donne est une source potentielle.
Il faut donc parcourir la matrice colonne par colonne. La colonne i correspond la donne i.
Lorsque lon parcours la colonne i on considre comme source potentielle la donne i et
comme but potentiels toutes les autres donnes.
Exemple: Dans la matrice de la figure 1. La colonne 7 reprsente la donne ClientCode,
lorsque lon parcours cette colonne le code du client est considr comme source potentielle.
Pour dterminer les diffrents dpendances fonctionnelles qui ont pour source la colonne i, il
faut pour chaque ligne rpondre la question : Si lon connat UNE valeur de la donne i,
peut-on connatre/dterminer UNE valeur ET SEULEMENT UNE de la donne de la ligne ?
Si la rponse est oui on crit un 1 dans la colonne i la ligne en question.
Exemple : Pour la colonne 7 ligne 3 : Si lon connat une valeur du code du client, peut-on
connatre une valeur et seulement une du montant de la caution dun client ? La rponse est
oui, car le code du client tant un unique pour un certain client, il nous permet daccder aux
informations relatives chaque client, dont la caution. La rponse est donc aussi positive pour
le nom, prnom, adresse, tlphone et date dinscription du client.
Par contre pour la colonne 7 ligne 1 : Pour la rponse la question : Si lon connat une valeur
du code du client, connatre une valeur et seulement une du nom de la boutique ? La rponse
est ngative, car il nexiste une relation unique entre un client et une seule boutique, un client
peut louer/rendre des livres dans diffrentes boutiques.

Figure 1. Sources et Buts de la matrice de dpendances fonctionnelles.


Si lon fait la mme analyse pour chacune des colonnes on obtient la matrice de la figure 2.
Dans cette matrice il nexiste que deux sources, car il ny a que deux colonnes qui contiennent
des 1(la colonne 7 et la colonne 17).
Les deux sources que lon a trouv sont le code du client et le code du exemplaire. La
premire est la source de toutes les dpendances fonctionnelles dans la colonne 7. Ces
dpendances ont comme buts toutes les donnes qui dcrivent un client. La deuxime est la
source de toutes les dpendances dans la colonne 17. Ces dpendances ont comme buts des
donnes qui dcrivent un exemplaire. Le nom et prnom de lauteur et de lditeur ne
dpendent pas fonctionnellement du code de lexemplaire car il peut exister plusieurs auteurs
et plusieurs diteurs pour un mme livre.
Dans cette matrice, on na pas trouv des dpendances fonctionnelles pour les donnes 1, 2,
13-26, 30-33 : leurs lignes ne contiennent pas des 1. Il ny a pas assez didentifiants pour
toutes les donnes.

Figure 2. Matrice de dpendances fonctionnelles, premire version.


Si lon ajoute les donnes suivantes :
34
35
36
37

Code de la boutique
Code de l'auteur
Code de l'diteur
Code du livre

On obtient la matrice de la figure 3. Nouvelles dpendances fonctionnelles apparaissent, mais


il continue avoir des lignes sans 1 :
1. Les donnes 18 20 sont des constantes. Les constantes ne dpendent fonctionnellement
daucune autre donne (Rgle 3), donc il est normal de ne pas trouver des 1 dans les lignes
18 20. Il est ncessaire de conserver ces constantes dans notre systme car elles
interviennent dans le calcul des tarifs de location de livres.
18 Tarif de retard
19 Tarif normale
20 Dlai max. retour

2. Les donnes 13 16 (voir figure xx) ne sont pas le but daucune dpendance
fonctionnelle car elles ne dcrivent pas des entits (client ou exemplaire) mais les relations
emprunter et rendre. Ces donnes feront partie des donnes des Associations rendre et
emprunter dans le schma Entit/Association.
3. Quant la donne nom du club (ligne 2) : dans lnonc il tait prcis quil nexiste
quun club, pour cette raison toutes les donnes qui dcrivent le club, notamment son nom
sont en quelque sorte des constantes. Il sapplique donc la rgle 3. Cette constante
diffrence des constantes 18 20 ne sert pas dans le calcul daucune autre information,

elle na aucune utilit directe dans notre systme. Pour cette raison, on dcide de
lliminer du systme dinformation.
4. La date de rsiliation (donne 9) ne dpend pas dune autre. Elle nexiste que lors quun
client est limin du systme, de lors elle ne doit pas faire partie du systme.

Figure 3. Matrice de dpendances fonctionnelles, deuxime version.


Un nouveau problme apparat lors de lajout des nouvelles donnes. Les donnes genre, titre
et anne dun livre (donnes 10 12) dpendent fonctionnellement de deux donnes sources
diffrentes : le code de lexemplaire (colonne 17) et le code du livre (colonne 37).
Comme toute donne ne doit dpendre fonctionnellement que dune source (Rgle 5), il faut
faire un choix entre les deux possibles sources. Le choix le plus adapt dans le cas de la
location des livres et de faire dpendre les donnes genre, titre et anne du code du livre car il
est plus gnral que le code de lexemplaire : pour un mme livre il existe plusieurs
exemplaires, si lon associe ces donnes au livre et non pas lexemplaire, elles devront tre
rentres seulement une fois. Si lon choisit le code de lexemplaire, il y aura de la redondance
(les mmes informations de titre, anne et genre seront rptes plusieurs fois, une fois par
exemplaire).

Figure 4. Matrice de dpendances fonctionnelles, version


finale.

Cours de travaux dirigs en introduction aux


systmes dinformation
UFR AES Universit Montpellier I (2006/2007)
Par Javier GIL QUIJANO (javiergquijano@gmail.com)
Retour la page principale

Dtermination des identifiants et des entits


A partir de la matrice de dpendance fonctionnelle on a trouv 6 identifiants :
Identifiants
CodeBoutique
CodeClient
CodeLivre
CodeExemplaire
CodeEditeur
CodeAuteur

A chacun des identifiants on peut associer une entit qui contient les donnes qui dpendent
fonctionnellement de cet identifiant. Ces entits sont prsentes dans la figure 1 :

Figure 1. Entits, premire version.


Amlioration des entits :
Sachant que le nombre de valeurs que le genre dun livre peut prendre est limit (roman, BD,
sport, histoire), on le spare en une nouvelle entit qui contient la valeur du genre et dont
lidentifiant est un code du genre. Les nouvelles entits sont prsentes dans la figure 2. Il faut
noter que le champ LivreGenre dans lentit livre a changer par le champ CodeGenre.

Figure 2. Entits, version finale.

Travaux Pratiques
Gestion des transactions dans Oracle
Procdure de connexion Oracle
Doc. technique Oracle
Isolation des transactions dans Oracle
Stockage interne dans Oracle
Partie I : Transactions et concurrence
Dans cette partie, on veut tudier le comportement d'Oracle en cas d'accs concurrents
la mme ressource. Pour cela on va simuler l'excution concurrente de programmes
l'aide du petit ensemble de lectures/critures.
Crer une table Clients et un compteur par les commandes suivantes:
CREATE TABLE C (
NB

number(8) not null,

NOM

varchar2(20),

PRENOM

varchar2(20),

TYPE

varchar2(10)

)
/
CREATE SEQUENCE COMPTEUR
INCREMENT BY 1
START WITH 1
NOCYCLE
/

Insrer dans la table des clients le contenu de la table B avec de nouveau NB obtenus par le
compteur. Ajouter un attribut cave a la table C. Initialiser cet attribut pour tous les clients en
fonction de leur type (petit=50, moyen=100, gros=500). Crer 3 fichiers, nomms
stock.sql, livraison.sql et conso.sql
stock.sql

PROMPT 'Recherche du stock de Cesar';


SELECT 'La rserve de Cesar est de : ' || cave || '
bouteilles'
FROM c WHERE nom='Cesar';

livraison.sql
PROMPT 'Un achat de 120 bouteilles est effectu par Cesar'
UPDATE C SET cave = cave + 120 WHERE nom = 'Cesar';
PROMPT 'Nouveau stock de Cesar';
SELECT cave FROM C where nom = 'Cesar';

conso.sql
PROMPT 'Cesar retire 10 bouteilles de son stock';
UPDATE C SET cave = cave - 10 WHERE

nom = 'Cesar';

PROMPT 'Nouveau stock de Cesar';


SELECT cave FROM C where nom = 'Cesar';

Ouvrir deux fentres SQLPLUS. Chaque session est considre par ORACLE comme un
utilisateur, et on a donc 2 utilisateurs, nomms 1 et 2, en situation de concurrence. Dans tout
ce qui suit, on note INSTRi l'excution de l'instruction INSTR par l'utilisateur i. Par exemple
LIVRAISON1 correspond l'excution du fichier livraison dans la premire fentre par
la commande @livraison. On note de mme ROLi et COMi l'excution des commandes
rollback; et commit; dans la fentre i.
ORACLE pratique une verrouillage deux phases assez particulier. L'objectif est d'essayer
de comprendre quel est ce type de verrouillage. Il faut savoir que par dfaut, Oracle travail
en degr d'isolation 1 (READ COMMITTED).
Excuter les squences d'instruction dcrites ci-dessous. Qu'observez-vous ?
expliquez.

L'utilisateur 1 (Cesar) effectue un retrait. L'utilisateur 2 ne fait que consulter la cave.


COM1, COM2, stock1, stock2, conso1, stock2, ROL1, stock1, stock2.

idem, mais avec un commit :


COM1, COM2, stock1, stock2, conso1, stock2, COM1, stock1, stock2,

L'utilisateur 1 (Cesar) fait un retrait de bouteilles, alors que son cave est alimete par
un nouvel achat par son sommelier (utilisateur 2). Un blocage est apparu. Pourquoi ?
COM1, COM2, stock1, stock2, conso1 , stock2, livraison2, stock1,COM1, COM2.

Tester les excutions prcdentes en spcifiant le mode suivant aprs chaque commit :
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE. Comparer et expliquez
comment Oracle verrouille les donnes.
Si vous avez compris comment fonctionne le verrouillage Oracle, proposez une execution
concurrente de deux transactions de votre choix qui soit non serialisable et accepte par
Oracle. Comment faire pour que Oracle ne laisse pas passer ce genre d'executions ?

Partie I : Organisation physique, Optimisation


Augmenter la taille de la table Clients l'aide du script suivant:
BEGIN
FOR x in 1..50 LOOP
insert into C (nb, nom, prenom, type) select compteur.nextval,
nomb, prenomb, type from b;
commit;
END LOOP;
END;
/

Calculer le nombre de blocs de donnes occups par cette table et le nombre de n-uplets
par bloc. Les commandes suivantes vous donnent des indications sur la position physique de
chaque n-uplet de la table C:
select DBMS_ROWID.ROWID_TO_RESTRICTED (rowid,0) from c
/
select DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) || '.' ||
DBMS_ROWID.ROWID_BLOCK_NUMBER(RowID) from c
/

Consulter la table USER_SEGMENTS de la mta-base pour connaitre la taille en octets


(attribut bytes) et le nombre de blocs (attribut blocks) du volume de stockage (segment)
reserv pour cette table. Comparer la taille rserve pour la table a celle rellement
occupe par les n-uplets.
Effectuer des suppressions de tuples de la table et vrifier l'volution de la taille
rellement occupe par les n-uplets de la table C et celle qui lui est rserve.
Crer une copie de la table C en spcifiant les critres d'allocation d'espace pour ce
segment. Utiliser la clause STORAGE (voir doc en ligne). Vrifier et comparer, la
fragmentation de l'espace allou aux tables.

Optimisation :

Activer le mode timing : set timing on

Activer le mode traces : set autotrace on

Penser rgler les paramtres cran : set pagesize 60 et set linesize 200

Le but est de voir le plan d'excution choisi par le SGBD. La prise en compte d'index peut
amliorer le cot d'une excution. Un index est intressant partir du moment ou il est
slectif, c.a.d. qu'une restriction du type att = val ne renvoie que trs peu d'attribut (e.g.
1%). De plus, il n'est utile que quand la relation index est suffisamment volumineuse (>
quelques pages). Trouver un scnario bas sur une slection par index sur la plus grosse
table (qu'on grossira artificiellement si ncessaire). Ce scnario doit vous permettre de
montrer (1) l'intrt de l'index pour un attribut trs slectif, (2) l'handicap de l'index pour
un attribut peu slectif et (3) le surcot en mise jour (ou insertions) de ces index.
Jouer sur changement du mode d'optimisation d'oracle (voir doc en ligne) par la commande
alter session set optimizer_mode = xxxxxx

Ou xxxx peut valoir :

Mthode statistique base sur un modle de cot et la connaissance de


statistiques sur les objets manipuls. Gnration de plusieurs plans et slection
du moins cher.
o ALL_ROWS : optimise le temps global d'obtention du rsultat.
o FIRST_ROWS : optimise le temps d'obtention des premiers rsultats.
Adapt un traitement interactif.

RULE : Mthode heuristique, base sur un score prdtermin des mthodes


d'accs. Les caractristiques des donnes et leur distribution, ainsi que la
slectivit des index n'affectent pas le plan d'excution.

CHOOSE : c'est le SGBD qui choisit la meilleur approche en fonction de la


disponibilit de statistiques dans la mta-base.

Gnrer, expliquer et comparer les plans d'excutions obtenus.


Remarque. En cas de besoin, vous pouvez dsactiver un index ainsi : pour un test att =
valeur, si attribut est de type varchar, faire attribut || ' ' = valeur (concatnation d'un espace).
Si c'est un nombre, attribut + 0 = valeur.
Jointures
Crer un jeu de requtes joignant plusieurs tables et faisant des slections divers
endroits. Excuter ces requtes de diffrentes manires : par jointure 'plates', par

imbrication avec in, par imbrication avec exists. Regarder, expliquer et comparer les plans
d'excutions gnrs.

A1 : Connexion Oracle

Lancez l'interprteur SQL d'Oracle en tapant :


sqlplus LOGNAME/PASSWORD@nfres5/orcl11

o LOGNAME est votre compte oracle et vaut de bda60 bda70 selon votre station,
PASSWORD vaut bda pour tout le monde.

Exemple :
sqlplus bda65/bda@infres1/orcl11

A2 : Memento SQL*PLUS
save filename.sql
/* sauve le contenu du buffer dans un fichier de nom
filename.sql */
get filename.sql
/* charge le buffer avec le contenu du fichier de nom
filename.sql */
start filename
/* charge le buffer et lance l'excution du fichier
script sql */
run
/* lance l'excution du contenu du buffer */
spool filename.txt
/* copie la sortie cran sur le fichier filename.txt */
spool off
/* suspend l'opration prcdente */
help commande
/* pour obtenir de l'aide sur la commande donne en
argument */

Variables d'environnement

set pagesize 20 /* formate la sortie cran par blocs de 20


lignes */
set pause on /* ne visualise la sortie qu'aprs un 2e RC - bloc
par bloc - */

set timing [on|off] /* active ou dsactive le chronomtre */


set heading [on|off] /* active ou dsactive l'affichage de
l'entte de colonnes */

Schma d'information ( ou "mta-base")


desc[ribe] tablename
/* donne le schma de la relation tablename */
all_catalog
/* relation donnant toutes les tables accessibles */
user_catalog
/* relation donnant les seules tables du USER */
cat

/* synonyme de la prcdente ..*/

all_objects
/* relation donnant tous les objets accessibles */
user_objects
/* relation donnant les seuls objets du USER */
obj
/* synonyme de la prcdente ..*/
user_sys_privs
/* relation donnant les privilges systme du USER*/
user_tab_privs
/* relation donnant les privilges sur les objets
accessiles*/

Pour tous commentaires: Equipe Bases de Donnes

Vous aimerez peut-être aussi