Vous êtes sur la page 1sur 25

Chapitre 10

SGBD réseau - CODASYL

1 Introduction
CODASYL ("Conference on Data Systems and Languages") est le sigle d'une conférence qui a
donné naissance à des travaux pour définir un nouveau type de SGBD, le "SGBD Codasyl", né en
1971. En 1978 apparaissent les premières réalisations: IDS2 (Bull), TOTAL (Cincom), IDMS
(Culliname), ADABAS (Software AG), …

Les SGDBs Codasyl ont trois particularités:


- leur modèle de données est de type réseau: le modèle réseau est un ancêtre du modèle entité
association. Il permet de décrire des types d'entité de structure complexe (comme dans le
modèle entité association) et des liens 1:n entre deux types d'entité;
- leur langage de manipulation des données est de type navigationnel: des pointeurs sont
positionnés sur certaines entités, appelées entités courantes. Chaque requête permet
d'atteindre une seule entité à la fois, qui est la suivante - selon un certain ordre - de l'entité
courante;
- leur architecture est simplifiée par rapport à celle recommandée par la norme ISO: le schéma
décrit à la fois la représentation conceptuelle (choix des types d'entités et des liens entre eux)
et l'implantation en fichiers et chemins d'accès.
Ces trois aspects sont détaillés dans la suite de ce chapitre.

2 Modèle réseau
Rappel: un modèle est un ensemble des concepts qui permettent de décrire la structure conceptuelle
d'une base de données.

Le modèle de données de Codasyl est de type "réseau". Il comprend trois concepts proches de ceux
du modèle entité association:
- le type d'article, qui est semblable au type d'entité (ou au "record" COBOL),
- le type de set, qui est l'équivalent d'un type d'association binaire, non cyclique, sans attribut et de
cardinalités 0:n - 0:1 ou 0:n - 1:1,
- les attributs qui, comme en entité association, peuvent être complexes et/ou multivalués (comme
en COBOL).

Exemple: le diagramme entité association suivant:


Use Word 6.0c or later to

v iew Ma cint osh pi cture.

se traduit en diagramme réseau par:

1 1
U se W ord 6.0 c o r l a ter t o

vi e w Ma ci n t
o sh pi ctu re.

Possède est un type de set, qui est représenté par une flèche ayant pour cible le type d'article de
cardinalité maximum 1 dans l'association.
Le type d'article origine du set est appelé le "propriétaire" du set. Le type d'article cible du set est
appelé le type "membre" du set.

Au niveau des occurrences on représente souvent le set par une liste fermée. Par exemple, pour le
diagramme réseau ci-dessus:
U se W ord 6 .0c or l ater to

vi ew Macin tosh pi cture.

Jean est le propriétaire d'un set Possède dont AX et 405 sont les membres.

Cette liste symbolise le fait que les articles membres d'un set (plus précisément d'une occurrence de
set) sont ordonnés. AX est le premier membre du set Possède de Jean, 405 en est le second et
dernier membre.

3 LMD de type navigationnel

Exemple: soit la base de données Gest-Consult décrivant un ensemble d'hopitaux et dont le


diagramme réseau est donné ci-dessous :
U se Word 6.0c or l ater to

vi ew Macintosh pi cture.

La plupart des exemples de ce chapitre se réfèrent à cette base dont le schéma Codasyl est donné en
annexe.

La requête:
"Quel docteur le malade numéro 130 a-t-il consulté en janvier 1990 ?"
s'écrirait en une seule instruction dans un langage relationnel. Dans un langage navigationnel,
l'utilisateur doit écrire un programme comportant des instructions d'un langage de programmation
et des requêtes au SGBD, et qui décrit chacune des étapes élémentaires pour accéder à l'information
voulue, ainsi que leur enchaînement.

La requête ci-dessus s'écrirait en pseudo-Codasyl de la façon suivante:


Chercher le malade n° 130
Récupérer la première consultation de ce malade dans le set "passe"
2 2
Tant qu'on n'a pas traité toutes les consultations de ce malade (tant qu'on n'est pas arrivé en fin
de set "passe") faire:
Tester la date = janvier 1990
Si oui - Récupérer le docteur propriétaire de cette consultation dans le set "donne"
- Afficher le docteur
Fin si
Passer à la consultation suivante pour ce malade dans le set "passe"
Fin tant que

3 3
4 Langage de définition des données: LDD de CODASYL

Un schéma Codasyl décrit deux types d'informations:


- la structure conceptuelle des données (quels sont les types d'articles avec leurs attributs et quels
sont les sets),
- l'implantation des types d'articles dans les fichiers et l'organisation des fichiers.
La description de la structure conceptuelle étant très simple, ce paragraphe détaille essentiellement
l'aspect description de l'implantation.

4.1 Les types d'articles et les fichiers

La déclaration d'un type d'article se fait par la phrase "RECORD ....", qui définit le nom du type
d'article, son implantation (dans quel fichier et sous quelle organisation), et ses attributs.

La liste des attributs (simples ou complexes, monovalués ou multivalués, a priori facultatifs) est
décrite comme en Cobol à l'aide de numéros qui indiquent le niveau de l'attribut. La clause
"OCCURS ..." signale un attribut multivalué et le nombre maximum de valeurs. Par exemple, un
type d'article Personne avec un nom, des prénoms et une date de naissance serait décrit en Codasyl
de la façon suivante:
RECORD NAME IS Personne
........définition du fichier et du mode de placement (voir ci-dessous).....
02 nom TYPE CHARACTER 25
02 prénoms TYPE CHARACTER 25 OCCURS 3 TIMES
02 date
03 jour TYPE INTEGER
03 mois TYPE INTEGER
03 année TYPE INTEGER

Tous les articles d'un même type sont stockés dans le même fichier, mais un fichier peut contenir
un ou plusieurs types d'articles. Stocker dans un même fichier plusieurs types d'articles est efficace
dans le cas où l'application utilise très fréquemment en même temps des articles de ces différents
types.

Il existe deux façons différentes de placer les articles d'un type donné dans un fichier: le placement
aléatoire qui favorise les accès sélectifs selon la clé de l'article, et le placement groupé qui favorise
les accès à l'ensemble des membres de chaque occurrence d'un type de set. Dans un même fichier
peuvent cohabiter plusieurs types d'articles placés selon des modes différents.

4.1.1 Placement aléatoire ou "CALC" ("Calculate")


Un attribut du type d'article est alors déclaré comme clé d'accès (ce n'est pas nécessairement un
identifiant). Le fichier est découpé en pages. Il existe une fonction de calcul du numéro de la page
où doit être enregistré l'article en fonction de sa clé. L'objectif de cette fonction est de répartir les
articles dans les pages.
Exemple de fonctions:
- faire la somme des codes ASCII des caractères de la clé
- prendre le reste de la division entière de la clé par le nombre de pages du fichier.

Exemple: soit un fichier du personnel organisé en CALC et dont la clé des articles est le nom de la
personne.
Insérer < Dupont, Jean, 38 ans, 10.000 F,…>
Supposons que la fonction de calcul appliquée à "Dupont" donne en résultat 3, et que le fichier soit
dans l'état suivant (un carré grisé représente un article):
4 4
U se Word 6. 0c or later t o

v iew Mac intos h pi cture.

L'insertion de Dupont coûte 2 accès disques (lecture de la page n° 3 et sa réécriture), car il y a assez
de place pour mettre l'article Dupont dans la page n°3.
Par contre, l'insertion d'un article <Valois,…> dont la fonction de calcul donne 4 en résultat (la
page n° 4 est pleine), coûte plus cher en accès disques :
- lecture de la page n° 4 pour s'apercevoir qu'elle est pleine,
- alors diverses techniques peuvent être utilisées, telles que :
- associer à la page 4, par chaînage (ce qui implique au moins une écriture), une
page de débordement où sera mis l'article <Valois…>
- avoir une zone de débordement globale dans laquelle sont mis tous les articles qui
ne tiennent pas dans "leur" page. Dans ce cas, il faut associer à chaque page une liste
des articles qui sont en débordement.
Les fichiers aléatoires nécessitent d'être périodiquement réorganisés quand le pourcentage de
débordement devient trop important et que les performances baissent.
Déclaration de l'organisation "CALC" en Codasyl:
RECORD NAME IS nom-type-article
LOCATION MODE IS CALC USING nom-attribut-clé
[DUPLICATES NOT] WITHIN nom-fichier.
La clause facultative "DUPLICATES NOT" interdit l'existence dans le type d'article de deux
articles de même clé (la clé est un identifiant). Si la clause est absente, l'interdiction est levée (la clé
n'est pas un identifiant).

4.1.2 Organisation groupée ou "VIA"


Cette organisation n'est possible que pour un type article déclaré membre d'un type de set. Elle
consiste à regrouper dans une même page (ou dans plusieurs pages consécutives si le nombre
d'articles est trop grand) tous les membres de chaque occurrence d'un type de set donné. Il y a deux
variantes:
- le type d'article membre (placé en VIA) est dans le même fichier que le propriétaire. Voir par
exemple, dans la base de données Gest-Consult, le type d'article Service placé en VIA le set
constitué. Dans ce cas, les articles membres sont stockés dans la même page que le
propriétaire.
- le type d'article membre (placé en VIA) est dans un fichier différent de celui du propriétaire.
Voir par exemple, dans la base de données Gest-Consult, le type d'article Docteur placé en
VIA emploie. Dans ce cas, les articles membres sont regroupés dans une (ou plusieurs) page
dont le numéro relatif est fonction du numéro relatif de la page du propriétaire dans son
fichier. Le calcul se fait de la façon suivante:
Soit adr-rel-propriet, l'adresse relative du propriétaire dans son fichier; cette adresse est un réel
ayant pour partie entière le numéro relatif de sa page, et pour partie décimale l'indication de la
position relative de l'article propriétaire dans sa page, alors:
n°_page_des_membres := (adr-rel-propriet x nombre_pages_fichier_des_membres) / nombre_
pages_fichier_du_propriétaire.
Dans les deux cas s'il n'y a plus de place dans la page où le SGBD devrait mettre l'article, il le place
dans la page la plus proche qui a encore de la place.
Exemple
Soient deux types d'articles, P et M, et un set S les reliant : P  M.
Soient Pi et Pj deux occurrences de P.
Soient Mi1,Mi2,...,Min,Mj1,Mj2,...,Mjq des occurrences de M.
Soient les deux occurrences du set S :
5 5
Use Word 6.0c or later to

view Macintosh picture.

Si le type d'article M est organisé en VIA le set S dans le même fichier que P, on aura
l'organisation suivante dans les pages du fichier:
U se Wo rd 6 .0 c or l a te r to

vi ew Ma ci nt osh p ict u re.

Si le type d'article M est organisé en VIA le set S dans un autre fichier que P, on aura l'organisation
suivante dans les pages des deux fichiers (en supposant taille_fichier_M = 2*taille_fichier_P) :

fichier de P :
U se Wo rd 6.0c o r l a te r to

vi e w Ma ci nto sh p ic t
u r e.

fichier de M :
U se W o rd 6 .0c o r l a ter to

vi e w Maci ntosh pi ctu re .

Déclaration de l'organisation VIA :


RECORD nom-type-article
LOCATION MODE VIA nom-type-set WITHIN nom-fichier

4.2 Les types de set

4.2.1 Implantation des types de set


Pour chaque type de set il existe en général plusieurs occurrences du set, une par occurrence du
propriétaire. Par exemple, il existe une occurrence du set passe par malade, chaque occurrence
regroupant les consultations du malade.

Une occurrence de set est une liste ordonnée des articles membres correspondant à un propriétaire.
La plupart du temps, les SGBDs Codasyl implémentent cette liste par des pointeurs: du propriétaire
vers le premier membre, de chaque membre vers le membre suivant, et du dernier membre vers le
6 6
propriétaire. Le chainage peut être simple ou double (dans les deux sens). Pour optimiser le passage
d'un membre vers son propriétaire, le SGBD peut aussi rajouter à chaque membre un pointeur vers
le propriétaire.
Une autre façon d'implanter les occurrences de set consiste à ce que le SGBD associe à chaque
article propriétaire une table de pointeurs vers ses membres, et à chaque article membre un pointeur
vers son propriétaire.

Attention: cette implémentation des occurrences de set est indépendante de l'organisation des types
d'articles. Par exemple, un type d'article peut être placé en CALC, tout en étant membre d'un set et
donc lié par le chainage du set aux autres articles membres de la même occurrence du set.

4.2.2 Déclaration d'un type de set


La déclaration d'un type de set comprend trois types d'information:
- la structure du set,
- des contraintes d'intégrité,
- des chemins d'accès.

 Structure:
SET nom-type-set
OWNER nom-type-article-propriétaire
MEMBER nom-type-article-membre.

 Contraintes d'intégrité:
- INSERTION AUTOMATIC : lors de l'instruction "insérer un membre", le SGBD crée le
membre et le rattache automatiquement au set (en insérant le membre dans la liste des
membres de ce propriétaire). C'est l'équivalent d'une contrainte d'intégrité référentielle.
- INSERTION MANUAL : lors de l'instruction "insérer un membre", le SGBD crée le membre
mais ne le rattache pas au set.
- RETENTION MANDATORY : le membre ne peut être détaché du set (l'instruction
DISCONNECT est interdite).
- RETENTION OPTIONAL : cas contraire.

- [DUPLICATES NOT nom-attribut] : c'est une déclaration facultative qui signifie qu'il ne peut
pas exister deux membres pour un même propriétaire avec la même valeur pour cet attribut.

 Chemin d'accès :
Il existe deux types d'information qui permettent de définir comment accéder aux articles d'un set:
le choix de l'occurrence du set et le choix de l'ordre des membres dans chaque occurrence du set.

1) Choix de l'occurrence du set (clause SET SELECTION...)


La plupart des instructions portant sur un set travaillent dans l'occurrence courante du set, mais
certaines instructions (comme l'insertion d'un article) permettent de définir l'occurrence concernée
du set. Par exemple, lors de l'insertion d'une consultation, le SGBD doit retrouver le malade et le
docteur (pour accrocher la consultation aux deux sets, passe et donne). Le choix de l'occurrence de
set pour ces instructions est défini dans la clause "SET SELECTION..." qui offre deux possibilités:
- l'occurrence est définie par l'identification de son propriétaire
Si le propriétaire du set est placé en CALC, il suffit de définir sa clé (voir par exemple les sets
passe et constitué), sinon il faut définir les propriétaires d'une hiérarchie de sets dont le dernier
est celui dont on définit la clause "SET SELECTION" (voir par exemple le set donne).

7 7
Exemple: SET passe
SET SELECTION IS THRU passe OWNER IDENTIFIED BY CLAC KEY
Exemple: SET donne
SET SELECTION IS THRU constitué OWNER IDENTIFIED BY CALC KEY
THEN THRU emploie WHERE OWNER IDENTIFIED BY nom-service
THEN THRU donne WHERE OWNER IDENTIFIED BY nom-docteur.

- l'occurrence de set est celle qui est courante:


SET SELECTION IS THRU nom-type-set OWNER IDENTIFIED BY APPLICATION

2) Ordre des membres (clause ORDER IS INSERT …)


Cette clause facultative permet de définir, si l'on veut, un ordre pour la liste des membres de chaque
propriétaire. Cet ordre peut être:
- trié selon un attribut des membres (voir par exemple les sets emploie et donne):
SORTED BY ASCENDING/DESCENDING nom-attribut
- en premier membre: FIRST. Le membre est toujours inséré en premier élément de la liste.
En dernier membre: LAST. (voir par exemple le set passe)
- avant / après le membre "courant" (le dernier qui a été accédé lors du programme): NEXT /
PRIOR.

En conclusion, la définition d'un schéma CODASYL comporte deux types d'informations: la


définition de la structure conceptuelle et celle de l'implantation physique (mode de placement,
chemins d'accès...). La définition de l'implantation n'est possible qu'après une étude des traitements
qui vont s'exécuter sur cette base de données. Par exemple, le placement d'un type d'article en
CALC est utile si les accès selon l'attribut clé sont très fréquents, au contraire le placement en VIA
un set est utile si les accès les plus fréquents à ces articles se font par balayage de ce set. Autre
exemple, le tri des membres d'un set n'est intéressant que si les accès en lecture selon ce set et cet
ordre sont plus fréquents que les mises à jour dans ce set. Les choix d'implantation sont discutés
plus en détail en fin de ce chapitre.

5 Sous-schéma CODASYL

Un sous-schéma est une partie du schéma qui intéresse un groupe d'utilisateurs. Un sous-schéma
Codasyl contient certains types d'articles, éventuellement renommés avec certains attributs
éventuellement renommés, et certains types de sets éventuellement renommés.

Ces sous-schémas assurent une certaine confidentialité des données et simplifient la vue qu'ont les
utilisateurs de la base de données (en ne leur montrant qu'une partie des types d'articles et de sets).

8 8
Use Word 6.0c or later to

view Macintosh picture.

La définition d'un sous-schéma Codasyl se fait à l'aide d'instructions du langage de définition des
données que nous ne détaillerons pas.

9 9
6 Langage de manipulation des données (LMD) CODASYL

6.1 Principes

 Langage navigationnel: Contrairement aux langages assertionnels des SGBDs relationnels, le


LMD Codasyl oblige l'utilisateur à définir pas à pas le chemin à suivre dans la base de données
réseau pour arriver à (aux) l'article voulu. Pour cela, chaque instruction du LMD Codasyl donne en
résultat un article sur lequel sont positionnés des pointeurs courants d'où partiront les instructions
suivantes (comme dans un fichier séquentiel où chaque instruction "Lire" lit l'article suivant repéré
par le pointeur courant). L'utilisateur, par une suite d'instructions insérées dans un langage de
programmation (Cobol, Pascal ou…), "navigue" ainsi d'article en article, jusqu'à obtenir l'article
voulu.

 Pointeurs courants dans la base de données :


Chaque instruction Codasyl fait positionner les pointeurs courants de la base de données sur
l'article accédé/mis à jour. L'instruction suivante de l'utilisateur part du dernier pointeur courant.
Pour chaque programme utilisateur, il y a les différents pointeurs courants :
- le pointeur courant du programme,
- un pointeur courant pour chaque type d'article du sous-schéma (ou du schéma) ouvert par le
programme,
- un pointeur courant pour chaque type de set du sous-schéma (schéma) ouvert par le
programme.

Exemple d'évolution des pointeurs:


Soit l'extrait de la base de données "Gest-Consult":
Use Word 6.0c or l ater to

view Maci ntosh pic ture.

Pour le programme traitant la requête "nom du chef du service de chirurgie de l'hôpital de La


Pitié", les pointeurs évoluent de la façon suivante :

Pointeurs progr Hôpital Service constitué emploie


- ouverture de la base Ø Ø Ø Ø Ø
- chercher "La Pitié" 2 2 Ø 2 Ø
- chercher "Chirurgie" pour
"La Pitié" 13 2 13 13 13

NB Ø signifie: non initialisé

 Zone de communication programme utilisateur / SGBD


Lors de l'ouverture d'un sous-schéma ou (schéma) par un programme utilisateur, le SGBD, pour
chaque type d'article du sous-schéma (ou schéma), formate en mémoire centrale, une zone
représentant ce type article. Cette zone, accessible au programme utilisateur, sert au SGBD: il y
10 10
charge les articles lus et il y prend les articles à écrire, ainsi que les paramètres des instructions.
Cette zone est l'équivalent de la "FILE SECTION" du Cobol, à ceci près qu'elle est déclarée
automatiquement par le SGBD, et non par le programmeur (avantage non négligeable).
En plus, une variable appelée SGBD-STATUS, contient après chaque instruction Codasyl un code
traduisant la réponse du SGBD (ok, fin de set, fin du type article, article pas trouvé, erreur
d'argument, pointeur non initialisé, erreur d'entrée/sortie,…).

La mémoire centrale du programme utilisateur est donc composée de trois parties :

U se Word 6.0c or l ater to

vi ew Mac intos h pic ture.

- Zone de communication = zone formatée au format des types article du sous-schéma (ou schéma)
ouvert par le programme + variable SGBD-STATUS
- Programme utilisateur en LMD Codasyl + langage de programmation (par exemple Cobol).
Le programme utilise pour les lectures / écritures via le SGBD la zone de communication.
- Pointeurs courants pour ce programme, gérés par le SGBD.

6.2 Accès aux articles: FIND

Le LMD Codasyl permet d'accéder aux articles grâce aux instructions FIND dont il existe plusieurs
variantes. Le résultat de toute instruction FIND est que certains pointeurs sont positionnés sur
l'article accédé, mais l'article n'est pas transféré en mémoire centrale. Pour le lire l'utilisateur doit
employer une seconde instruction, l'instruction GET.

Règle de positionnement des pointeurs après un FIND:


Soit une instruction FIND... d'argument le type d'article A, et qui accède en résultat à l'occurrence
d'article a, après cette instruction tous les pointeurs suivants sont positionnés sur a:
- le pointeur du programme,
- le pointeur du type d'article A,
- le pointeur de chaque set dont a est propriétaire, ou dont a est effectivement membre.
Le pointeur de chaque set dont A est déclaré membre, mais auquel a n'est pas rattaché est mis à nul
(Ø).

6.2.1 Accès sélectif aux articles d'organisation CALC

Tout type d'article organisé en CALC selon un attribut-clé peut être accédé sélectivement selon cet
attribut-clé par l'instruction "FIND ANY nom-type-article". La valeur de l'attribut-clé doit
auparavant avoir été chargée dans la zone de communication.

Exemple: recherche du malade numéro 130


Malade. numéro malade := 130 /*instruction du langage de programmation*/
FIND ANY Malade /*instruction du LMD Codasyl*/
Le SGBD positionne les pointeurs programme, Malade et passe sur l'article 130 (s'il existe, sinon il
11 11
y a un code d'erreur "article non trouvé" dans le SGBD-STATUS).
Si le type article placé en CALC peut avoir des doubles de même valeur pour la clé, l'instruction
"FIND DUPLICATE" employée après un "FIND ANY" permet de rechercher les autres articles de
même valeur de clé. Le programme type devient donc dans ce cas :
attribut clé : = xx
FIND ANY nom-type-article
Tant que SGBD-STATUS = ok faire:
..... traitement de l'article .....
FIND DUPLICATE nom-type-article
Fin tant que

6.2.2 Balayage séquentiel d'un type d'article

Codasyl permet de travailler sur tout type d'article comme sur un fichier séquentiel, à l'aide des
instructions "FIND FIRST nom-type-article" et "FIND NEXT nom-type-article".

Exemple: la liste de tous les docteurs.


FIND FIRST Docteur
Tant que SGBD STATUS ≠ "fin de type d'article" faire:
.... traitement de l'article Docteur...
FIND NEXT Docteur
Fin tant que.
On peut aussi effectuer un balayage arrière avec les instructions FIND LAST et FIND PRIOR.

6.2.3 Balayage séquentiel des membres d'un propriétaire (set)

Codasyl permet de balayer séquentiellement tous les articles membres d'une occurrence de set
(l'occurrence courante) à l'aide des instructions "FIND FIRST nom-type-article WITHIN nom-set"
et "FIND NEXT nom-type-article WITHIN nom-set".

Exemple: Liste des consultations passées par le malade n° 130


1 Malade . numéro-malade := 130
2 FIND ANY Malade
3 Si SGBD-STATUS = "non trouvé" alors (message ; fin) finsi
4 FIND FIRST Consultation WITHIN passe
5 Tant que SGBD-STATUS = "ok" faire:
6 GET Consultation
7 Traitement de la consultation
8 FIND NEXT Consultation WITHIN passe
9 Fintantque
10 .......

Evolution des pointeurs :


- après l'exécution de l'instruction 2, les pointeurs programme, Malade, et passe sont positionnés
sur le malade numéro 130 (s'il existe).
- après l'exécution de l'instruction 4, les pointeurs programme, Consultation, passe et donne sont
positionnés sur la première consultation du malade 130; le pointeur malade ne bouge pas.
- lors de l'instruction 10, une fois exécuté le dernier FIND NEXT, les pointeurs sont à nouveau
sur le propriétaire du set, c'est-à-dire sur le malade n°130 (pointeurs programme, Malade,
passe); les pointeurs Consultation et donne restent sur la dernière consultation du malade.
Comme pour un type d'article, on peut aussi effectuer un balayage arrière d'une occurrence de set.
12 12
6.2.4 Remonter d'un membre à son propriétaire

Codasyl permet de passer d'un membre quelconque d'un set à son propriétaire à l'aide de
l'instruction "FIND OWNER WITHIN nom-set". Cette instruction agit dans l'occurrence courante
du type de set.

Exemple: Quels sont les médecins qui ont ordonné du xxx au malade 130; on veut les noms du
médecin et de l'hôpital.
Malade . numéro-malade := 130
FIND ANY Malade
FIND FIRST Consultation WITHIN passe
Tant que SGBD-STATUS = "ok" faire
si Consultation. prescription = xxx alors
début
FIND OWNER WITHIN donne /* positionne sur le docteur */
GET docteur /* transfert le docteur en mémoire
centrale*/
afficher le docteur
FIND OWNER WITHIN emploie /* positionne sur le service*/
FIND OWNER WITHIN constitué /* positionne sur l'hôpital */
GET HOPITAL /* transfert l'hôpital en mémoire centrale*/
afficher l'hopital
finsi
FIND NEXT Consultation WITHIN passe
Fin tant que

6.2.5 Repositionnement d'un article déjà accédé auparavant

Les instructions de lecture et de mise à jour (autres que celle d'insertion d'un nouvel article)
travaillent toutes sur l'article référencé par le pointeur programme. Il arrive que certains
programmes nécessitent de traiter (lire, mettre à jour, ...) un article qui ne soit pas le dernier
accédé; ils doivent donc accéder un article qui n'est plus l'article courant du programme. Pour
pouvoir repositionner les pointeurs sur cet article, Codasyl offre deux solutions :
- l'instruction "FIND CURRENT nom-type-article" qui accède à l'article référencé par le
pointeur du type d'article et qui repositionne donc sur cet article le pointeur programme et les
pointeurs des sets qui passent par cet article;
- la mémorisation et la mise à jour directement par le programme utilisateur des pointeurs grâce
aux instructions suivantes :
nom-variable := CURRENT OF nom-type-article
qui met dans la variable (ni affichable ni modifiable par le programme utilisateur) la valeur
du pointeur du type d'article;
FIND nom-type-article BY DATABASEKEY nom-variable
qui accède à l'article référencé par la valeur contenue dans la variable, et qui met donc à jour
les pointeurs programme, type d'article et ceux des types de set qui passent par cet article.

6.2.6 Recherche d'un membre d'un propriétaire, sur valeur d'un attribut.

Cette fonction est non élémentaire en ce sens qu'elle peut être obtenue par un programme utilisateur
employant d'autres instructions FIND plus simples (celles des § 6.2.1 et 6.2.3). Elle permet de:
13 13
- choisir une occurrence particulière d'un type de set,
- rechercher dans cette occurrence de set les articles qui satisfont une condition du type "attribut =
valeur".
L'utilisateur appelle cette fonction grace aux deux instructions:
"FIND nom-type-article WITHIN [CURRENT OF] nom-set USING nom-attribut"
"FIND DUPLICATE WITHIN [CURRENT OF] nom-set USING nom-attribut".
Si la clause CURRENT OF est présente, alors le SGBD effectue sa recherche dans l'occurrence
courante du set, sinon il choisit l'occurrence du set d'après la clause SET SELECTION du set.

Exemple: Liste des consultations où l'on a prescrit le médicament xxx au malade numéro 130.
Malade . numéro-malade := 130
Consultation. prescription := xxx
FIND Consultation WITHIN passe USING prescription.
/* La clause SET SELECTION de passe a permis au SGBD de choisir l'occurrence du
set passe du malade 130 */
Tant que SGBD-STATUS = "ok" faire:
GET Consultation
traitement de la consultation
FIND DUPLICATE WITHIN passe USING prescription
Fin tant que

L'instruction "FIND Consultation WITHIN passe USING prescription" lance, dans le SGBD, la
recherche du bon propriétaire du set passe (le malade 130), puis parmi les membres de ce
propriétaire la recherche de la première consultation telle que prescription = xxx.
L'instruction "FIND DUPLICATE WITHIN passe USING prescription" recherche dans la même
occurrence du set passe la consultation suivante répondant à la même condition.

6.3 Lire un article: GET

L'instruction FIND positionne les pointeurs, mais ne lit pas. Les lectures se font par l'instruction
"GET nom-type-article" qui lit l'article courant du programme.

6.4 Insérer un article: STORE

Lors d'une instruction "STORE nom-type-article" le SGBD effectue les actions suivantes :
1) Le SGBD cherche dans le schéma dans quel fichier et avec quelle organisation est ce type
d'article, il calcule l'adresse de la page où écrire l'article (si CALC par formule de calcul; si VIA
par recherche du propriétaire).
2) Le SGBD cherche dans le schéma les types de sets dont l'article est propriétaire. S'il en trouve,
il initialise ces sets à vide (en général par un pointeur pointant l'article lui-même).
3) Le SGBD cherche dans le schéma les types de set dont l'article est membre avec insertion
automatique. S'il en trouve, il cherche l'occurrence définie par la SET SELECTION et y insère
l'article selon l'ordre du set (clause ORDER ...): mise à jour des chaînages de ces sets pour y
insérer le nouveau membre en bonne place.

L'instruction STORE a donc pour paramètres (qui sont mis par l'utilisateur dans la zone de
communication SGBD-utilisateur) les valeurs des attributs de l'article à écrire, et de tous les
attributs qui servent aux SET SELECTION ..... des sets dont l'article est déclaré membre à
INSERTION AUTOMATIQUE, et à leurs clauses ORDER ... .

Exemple: insérer le docteur <Martin,......> pour le service de cardiologie de l'hôpital LaPitié:


14 14
Hôpital. nom-hopital := "LaPitié" */paramètre du STORE/*
Service. nom-service := "Cardiologie" */paramètre du STORE/*
Docteur. nom-docteur := "Martin" */valeur de l'article/*
Docteur. catégorie := xxx */valeur de l'article/*
............. */valeur de l'article/*
STORE docteur

STORE, en résultat, positionne les pointeurs programme, type d'article, et des types de set passant
effectivement par cet article sur l'article inséré. Pour les sets dont le type d'article est déclaré
membre avec la clause INSERTION MANUAL, le pointeur set est mis à nul.

6.5 Rattacher (détacher) un article membre à son propriétaire:


CONNECT et DISCONNECT

L'instruction "CONNECT nom-type-article TO nom-set" attache l'article courant programme à son


propriétaire pour le set. Le propriétaire est choisi selon la SET SELECTION définie pour ce set
dans le schéma. L'instruction CONNECT n'est possible que si le type d'article est membre du set
avec INSERTION MANUAL ou/et RETENTION OPTIONAL.
L'instruction "DISCONNECT nom-type-article FROM nom-type-set" détache l'article courant
programme du set. L'instruction DISCONNECT n'est possible que si le type d'article est membre
du set avec RETENTION OPTIONAL.

Exemple: Changer un docteur de service : Dupont du service chirurgie de La Pitié passe au service
des urgences.
Hôpital. nom-hopital := "La Pitié"
Service. nom-service := "Chirurgie"
Docteur. nom-docteur := "Dupont"
FIND Docteur WITHIN CURRENT OF Emploie USING nom-docteur
/* le docteur voulu est pointé par le pointeur courant programme */
DISCONNECT Docteur FROM emploie /* détache l'article courant du set emploie de
l'article "chirurgie" */
Service. nom-service := "urgences"
CONNECT Docteur TO emploie /* rattache le docteur au set emploie des urgences* /

6.6 Supprimer un article: ERASE

L'instruction "ERASE nom-type-article" : supprime l'article courant programme, et:


- si l'article est membre dans un set, décroche cet article du set avant de supprimer l'article,
- si l'article est propriétaire d'un set non vide: problème!

Solution 1:
Selon la clause RETENTION :
- Si le set a pour clause "RETENTION OPTIONAL" les membres sont détachés,
- Si le set a pour clause "RETENTION MANDATORY" l'instruction ERASE est refusée.

Solution 2: c'est la solution que nous retiendrons pour le cours.


Une clause facultative est ajoutée à l'instruction ERASE :
ERASE nom-type-article [ALL MEMBERS]
- Si la clause "ALL MEMBERS" est présente, l'instruction ERASE est récursive: elle détruit
l'article et tous ses articles membres et leurs articles membres et …
15 15
- Si la clause "ALL MEMBERS" n'est pas présente, et si l'article à détruire est propriétaire de
set(s) non vide(s), l'instruction ERASE est refusée.

Le positionnement des pointeurs après une instruction ERASE se fait de la façon suivante:
- les pointeurs programme, type d'article et des types de sets passant par ce type d'article sont mis à
nul (Ø),
- afin de permettre au programme utilisateur de continuer son exécution en balayant le type d'article
ou le set, le SGBD conserve, pour le type d'article et pour les sets dont l'article était
effectivement membre, deux valeurs : la référence des articles précédant et suivant l'article
supprimé. Les instructions FIND NEXT/PRIOR ... peuvent donc être utilisées après un ERASE.

6.7 Modifier les valeurs des attributs d'un article: MODIFY

L'instruction "MODIFY nom-type-article" réécrit l'article courant programme en prenant sa valeur


dans la zone de communication. Il est interdit de mettre à jour l'attribut clé du CALC, mais il est
possible de mettre à jour les attributs de tri des membres d'un set (dans ce cas il y a mise à jour du
chaînage du set par le SGBD).

6.8 Ouverture/fermeture de la base et de ses fichiers

L'instruction "INVOKE nom_schéma (ou nom sous-schéma)" ouvre la base de données ou un sous-
schéma de la base de données et initialise la zone de communication utilisateur-SGBD.

Les instructions "READY/FINISH nom_fichier" … ouvrent / ferment le(s) fichier(s), et initialisent


les tables du SGBD (mise des pointeurs à nul).

16 16
7 Optimisation d'un schéma Codasyl

7.1 Concevoir un schéma CODASYL

Définir un schéma Codasyl comporte deux étapes principales: définir la structure réseau
conceptuelle, puis choisir une structure optimale éventuellement redondante (avec des types
d'articles ou de set ou des attributs supplémentaires qui accélereront les accès) et son implantation
(choix des fichiers et des modes de placement). La méthode pour concevoir un schéma Codasyl
peut se résumer en:
1 Faire le diagramme entité association.
2 Traduire le diagramme entité-association en diagramme réseau (non optimisé).
3 Répertorier les requêtes de l'application, avec leur fréquence.
4 Définir les chemins d'accès fréquents sur le diagramme réseau.
5. En déduire:
- le diagramme réseau optimisé (ajout de types d'article, types de set, attributs)
- le schéma complet en LDD Codasyl.
Les points 4 et 5 sont précisés dans les paragraphes suivants.

7.2 Chemins d'accès sur un diagramme réseau

Il s'agit de définir, pour chaque type d'article et type de set, les accès les plus fréquents. Les types
d'accès à répertorier sont les suivants:
- types d'accès pour un type d'article:
- accès sélectif sur valeur d'un attribut
- balayage séquentiel du type article [selon tel ordre]
- types d'accès pour un type de set:
- passer au membre suivant [selon tel ordre]
- chercher un membre selon la valeur d'un attribut
- remonter au propriétaire.

Exemple: étudions uniquement les trois types d'articles Hôpital, Service et Docteur de la base de
données Gest-Consult ainsi que les sets qui les relient. On suppose que les requêtes les plus
fréquentes sont les suivantes :
- Service xx de l'hôpital Z (fréquence 100/jour)
- Hôpitaux de telle ville (fréquence 10/jour)
- Le docteur de nom Y, dans quel service et quel hôpital travaille-t-il ? (fréquence 1/jour)

On obtient le diagramme réseau avec les chemins d'accès fréquents :


Use Word 6.0c o r later to

view Macintosh picture .

7.3 Optimisation du diagramme réseau et définition du schéma Codasyl


17 17
A partir du diagramme réseau non optimisé sur lequel ont été notés les chemins d'accès les plus
fréquents, chaque type d'article et chaque type de set doivent être analysés afin de définir pour
chacun des chemins d'accès fréquents s'il peut être implanté directement par le mode de placement
d'un type d'article, ou s'il y a lieu de rajouter une structure redondante (type d'article, type de set ou
attribut) pour l'implémenter. On obtient ainsi le diagramme réseau optimisé et le schéma associé.
Les cas d'optimisation les plus fréquents sont décrits ci-dessous.

Type d'article
Cas 1 : le type d'article a un seul chemin d'accès fréquent, qui est par valeur d'attribut. la solution
est d'organiser ce type d'article en CALC avec pour clé cet attribut.

Cas 2 : le type d'article a un seul chemin d'accès fréquent qui est par descente de set. La solution est
d'organiser ce type d'article en VIA selon le set.

Cas 3 : le type d'article A a plusieurs chemins d'accès fréquents, soit par valeur d'attribut, soit par
set, soit par les deux. La solution est d'organiser le type d'article selon le chemin de plus forte
fréquence, et d'ajouter pour chaque autre chemin d'accès du type par valeur d'attribut un type
d'article B représentant cet attribut et un type de set B  A. B sera organisé en CALC.
Exemple : on accède très fréquemment à l'Hôpital et par son nom et par sa ville. Hôpital sera
CALC sur son nom, et un article Ville est créé, CALC sur nomville; un set "Situation" relie Ville
(propriétaire) à Hôpital (membre) en regroupant tous les hôpitaux d'une même ville.
U se Word 6.0c or late r to

v iew Macintosh pictur e.

Cas 4 : accès séquentiel ordonné fréquent (seul ou en plus d'autres chemins d'accès)
Exemple : la liste alphabétique des docteurs est une requête fréquente.
Il faut ajouter un set "d'ordre" avec clause "ORDER INSERT BY........". Ce set est "mono
occurrence" (il a une seule occurrence); son propriétaire est un type d'article "bidon", sans attribut,
à une seule occurrence; c'est le "RECORD SYSTEM" prédéclaré par le SGBD.

 Type de set
S'il y a accès fréquent depuis un membre du set à son propriétaire pour connaître la valeur d'un
attribut du propriétaire, deux cas se présentent:
- soit l'accès est déjà rapide (parce que le type d'article membre est placé en VIA ce set dans le
même fichier ou parce que le SGBD implante les sets avec dans chaque membre un pointeur vers le
propriétaire), dans ce cas il n'y a rien à faire;
- soit l'accès n'est pas rapide, alors pour l'optimiser une solution est de répéter cet attribut dans tous
les membres; ce qui a l'inconvénient de générer des informations redondantes, et donc des
problèmes de mise à jour pour maintenir leur cohérence.

18 18
ANNEXE 1
LANGAGE DE DEFINITION DES DONNEES CODASYL (simplifié)

SCHEMA NAME IS nom-schéma .

AREA NAME IS {nom-fichier} ... .

RECORD NAME IS nom-article

LOCATION MODE IS {CALC USING nom-att1 [DUPLICATES ARE NOT ALLOWED]}


VIA nom-set SET

WITHIN nom-fichier

INTEGER

{
[ {numéro nom-att2 [TYPE IS REAL }] [OCCURS nb TIMES] }...] .
CHARACTER nb

SET NAME IS nom-set1


OWNER IS nom-article1
MEMBER IS nom-article2

{
INSERTION IS  AUTOMATIC } {
RETENTION IS MANDATORY }
MANUAL OPTIONAL

[DUPLICATES ARE NOT ALLOWED FOR {nom-att1}.... ] .

SET SELECTION IS THRU nom-set2 OWNER IDENTIFIED BY {APPLICATION}


CALC KEY

[THEN THRU nom-set3 WHERE OWNER IDENTIFIED BY nom-att2 ] ...

FIRST
LAST

{
[ORDER IS INSERT NEXT }].
PRIOR
SORTED BY { ASCENDING nom-att3}.... [DUPLICATES NOT]
DESCENDING

END-SCHEMA .

Légende
19 19
[a] : signifie que a est facultatif,

{ a }: signifie que l'une des deux options a ou b (ou exclusif) doit être choisie,
b
[a].... : signifie que la spécification a peut être répétée zéro, une ou plusieurs fois,
{a}.... : signifie que la spécification a doit être répétée une ou plusieurs fois.
Dans les clauses du LDD et du LMD, les mots non soulignés peuvent être omis.

20 20
LANGAGE DE MANIPULATION DES DONNEES CODASYL (simplifié)

INVOKE {nom-schéma }.
nom-sous-schéma WITHIN nom-schéma

READY {nom-area}... .

FINISH {nom-area}.... .

FIRST

FIND {ANY } nom-article FIND { NEXT } nom-article .


DUPLICATE PRIOR
LAST

FIRST
NEXT

FIND {PRIOR } nom-article WITHIN nom-set .


LAST

FIND OWNER WITHIN nom-set .

FIND {nom-article } WITHIN [ CURRENT OF ] nom-set USING nom-att .


DUPLICATE

FIND CURRENT nom-article .

nom-variable := CURRENT OF nom-article.


FIND nom-article BY DATABASEKEY nom-variable.

GET nom-article .

STORE nom-article .

MODIFY nom-article .

ERASE nom-article [ ALL MEMBERS ] .

CONNECT nom-article TO nom-set .

DISCONNECT nom-article FROM nom-set .

21 21
SGBD-STATUS est une variable contenant la réponse du SGBD, de valeurs possibles: OK, erreur
d'argument, début/fin de type d'article, pas trouvé, type de set/d'article non initialisé, set vide,
article non rattaché au set, c'est le propriétaire du set, fichier saturé, erreur d'entrée/sortie disques,...

22 22
ANNEXE 2: EXEMPLE DE SCHEMA CODASYL
Gest-Consult

Diagramme réseau:
Use Word 6.0c or later to

vi ew Maci ntosh pi cture.

SCHEMA gest-consult .

AREA f-hop , f-doc , f-mal .

RECORD Hopital
LOCATION MODE IS CALC USING nom-hopital
DUPLICATES ARE NOT ALLOWED WITHIN f-hop
02 nom-hopital TYPE CHARACTER 25
02 adresse-hopital
03 numéro TYPE INTEGER
03 rue TYPE CHARACTER 25
03 code-postal TYPE INTEGER
03 ville TYPE CHARACTER 25
.... .

RECORD Service
LOCATION MODE IS VIA constitué WITHIN f-hop
02 nom-service TYPE CHARACTER 20
02 nombre-lits TYPE INTEGER
02 nom-chef TYPE CHARACTER 20
.... .

RECORD Docteur
LOCATION MODE IS VIA emploie WITHIN f-doc
02 nom-docteur TYPE CHARACTER 20
02 catégorie TYPE CHARACTER 15
02 adresse-docteur
.... .

23 23
RECORD Malade

LOCATION MODE IS CALC USING numéro-malade


DUPLICATES ARE NOT ALLOWED WITHIN f-mal
02 numéro-malade TYPE INTEGER
02 nom-malade TYPE CHARACTER 30
02 adresse-malade
.... .

RECORD Consultation

LOCATION MODE IS VIA passe WITHIN f-mal


02 date TYPE CHARACTER 8
02 horaire TYPE CHARACTER 5
02 prescription TYPE CHARACTER 30 OCCURS 10 TIMES
.... .

SET constitué
OWNER IS Hopital
MEMBER IS Service
INSERTION IS AUTOMATIC RETENTION IS MANDATORY
SET SELECTION IS THRU constitué OWNER IDENTIFIED BY CALC KEY .

SET emploie

OWNER IS Service
MEMBER IS Docteur
INSERTION IS AUTOMATIC RETENTION IS OPTIONAL
SET SELECTION IS THRU constitué OWNER IDENTIFIED BY CALC KEY
THEN THRU emploie WHERE OWNER IDENTIFIED BY nom-service
ORDER IS INSERT SORTED BY ASCENDING nom-docteur DUPLICATES NOT .

SET donne

OWNER IS Docteur
MEMBER IS Consultation
INSERTION IS AUTOMATIC RETENTION IS MANDATORY
SET SELECTION IS THRU constitué OWNER IDENTIFIED BY CALC KEY
THEN THRU emploie WHERE OWNER IDENTIFIED BY nom-service
THEN THRU donne WHERE OWNER IDENTIFIED BY nom-docteur
ORDER IS INSERT SORTED BY ASCENDING date .

SET passe

OWNER IS Malade
MEMBER IS Consultation
INSERTION IS AUTOMATIC RETENTION IS MANDATORY
SET SELECTION IS THRU passe OWNER IDENTIFIED BY CALC KEY
ORDER IS INSERT LAST .
24 24
END-SCHEMA .

25 25

Vous aimerez peut-être aussi