1
UNIVERSITE DE YAOUNDE I FACULTE DES SCIENCES
UNIVERSITY OF YAOUNDE I FACULTY OF SCIENCES
DEPARTEMENT D'INFORMATIQUE
DEPARTMENT OF COMPUTER SCIENCE
GESTION D'INFORMATIONS : MUTATION
LANGAGE DE PROGRAMMATION SQL
VERS LES BASES DE DONNEES
RELATIONNELLES ET LE
Mémoire présenté en vue de
l'obtention du diplôme de
MASTER II RECHERCHE
Option : S.I &
G.L
Par :
AMINI MUDUMBI Jacques Ingénieur en
Informatique
Sous la direction de :
MARCEL FOUDA NDJODO, Professeur
Année Académique 2017-2018
1
Sommaire
Introduction générale
Chapitre I : L'ordinateur auxiliaire de stockage
Chapitre II: Les bases des données : une nouvelle
considération de stockage et manipulation des données
Chapitre III: Les évidences de mutation vers les bases de
données relationnelles Chapitre IV: Le langage Sql : un manipulateur de
bases de données relationnelles Chapitre V: Le Sql intégré
: un paquetage de Sql Embarqué
Conclusion générale
Bibliographie
2
La mort est certaine mais l'heure de la mort est incertaine.
C'est en sachant que nous sommes poussière et retourneront à la
poussière que notre coeur coule de larmes et de blessures
intérieures surtout que vous n'étiez plus. A notre
regretté Père MUDUMBI Edmond, que vous soyez immortalisée
par ce travail. Vos empreintes restent à jamais marquées dans le
souvenir de nos pensées. C'est aujourd'hui plus que jamais que nous
apprécions la valeur de vos efforts, la justesse de votre
éducation et le caractère précieux de vos conseils.
3
Programmez toujours vos applications comme si la personne qui
doit les maintenir ensuite
était un psychopathe violent qui sait où vous
habitez.
John F. Woods
4
A mes parents et aux êtres qui sont les plus chers au
monde et auxquels je ne saurais jamais exprimer ma gratitude et ma
reconnaissance en quelques lignes.
5
Remerciements
De prime à bord, je remercie Dieu, le Tout Puissant
pour ses faveurs et ses gratitudes, de m'avoir donné le courage et la
patience pour avoir mené à bon escient ce travail durant toutes
ses deux années de recherche.
Mes sincères remerciements s'adressent à
l'ensemble des personnes qui ont eu la gentillesse et la bienveillance de
m'accorder de leur temps et d'eux-mêmes en acceptant de participer
à cette recherche.
Je remercie le Professeur Marcel FOUDA NDJODO
pour m'avoir fait l'honneur de m'encadrer et pour la confiance qu'il
m'a accordée dès le début me permettant ainsi
d'élaborer un travail personnel et propre à mes aspirations. Je
le remercie également pour ses compétences de recherche et son
ouverture d'esprit qui m'ont conduit à tirer le meilleur parti de mes
capacités intellectuelles.
En effet, je lui suis infiniment reconnaissant de m'avoir
encouragé et soutenu durant ce travail, j'ai ainsi pu apprécier
sa rigueur scientifique, ses relectures du manuscrit, ses remarques et
suggestions, son recueil, ses grandes qualités humaines et son oeil
critique qui m'as été très précieux et m'ont
amené à affiner et clarifier toujours plus ma réflexion et
cela m'a permis de structurer mon travail et améliorer sa
qualité. Qu'il soit persuadé de mon plus profonde
considération et plus grand respect.
Un mémoire de recherche ne pourrait être
présenté sans l'évaluation de la qualité et de
l'originalité de la recherche par un jury. Mes seconds remerciements
iront donc, tout naturellement, à ces personnes qui ont jugés ce
travail avec conscience et impartialité. Je remercie tout d'abord mes
deux rapporteurs, le Prof. DONTSI et le Prof. Charles
AWONO ONANA, de m'avoir faire l'honneur d'accepter de lire mon
manuscrit et d'avoir apportés des remarques et des commentaires
constructifs. Je les remercie de leur gentillesse et leur compréhension.
Je remercie mon premier examinateur, Dr. LOUKA Basile, pour sa
sympathie et sa confiance tout au long de mon travail. Je remercie
également le président du jury et mon second examinateur, le
Prof. TCHUENTE Maurice d'avoir pris le temps de m'expliquer le
fonctionnement de sa plate-forme en mathématique-informatique (de
m'avoir à la fois fourni des exemples illustratifs et des explications
théoriques). Je le remercie également d'avoir répondu
rapidement à chacune de mes interrogations et d'avoir su me donner des
conseils pertinents sur la construction de mon modèle.
Je remercie tout particulièrement Armel,
Justine, Blaise, Pascal, Nicolas. Sans eux, je n'aurais sans doute pas
réussi à accéder à certaines données de mes
terrains.
6
Je remercie également mes collègues du Centre
Informatique et Laboratorium (CIL), et en particulier d'autres chercheurs :
Stéphane, Jadel, Sangara, Patient, Pierre, Virginie, Vidal,
Marc-Claudia. Je ne compte plus les séminaires, colloques et
interminables discussions passés ensemble. Au cours de ces deux
années de recherche, ils m'ont été d'une aide inestimable,
que ce soit sur un plan scientifique ou personnel.
Merci aussi à Marie-Anne et Sophie
d'avoir été à mes côtés pour
organiser des moments de réflexion collective autour des
hypothèses que cette mémoire de recherche se propose
d'éprouver. Je remercie à cette occasion toutes les personnes qui
ont contribué à faire vivre ce séminaire.
Je souhaite également faire part de mon attachement et
de ma profonde reconnaissance à Marie-Aziza. Elle m'a
donnée le goût de la recherche et aidé à croire en
moi, et en l'intérêt de mes travaux.
En ce moment si particulier, j'ai bien sûr une
pensée pour mes ami(e)s :
Joseph, Junior, Jonathan, Espoir, Arnold, Louis,
Trésor, Semence. Je pense tout particulièrement à
Ma grande Soeur L'Inf. Justine MUDUMBI, pour tous les
sacrifices consentis jusqu'à l'aboutissement de ce travail, je partage
ma joie avec elle, mais aussi à Francisca et Djemimah,
pour leurs interminables conseils de qualité pour l'accomplissement de
ce travail de recherche. A l'évidence, sans eux, ce mémoire de
recherche ne serait pas ce qu'elle est.
Je remercie également ma famille. Je pense
évidemment à ma mère Marie LUBAO et
à la bienveillance avec laquelle elle s'est attachée à me
mettre dans les meilleures dispositions pour aller au terme de cette recherche.
Je pense aussi à mes frère et soeurs, Prince, Elie,
David, Daniel, Michel, Boniface, Damien, Moise, Inf. Justine, Djemimah,
Francisca, Consolatrice, Lucie, Thèrese, Elysée, Cécile,
Orthance. Il va sans dire qu'un tel projet ne se réalise sans
la compréhension et le soutien moral de ses proches.
Enfin, je ne remercierai jamais assez mon oncle Maternel
Blaise, pour le soutien qu'il m'a apporté, dans les
moments où j'en avais le plus besoin, et la patience dont il a fait
preuve dans la dernière ligne droite de ce travail de recherche.
7
Lexique
ANSI (American National Standard Institute):
Organisme de Normalisation Américain, Constitué des producteurs,
de consommateurs et de groupes d'intérêt général, et
qui est le représentant US à l'ISO.
BD (Base de données) : Est un ensemble
d'informations associées à un sujet particulier. CD
(Compact Disk) : Disque faisant 12centimètres de
diamètre, 1,2 millimètre d'épaisseur, constitué de
polycarbonate recouvert d'une couche d'aluminium, le tout étant vernis
et permettant de stocker environ 650 Mo de données.
CPU (Central Processing Unit) : Unité
de Calcul Centrale, généralement c'est le processeur principal
d'une unité centrale.
DD (Diques et Disquettes)
DVD (Digital Versatil Disk) : Disque Vidéo
Digital, Leur capacité est de 4.7 Giga octets sur une face avec
un taux de transfert de 1.5 Méga octet par seconde. Oui, c'est bien
« Versatil » au milieu, et pas « Vidéà »,
parce qu'on peut mettre toutes sortes de données sur un DVD, pas
seulement de la vdéo...
ISO (International Standard Organisation) :
Organisation internationale de Standardisation, réunissant les
organismes de normalisation de pas mal de pays dans le monde et qui travaille
dans tous les domaines.
GHRZ (Giga Hertz)
LISP (LIST Processing ou de « Lots of Insipid and
Silly Parenthesis») : Langage de programmation basé sur le
traitement de listes et beaucoup utilisé en Intelligence Artificielle.
MCC (Modèle Conceptuel de la Communication):
Elément de la méthode MERISE. MERISE
(Méthode d'Analyse d'un Système d'Information): Elle
vise à remplacer un système manuel d'une organisation par un
système automatisé du traitement de l'information. SI
(Système d'Information) : Ensemble des moyens techniques et
humains permettant à une organisation de traiter son information.
SGBD (Système de Gestion de Base de
Données) : est un ensemble de logiciels prenant en charge la
structuration, le stockage, la mise à jour et la maintenance des
données
SGBDR (Système de Gestion de Base de
Données Relationnel): C'est lorsque les données sont
organisées en fonction de leur utilisation (données fixes dans
une table, données variables dans une autre, etc.). Le «
relationnel » dans SGBDR est au masculin, car c'est le système qui
l'est.
SPARC (Scalar Processor ARChitecture) : RISC
(`Reduced Instruction Set Computer' i.e ordinateur à jeu d'instructions
réduit) qu'on trouve dans les stations Sun et qui fut une
8
référence en matière de calcul scientifique
intensif. De plus, ses spécifications sont dans le domaine public.
USB (Universal Serial Bus) : Interface
destinée à remplacer pas mal de choses dans un PC (Personnel
Computer) (à commencer par le port série et le port
parallèle).
RAM (Random Access Memory) : c'est la
mémoire vive.
ROM (Read Only Memory) : C'est la mémoire
morte.
9
Résume
Ce travail de recherche décrit la définition et
les évidences sur les mutations de la mise en oeuvre d'une base de
données relationnelle et le langage Sql. Dans ce contexte, la gestion
d'informations se déploie massivement dans toutes les fonctions et dans
les secteurs des organisations. Elle devient vite sujet à pinailles et
transforme profondément l'activité des toutes les couches des
organisations. Cependant, cette émergence de gestion d'informations au
service des organisations et de pilotage met en évidence la
nécessaire adéquation entre les services informatiques offerts et
les finalités des organisations.
L'objectif de bases de données, la gestion
d'informations, « le but déterminant des systèmes de gestion
de bases des données relationnelles, c'est la plus-value.
Au demeurant, l'ère des technologies de stockage des
données a conduit à une mutation sensible et pérennes vers
les bases de données relationnelles dans des organisations et de
s'interroger sur la manière de ranger les informations pour que
celles-ci soient retrouvées rapidement. De ce fait, les bases de
données relationnelles constituent des nos jours l'étude
partitionnée si ses données sont gérées sur
plusieurs partitions (également appelées noeuds). Cependant, on
se rend bien compte que les données dans les bases de données
relationnelles sont conservées dans des tables et la table en lignes et
colonnes. D'où, l'approche adoptée est le langage SQL (un
programme informatique chargé de gérer les données) qui
constitue un manipulateur des bases de données relationnelles et un
ensemble d'instructions standard, qui sont exécutées par un
gestionnaire de bases de données.
Dans ce sens, le problème qui se pose toujours c'est de
savoir comment mettre en place un système de gestion informatisé
où des mesures et solutions de gestion d'informations efficacement afin
de réellement protéger les systèmes d'information des
bases des données? La recherche des solutions aux problèmes de
gestion d'informations procède de manière plus ou moins
compromettante car le fait de juxtaposer et de multiplier les solutions de
gestion sans analyser au préalable leur compatibilité et leurs
objectifs respectifs n'a jamais été une solution fiable.
Mots clés: Bases de données,
Mutation, Langages Sql, Base de Données Relationnelles, Gestion
d'informations, Système de Gestion de Base des Données
Relationnelles, Programme informatique.
10
Abstract
This work of research describes the definition and the
evidences on the mutations of the implementation of a relational data base and
the Sql language. In this context, the management of information spreads out
massively in all functions and in the sectors of the organizations. She/it
becomes quickly topic to nitpick and transform the activity of the deeply all
layers of the organizations. However, this emergence of management of
information to the service of the organizations and piloting puts in evidence
the necessary adequacy between the offered computer services and the finalities
of the organizations.
The objective of data bases, the management of information",
the goal determining systems of management of bases of the relational data, it
is the increment.
Moreover, the era of the technologies of storage of the data
drove to a sensitive and perennial mutation toward the relational data bases in
organizations and to wonder about the manner to arrange the information so that
these are recovered quickly. Of this fact, the relational data bases constitute
the our days the survey partition if his/her/its data are managed on several
partitions (also named knots). However, one realizes well that the data in the
relational data bases are kept in tables and the table in lines and columns. Of
where, the adopted approach is the SQL language that (a computer program
assigned to manage the data) constitutes a manipulator of the relational data
bases and a set of standard instructions, that are executed by an administrator
of data bases.
In this sense, the problem who always lands that is to know
how to put a computerized management system in place where measure and
solutions of management of information efficiently in order to protect the
systems of information of the bases of the data really? The research of the
solutions to the problems of management of information proceeds more or less
from manner compromising because makes it to juxtapose and to multiply the
solutions of management without analyzing their compatibility beforehand and
their respective objectives were never a reliable solution.
Key words: Data bases, Mutation, Language
Sql, Data base Relational, Management of information, System of Management of
Basis of the Relational Data, computer Program.
11
Liste des figures
Figure I.1. Mémorisation et traitement d'ordinateur 20
Figure II.1. Cas pratique de type-entité 36
Figure II.2. Cas pratique de modèle
entité-association 37
Figure II.3. Exemple d'occurrences de l'association APPARTENANCE
37
Figure II.4. Représentation graphique et exemples (suppose
qu'un livre ne peut posséder
qu'un auteur) sur les cardinalités .38
Figure II.5. Cas pratique d'associations plurielles entre un
type-entité 39
Figure II.6. Cas pratique d'associations réflexives sur le
type-entité personne 40
Figure II.7. Cas pratique de type-association ternaire
inapproprié 41
Figure II.8. Cas pratique de Type-association ternaire
de la figure précédente corrigé en deux
type-associations binaires 41
Figure II.9. Cas pratique de
type association ternaire entre des type-entités Créneau
horaire,
Salle et Film 42
Figure II.10. Cas pratique de transformation
du type-association ternaire de la figure 2.10 en
un type-entité et trois typeassociations binaires
43
Figure II.11. Cas pratique du Modèle représentant un
type-association ternaire Vol liant trois
type-entités Avion, Trajet et Pilote ..44
Figure II.12.
Cas pratique de transformation du type-association ternaire de la figure 2.12
en
un type-entité et trois typeassociations binaires
44
Figure II.13. Cas pratique du Modèle de la figure 2.13
corrigé au niveau des cardinalités...44
Figure III.1 : Erreur de conception du modèle
entité association
|
56
|
Figure III.2 : Cas pratique de normalisation de la 2FN
|
..59
|
Figure III.3 : Cas pratique de normalisation de la 3FN
|
59
|
Figure III.4. Cas pratique de normalisation de la BCFN
|
60
|
Figure III.5. Forme non normalisée
|
.61
|
Figure III.6. Forme 1NF
|
61
|
Figure III.7. Forme 2NF
|
61
|
Figure III.8. Passage en 3NF, en ajoutant la table Code_postal
avec attributs (rue et ville)...61 Figure III.9. Passage en 3NF, après
ajout de la table Code_postal avec attributs (rue et ville)61
Figure III.10. Forme 2NF
|
.62
|
Figure III.11. Forme 3NF
|
.62
|
Figure III.12. Forme BCNF
|
.62
|
Figure III.13. Table ELEVE en 2NF
|
63
|
Figure III.14. Forme 3NF et intégrité
référentielle
|
63
|
12
Figure IV.1. Les différents types de jointures ..80
13
Liste des tableaux
Tableau II.1. Exemples cardinalités et types 37
Tableau III.1 : Cas pratique d'usage des règles de
passage modèle entité-association du
modèle relationnel 56
Tableau IV.1. Les opérateurs de comparaison d'une
valeur à un ensemble de valeurs 83
Tableau IV.2. Récapitulatif des différentes
clauses 84
14
Introduction générale
Partant de l'approche informatique, cette réflexion
prouve, sur base du système de gestion de base de données, qu'une
gestion d'informations est soumise à une évolution constante. Le
progrès liés à l'augmentation de la finesse de stockage et
de manipulation d'informations en sont la base.
C'est un fait pour toutes les organisations, que la gestion
d'informations a fait ses preuves, à travers différentes
approches de sa capacité à fournir des services de stockage
gigantesque aux organisations en nécessitées. Les
possibilités techniques et les enjeux informatiques actuels incitent la
quasi-totalité des couches sociétales et entrepreneuriales
à réaliser des bases des données de plus en plus
complexes. Comme on peut le constater, l'émergence accrue des
systèmes d'informations impose aux organisations une réaction
rapide et une prise de décisions pertinentes celle de doter leur
Système d'Information d'une interface Web suite à
l'évolution du suivi automatisé des toutes les tâches
entrepreneuriales. Dans ce contexte, il n'est plus possible sans avoir
accès aux informations significatives relatives au problème
traité car l'époque où une faible quantité
d'informations était suffisante pour décrire la situation des
organisations appartient au passé.
Cette motivation de fond, fait que l'accroissement de stockage
et de manipulation de la quantité d'informations requises par les
décideurs a rendu l'identification et l'accès aux informations
des organisations de plus en plus difficiles. C'est dire que l'information est
devenue une des ressources stratégiques des organisations. Cette
dernière s'est développée, faut-il le rappeler, s'est
fortement sur l'organisation de la collecte, du stockage, de la
présentation, de la distribution et de la maintenance des informations
devient un élément ou un facteur prédominant et
conditionnant son fonctionnement efficace.
Au regard du branding réputationnel de l'augmentation
spectaculaire du nombre d'informations manipulées, il n'est plus
possible à concevoir en faisant appel uniquement au bon sens. Le
paradigme sur les évidences des mutations vers des systèmes de
stockage et de manipulation des données a émergé dans ce
contexte comme réponse aux besoins en gestion d'informations. Sans que
cela ait été prémédité, il existe un moyen
simple de se représenter les ressources de la collecte et de la
manipulation de données en considérant chacune d'entre elles
comme un ordinateur physique. Pour ce faire, l'indépendance entre le
niveau physique et le niveau logique de la description des données est
un autre atout de ces SGBD. C'est principalement grâce à ce
fondement théorique que les SGBD relationnel ont des interfaces
d'accès très voisines les unes des autres qui ont convergé
vers le standard qu'est le langage SQL [1] Ce qui est positif reste la
méthode la plus courante pour organiser
15
et accéder à des ensembles de données.
Partant, la situation est essentiellement due à la multiplication des
données en matière d'organisation.
C'est pour cette raison que l'apparition des engins
informatiques qu'éprouvent actuellement la toile mondiale tout et pour
très longtemps d'indiquer la manière dont l'automatisation de la
gestion de l'information a accéléré la réflexion
sur la nature et la structure du "système de pilotage" des organisations
que constituent les circuits d'information.
Une conviction est, à ce sujet, utile : l'ère
des ordinateurs a facilité le stockage et la manipulation de grandes
quantités d'informations. Bien plus, les avantages des ordinateurs ont
permis de comprendre de manière concrète ce que doit être
le système d'information, les composantes qu'il doit posséder et
comment il doit évaluer.
Tout de même, le paradoxe informatique mitigé
entre la compréhension des «services informatiques offerts »
et dès lors, nous pouvons nous poser la question de la nature du lien
entre ces services informatiques et l'«informatique de gestion » nous
pouvons asseoir les termes univoque Informatique qui fournit les moyens du
traitement automatique de l'information et l'informatique de gestion qui
s'appuie sur l'informatique pour automatiser le système d'information et
rendre transparent le traitement de l'information utile et nécessaire
aux activités opérationnelles et de pilotage des organisations.
Cette partie du système d'information automatisé à l'aide
de la technologie des ordinateurs est souvent nommée : Système
d'information informatisé.
Une caractéristique fondamentale liée à
la question du système d'information considérer comme
degré d'existence est la base de données.
De ces quelques réflexions est né le sujet de
cette étude: il nous fait découvrir les services offerts par la
gestion d'informations et les mutations vers le système de gestion de
base de données relationnelles, ce qui permettent de décrire et
d'adapter la structure logique du modèle relationnel de certaines
organisations, la sémantique de pilotage, enfin un contrôle par un
programme qui se fait via une suite d'instructions. Pour y parvenir, il ne nous
serait pas commode d'introduire des instructions et des informations dans
l'ordinateur directement sous forme de signaux électriques.
Cette étude est composée de deux grands temps.
Le premier est une analyse des nombreux concepts introduits pour la gestion des
informations et des bases de données.
Il se base sur une étude informatique comme
mémoire de stockage et propose une approche lié à la
codification d'informations des bases de données et de migrations vers
les SGBDR. Cette partie est couverte par les chapitres 1, 2, et 3.
16
Le deuxième et dernier temps constitue le
dénouement de toute notre démonstration qui contient les
chapitres 4 et 5 ; Ces chapitres décrivent le travail que nous avons
effectué dans le domaine des langages de programmation pour la base de
données. Trois aspects sont principalement traités : notions au
langage Sql, ses catégories d'instructions et le sql
intégré. Le moment où l'ensemble des termes
élaborés tout au long de cette étude de recherche entrent
en cohérence et forment un système pour donner naissance à
la conclusion et aux concepts fondamentaux qui la composent.
17
Chapitre I : L'ordinateur auxiliaire de stockage
I.1. Introduction
Dans ce chapitre, nous présentons l'ordinateur comme un
dispositif auxiliaire de stockage décrivant les différents
outils, langages, méthodes et modèles dont nous avons
réalisés l'étude. Pour cela l'ordinateur comporte des
organes d'entrée et de sortie qui permettent à l'utilisateur de
placer ses informations dans la mémoire et de les y relire lorsque la
machine les a manipulées.
En effet, un ordinateur est une machine à traiter de
l'information; l'information est fournie sous forme de données
traitées par des programmes (exécutés par des ordinateurs)
ce qui ne limite nullement la possibilité de généraliser
notre approche à ceux-ci. Il est donc nécessaire de bien
organiser les données afin d'en ressortir les parties les plus
pertinentes : l'unité logique et arithmétique.
L'information est stockée dans des fichiers (tables).
Ces derniers sont organisés de façon à répondre
efficacement aux attentes de gestion.
I.2. Ordinateur auxiliaire de stockage
La question de l'ordinateur a traversée l'histoire des
différentes lignées et pensées. Au demeurant les
évolutions de son histoire, c'est à coup sûr, et pour cette
raison que ce constat a conduit à la démocratisation d'une
science à travers un outil avec intérêt de savoir manipuler
et stocker très rapidement et sans erreur d'énormes
quantités d'informations.
En termes de remède, l'ordinateur est non sans raison
une affaire de spécialistes, est aujourd'hui devenue l'affaire de tous;
d'où l'importance d'une solide utilisation trousse l'avancement des
toutes les organisations. Par ailleurs cette affaire ayant été
estimée louable, et relativise qu'elle soit pérennisée
tout en améliorant: l'assoupissement de gestion envers les
inconvénients inhérents à tout progrès des
informations.
Ce premier tour d'horizon des problèmes des entreprises
révèle qu'il est un outil qui nous aide à résoudre
certains problèmes. Ces problèmes font généralement
intervenir des symboles ou des signes qui ne nous sont familiers tels que les
lettres de l'alphabet, les chiffres, les signes de ponctuation et quelques
caractères spéciaux comme *,#,+..{[|\^@. Bien entendu, nous
pouvons introduire un ensemble de symboles dans l'ordinateur. Cette
démarche nous rend un autre ensemble de symboles en relation avec ceux
que nous avons introduits.
Pour y parvenir, nous n'examinerons pas en détails la
façon dont l'ordinateur travaille mais nous apprendrons à lui
donner les instructions requises pour qu'il exécute une tâche
18
donnée. Seulement, il est cependant utile de
connaître les différentes parties de sauvegarde et de traitement
d'informations qui constituent un ordinateur.
Cependant, pour ce qui est du rôle joué
actuellement par l'ordinateur, il s'avère que tout
l'intérêt de l'ordinateur réside dans trois de ses
caractéristiques, à savoir: sa capacité d'emmagasiner
une grande quantité d'informations, sa rapidité de traitement, sa
capacité d'assimiler un programme qui contrôle son propre
fonctionnement.
Ainsi, au dire de cette première
caractéristique, il est donc intéressant de pouvoir sauver
certaines informations utiles pour des tâches ultérieures de
façon à les rendre à l'ordinateur autrement qu'en les
tapant au clavier (ce qui s'avérerait vite fastidieux et risquerait
d'introduire des erreurs...).
Au fait, cette mémoire de sauvegarde est
généralement un support magnétique sur lequel on eut
enregistré des informations puis les relire grâce à un
appareil enregistreur/lecteur ad hoc. A ne se limiter qu'à cela, on
laisse bien comprendre que cet appareil peut servir à recevoir les
résultats venant de l'ordinateur (Output) ou à y introduire des
informations (Input).
Outre de ce qui précède, pour les
micro-ordinateurs, il s'agit habituellement des disques durs, de lecteurs de
disquettes souples ("floppy disks") ou de mémoires flash.
Que dire alors de l'information? Mais qu'est-ce qu'une
information pour un ordinateur ? Comment est-elle formée,
stockée, traitée, transmise ? Es-ce-une histoire de 0 et de 1...
Et c'est tout?
Tout d'abord, un ordinateur peut traiter des informations,
c'est-à-dire qui constituent une ressource technique auxiliaire dans le
cadre d'une tâche accomplie par un être humain. Il ne traite pas ce
que cette information signifie, il se contente de manipuler les codes qui la
représentent, la forme de l'information, nous dirons des données,
et non pas le contenu sémantique de l'information.
Cela permet d'en assurer la pérennité et la
disponibilité. En effet, il a été constaté que les
données dans une base de données sont rangées dans des
tables, sortes de grilles où sont rangés les codes
destinés à représenter ces données.
A l'inverse, l'ordinateur est incapable de savoir ce que
représentent ces codes mais cela ne l'empêche pas de savoir les
trier, y chercher un code particulier, les compter, les comparer [W1].
19
Figure I.1. Mémorisation et traitement
d'ordinateur
I.3. Fonctionnalités
Construire des systèmes de gestion d'informations est
une activité informatique fondée sur le raisonnement logique.
Comme on peut le constater, l'accroissement des informations des entreprises a
introduit l'usage de l'ordinateur ce qui revient à dire -de
manière réelle- que cela pour un temps a eu la pleine valeur de
preuve, à la suite il est alors possible que l'outil précieux de
stockage d'informations est l'ordinateur.
Eu égard cette concrétisation, on utilise
presque exclusivement des ordinateurs digitaux (dans lesquels les informations
sont codées sous forme des circuits électriques) et qui
fonctionnent selon les principes d'un calculateur. Bien entendu, ce calculateur
comprend deux parties : une unité logique et
arithmétique.
Dans son sens large, un programme décrit les
opérations logiques à réaliser sur les données.
Considérant les parties du calculateur comme préalable,
l'unité logique est banalisée. La variété
étudiée présente les caractéristiques sur
lesquelles on ne sait pas lors de sa construction à quoi elle va servir,
et si elle sera seulement capable d'exécuter séquentiellement
certaines instructions.
Cela ne signifie certes pas que les programmes et les
données sont placés sur un pied d'égalité dans la
mémoire. Ainsi pour passer à leur exécution, il est
impossible de discerner les programmes des données si ce n'est par
l'effet qu'ils ont sur l'unité logique. Plus précisément,
il importe qu'un ordinateur individuel soit utilisé par une seule
personne à la fois qui décide seule de l'activité de la
machine. C'est à l'issu de celui-ci que sont mis à la disposition
de chacun et connectés en réseau.
De par la nature, lorsque vous saisissez des informations dans
votre ordinateur avec la souris ou clavier, vous envoyez un signal à la
CPU. Ceci suppose que le CPU dispose d'une unité logique qui peut faire
de l'arithmétique de base. Si l'unité de commande ordonne
à l'ordinateur d'exécuter des programmes qui ont
été stockées dans la mémoire, il sera toujours
possible d'effectuer la vitesse à laquelle un ordinateur exécute
des programmes est mesurée en millions d'instructions par seconde, la
vitesse du processeur est mesurée en gigahertz (GHz).
20
De même, lorsque l'information a été
traitée, elle est sortie sous une forme lisible par l'homme à
travers l'écran et haut-parleurs. Dans cette ligne, elle peut
également être stockée à nouveau pour un traitement
ultérieur. En conséquence, les supports de stockage peuvent
être utilisés à la fois données d'entrée et
de sortie [W2].
I.4. Tumulte des couloirs du cosmopolite et trivial
de complexité
I.4.1. Tumulte des couloirs du cosmopolite
Au niveau de la planète terre, divers problèmes
des différentes organisations liés au stockage des données
caractérisent actuellement presque tous les milieux.
Toutes les entreprises sont devenues des grandes chef-d'
accusation, il suffit qu'une erreur se glisse dans la base de données et
la réponse urgente devienne « c'est une erreur de saisi, c'est une
erreur de frappe ».
Dans cette même lancée, nous voyons éclore
de l'ordinateur l'accusation de tous les maux, alors que celui-ci réunit
un correcteur automatique voire des onglets de détection d'erreurs.
I.4.2. Trivial de complexité
En unissant ces trois perspectives de l'analyse du trivial de
complexité, la gestion des données s'affirme, en fait, comme une
dynamique fondamentale de la transformation de toutes les entreprises,
positivement ou négativement. En agissant sur le système de
pilotage et celui opérant, de ce fait, on peut changer l'entreprise et
toute son organisation, dans le bon sens comme dans un sens désastreux
et destructeur.
Cela veut dire qu'il n'est pas un simple réceptacle des
représentations. Cette vision d'ensemble, largement partagée, est
constituée d'un faisceau de vicissitudes, parfois contradictoires, que
nous proposons de classer en trois catégories :
? Trivial de contenus : il laisse
entendre qu'il n'y a pas de contenus spécifiques aux technologies
informatisées à gérer.
? Trivial d'impact : il laisse
penser que les technologies informatisées sont un ensemble d'outils et
de moyens qui changent la gestion des données en place, qu'elles sont
changeables avec les moyens manuelles classiques sans que cela n'ait de
conséquences majeures sur la perte d'une grande quantité des
données.
? Trivial de contexte : il veut
faire croire que les entreprises sont nécessairement mieux avec les
technologies informatisées, quelles que soient les
réalités matérielles.
21
Cela veut dire que les technologies informatisées sont
un ensemble d'objets complexes à intégrer dans des pratiques
complexes. Concrètement, elles ne simplifient ni les contextes, ni les
enjeux, ni les publics entrepreneuriaux.
I.5. Repères pour une question
De par la nature, il importe de remarquer que, dans cette
définition, l'information est le support de la connaissance et non pas
la connaissance elle-même. Il serait donc naïf d'imaginer que les
machines informatiques "comprennent" la signification des informations qu'elles
traitent.
Cela signifie que ces machines ne font que traiter des codes
choisis assez judicieusement par leurs concepteurs pour représenter des
connaissances et de sorte que les manipulations automatisées faites sur
ces codes donnent à leur tour des codes similaires qui
représentent des informations qui ont un sens.
C'est vrai non seulement pour ce qui est de l'informatisation
d'une tâche, lorsqu'elle est possible, consiste à identifier les
informations à traiter, représenter ces informations,
opérer le traitement, produire les informations résultantes du
traitement. La question de preuve des traitements automatisables font appel
à des algorithmes. Ce qui revient à dire que la construction d'un
algorithme suit une démarche créative essentiellement
basée sur l'abstraction appelée analyse [W3].
C'est ce à quoi toute information est
véhiculée par un support, par exemple écrite sur papier,
enregistrée sur cassette audio, Le micro-ordinateur travaille sur une
représentation binaire des informations. Chaque élément
électronique ou magnétique ne sait prendre que deux états
physiques distincts (conducteur ou non conducteur, deux niveaux de tension)
représentés par les chiffres 0 et 1 d'une numérotation
binaire, c'est-à-dire de base 2.
Cela s'applique en particulier avec des bits, d'octets ou de
kilo-octets. Tous ces mots désignent en fait des unités pour
mesurer de capacité de mémorisation d'information par
l'ordinateur.
De même, l'information minimale pour l'ordinateur est le
bit imaginé comme un fil dans l'ordinateur. Deux états le
caractérisent: le courant passe ou ne passe pas. Avec un seul fil, on
peut donc mémoriser une information binaire, c'est-à-dire, deux
valeurs: le courant passe, représenté 1, le courant ne passe pas,
représenté 0. Cette information 0 ou 1 est appelée bit.
A ces raisons s'ajoute la ROM qui sert à stocker le
micro logiciel d'amorçage, les informations que l'ordinateur utilise
pour démarrer.
22
I.6. Des perspectives pour la recherche ?
C'est une évidence : les termes mémoire et
stockage de données sont souvent confondus. Les deux sont des moyens par
lesquels un ordinateur conserve les données utilisées pour
effectuer des tâches.
En tant que tels, les deux sont mesurés en octets.
Cependant, la mémoire et le stockage de données sont deux
entités distinctes et les termes ne doivent pas être
interchangés. Bien que la mémoire est communément
appelée RAM (Random Access Memory), mais comprend également la
mémoire en lecture seule (ROM). Le stockage de données est
également appelé espace sur le disque dur.
Comme le rôle de chacune de partie est défini, la
principale nuance entre la mémoire et le stockage de données est
leur fonction. Le stockage est utilisé pour stocker toutes les
informations de l'ordinateur à l'inverse des données qui sont
stockées sur le disque dur sont permanentes et ne sont pas perdues
lorsque l'ordinateur est éteint.
Lorsqu'un fichier est supprimé, seul l'accès
à ce fichier est supprimé, pas les informations
elles-mêmes. C'est pourquoi les experts en informatique peuvent restaurer
des informations sur un ordinateur même si ces informations ont
été supprimées. Pour supprimer définitivement un
fichier, le disque dur doit être formaté ou remplacé. Il
est même possible que même si un disque a été
formaté, un expert peut toujours visualiser les informations.
Il existe des programmes disponibles qui écrivent des
données sans signification sur les informations du disque, rendant ainsi
les informations illisibles pour quiconque.
C'est pourquoi la mémoire, en revanche, permet à
l'ordinateur d'accéder rapidement aux fichiers du disque dur. Comme la
plu part des fois lorsqu'un ordinateur exécute une application telle
qu'un traitement de texte, l'unité centrale (CPU) récupère
les données du disque dur et les charge dans la RAM, ce qui permet un
accès rapide.
D'où, la quantité de RAM d'un ordinateur limite
le nombre de programmes pouvant être exécutés
simultanément. Etant donné que les informations stockées
dans la RAM sont perdues lors de la mise hors tension de l'ordinateur,
l'enregistrement d'un fichier dans une telle application écrit les
informations sur le disque dur afin qu'elles ne soient pas perdues.
23
Ce qui laisse comprendre que la mémoire et le stockage
de données peuvent cependant fonctionner ensemble et perçues
comme flux de paires que lorsque l'ordinateur ne dispose pas de suffisamment de
RAM pour prendre en charge ses processus, une partie du disque dur est
convertie en mémoire virtuelle alors la mémoire virtuelle agit de
la même manière que la RAM. Cependant, comme il fait partie du
disque dur, l'utilisation de la mémoire virtuelle ralentit l'ordinateur
[W4].
I.7. Bilan du chapitre
A l'issue de ce chapitre nous avons présenté
l'ordinateur et démontrer qu'il est la mémoire précieuse
de stockage. Etant donné que la quantité d'informations des
entreprises fleurit abondamment.
De cette évidence admise, nous avons
démontré de manière permanente que l'ordinateur peut faire
dans un premier temps la gestion des données (mémoriser de
l'information : DD, RAM, ROM, DVD, CD, clé USB, ...) sans lui rajouter
beaucoup d'instructions. Pour bien vérifier ceci il y a
possibilité que cette performance d'informations au sein des entreprises
nécessité des méthodes assez gestionnaire des
données.
24
Chapitre II: Les bases des données : une
nouvelle considération de stockage et manipulation des
données
II.1. Introduction
Depuis peu, avec le développement d'une grande
quantité d'informations, l'ensemble des entreprises ont aspirées
à l'usage des bases de données. Bien attendu, les BD sont
nées à la fin des années 1960 pour combler les lacunes des
systèmes de fichiers et faciliter la gestion qualitative et quantitative
des données informatiques. On peut dire alors que les SGBD comme
étant au carrefour des applications de gestion des données sont
des applications informatiques permettant de créer et de gérer
des BD.
Nous précisons ici, que les BD relationnelles, issues
de la recherche de Codd, sont celles qui ont connu le plus grand essor depuis
l'évolution des différentes années, et qui reste encore
aujourd'hui les plus utilisées.
Cette considération laisse bien comprendre qu'on
utilise des SGBDR pour les implémenter. Un dernier élément
à retenir est que le langage SQL est le langage commun à tous les
SGBDR, ce qui permet de concevoir des BD relativement indépendamment des
systèmes utilisés [5].
Cette appréciation, veut signifier que les usages de BD
se sont aujourd'hui généralisés pour entrer dans tous les
secteurs de l'entreprise, depuis les petites bases utilisées par
quelques personnes dans un service pour des besoins de gestion de
données locales, jusqu'aux bases qui gèrent de façon
centralisée des données partagées par tous les acteurs de
l'entreprise.
Rien n'interdit l'accroissement de l'utilisation du
numérique comme outil de manipulation de toutes données
(bureautique, informatique applicative, etc.) et comme outil d'extension des
moyens de communication (réseaux) ainsi que les évolutions
technologiques (puissance des PC, Internet, etc.). Dans toute la suite sauf
mention du contraire, l'usage numérique a rendu indispensable, mais
aussi complexifié la problématique des BD.
Actuellement, la trajectoire sur les conséquences de
cette généralisation et de cette diversification des usages se
retrouve dans l'émergence de solutions conceptuelles et technologiques
nouvelles, les bases de données du mouvement NoSQL
particulièrement utilisées par les grands acteurs du web.
25
II.2. Base de données
II.2.1. Définition
Que retenir de la définition exacte d'une BD ? Cette
approche par la division de la fonction exercée pour chaque
modélisation reste, de notre point de vue, des quelques
définitions à retenir pour approcher les clivages qui peuvent
exister dans cet ensemble de conception.
Mis à part les définitions modéliser pour
chaque cas, les modélisations s'intéressent aux atouts et
finalités de chaque conception. De cela, retenons quelques
définitions avant d'en tirer une jugée universelle.
§1. Définition d'une BD comme ensemble de
données
a. Est appelé base de données, tout ensemble de
données stocké numériquement et pouvant servir à un
ou plusieurs programme. De leur côté, des fichiers sur un disque
dur, un fichier de tableur, voire un fichier de traitement de texte peuvent
constituer des bases de données.
b. Quel que soit, le support utilisé pour rassembler
et stocker les données (papier, fichiers, etc.), dès lors que des
données sont rassemblées et stockées d'une manière
organisée dans un but spécifique, on parle de base de
données.
§2. Définition d'une BD comme ensemble de
données structuré
a. Une base de données est un ensemble de
données numériques qui possède une structure ; c'est
à dire dont l'organisation répond à une logique
systématique. On parlera de modèle logique de données pour
décrire cette structure.
b. Une base de données est un ensemble
structuré et organisé permettant le stockage de grandes
quantités d'informations afin d'en faciliter l'exploitation (ajout, mise
à jour, la suppression et la recherche de données).
§3. Retenons ces quelques définitions
informatisées
? On appellera base de données un ensemble
structuré de données enregistrées dans un ordinateur et
accessibles de façon sélective par plusieurs utilisateurs [2].
? Est appelle Base de données un gros ensemble
d'informations structurées mémorisées sur un support
permanent [3].
? Une base de données est considérée comme
un recueil d'informations liées à un sujet donné [4].
Certaines mesures visent les bases de données ? Et
comme pour dire que les bases de données de demain devront être
capables de gérer plusieurs dizaines de téraoctets de
données,
26
II.2.2. Domaine problème posé
Tout d'abord, le résultat de la conception d'une base
de données informatisée est d'un premier ordre une description
des données. Compte tenu de la description on entend définir les
propriétés d'ensembles d'objets modélisés dans la
base de données et non pas d'objets particuliers.
Les objets particuliers sont créés par des
programmes d'applications ou des langages de manipulation lors des insertions
et des mises à jour des données. Il faut donc dire, que cette
description des données est réalisée en utilisant un
modèle de données qui du reste est un outil formel utilisé
pour comprendre l'organisation logique des données.
S'agissant de la gestion et l'accès à une base
de données, leurs rapprochements sont assurés par un ensemble de
programmes qui constituent le Système de gestion de base de
données (SGBD). Cela révèle d'un SGBD une
caractéristique par le modèle de description des données
qu'il supporte (hiérarchique, réseau, relationnel, objet).
Ce cadrage rappel que les données sont décrites
sous la forme de ce modèle, grâce à un Langage de
Description des Données (LDD). Cette description est appelée
schéma. D'où, nous consacrons une fois qu'une base de
données spécifiée, on peut y insérer des
données, les récupérer, les modifier et les
détruire. C'est ce qu'on appelle manipuler les données. Ces
données peuvent être manipulées non seulement par un
Langage spécifique de Manipulation des Données (LMD) mais aussi
par des langages de programmation classiques.
Sans prétendre à l'exhaustivité, il
s'agit là d'appréhender la place des bases de données avec
une spécificité importante en informatique, et
généralement dans le domaine de la gestion.
Cette manière de gestion a conduit à une
étude des bases de données qui consacre le développement
de concepts, méthodes et algorithmes spécifiques, notamment pour
gérer les données en mémoire secondaire (i.e. disques
durs).
Il nous faut esquisser ces éléments qui en
effet, dès l'origine de la discipline, les informaticiens ont
observé que la taille de la RAM ne permettait pas de charger l'ensemble
d'une base de données en mémoire. Cette hypothèse est
toujours vérifiée car le volume des données ne cesse de
s'accroître sous la poussée des nouvelles technologies du WEB.
27
géographiquement distribuées à
l'échelle d'Internet, par plusieurs dizaines de milliers d'utilisateurs
dans un contexte d'exploitation changeant (on ne sait pas très bien
maîtriser ou prédire les débits de communication entre
sites) voire sur des noeuds volatiles. En physique des hautes énergies,
on prédit qu'une seule expérience produira de l'ordre du
péta-octets de données par an.
Comme il est peu probable de disposer d'une technologie de
disque permettant de stocker sur un unique disque cette quantité
d'informations, les bases de données se sont orientées vers des
architectures distribuées ce qui permet, par exemple, d'exécuter
potentiellement plusieurs instructions d'entrée/sortie en même
temps sur des disques différents et donc de diviser le temps total
d'exécution par un ordre de grandeur.
II.2.3. Modèle de base de données
1. Modèle hiérarchique
Est appelé base de données hiérarchique
est une forme de système de gestion de base de données qui lie
des enregistrements dans une structure arborescente de façon à ce
que chaque enregistrement n'ait qu'un seul possesseur (par exemple, une paire
de chaussures n'appartient qu'à une seule personne).
De ce fait, les structures de données
hiérarchiques ont été largement utilisées dans les
premiers systèmes de gestion de bases de données conçus
pour la gestion des données du programme Apollo de la NASA.
En effet, à cause de leurs limitations internes, elles
ne peuvent pas souvent être utilisées pour décrire des
structures existantes dans le monde réel. Cependant, les liens
hiérarchiques entre les différents types de données
peuvent rendre très simple la réponse à certaines
questions, mais très difficile la réponse à d'autres
formes de questions.
Si le principe de relation « 1 vers N » n'est pas
respecté (par exemple, un malade peut avoir plusieurs médecins et
un médecin a, a priori, plusieurs patients), alors la hiérarchie
se transforme en un réseau.
2. Modèle réseau
On appelle modèle réseau, modèle qui est
en mesure de lever de nombreuses difficultés du modèle
hiérarchique grâce à la possibilité d'établir
des liaisons de type n-n (relations plusieurs à plusieurs), les liens
entre objets pouvant exister sans restriction.
28
Pour retrouver une donnée dans une telle
modélisation, il faut connaître le chemin d'accès (les
liens) ce qui rend les programmes dépendants de la structure de
données. Ce modèle de bases de données a été
inventé par C.W. Bachman. Pour son modèle, il reçut en
1973 le prix Turing.
3. Modèle relationnel
Une base de données relationnelle est une base de
données structurée suivant les principes de l'algèbre
relationnelle. Le père des bases de données relationnelles est
Edgar Frank Codd. Chercheur chez IBM à la fin des années 1960, il
étudiait alors de nouvelles méthodes pour gérer de grandes
quantités de données car les modèles et les logiciels de
l'époque ne le satisfaisaient pas. Mathématicien de formation, il
était persuadé qu'il pourrait utiliser des branches
spécifiques des mathématiques (la théorie des ensembles et
la logique des prédicats du premier ordre) pour résoudre des
difficultés telles que la redondance des données,
l'intégrité des données ou l'indépendance de la
structure de la base de données avec sa mise en oeuvre physique.
Vers les années 1970, Codd (1970) publia un article
où il proposait de stocker des données
hétérogènes dans des tables, permettant d'établir
des relations entre elles. De nos jours, ce modèle est extrêmement
répandu, mais en 1970, cette idée était
considérée comme une curiosité intellectuelle. On doutait
que les tables puissent être jamais gérées de
manière efficace par un ordinateur.
Ce scepticisme n'a cependant pas empêché Codd de
poursuivre ses recherches. Un premier prototype de Système de gestion de
bases de données relationnelles (SGBDR) a été construit
dans les laboratoires d'IBM. Depuis les années 80, cette technologie a
mûri et a été adoptée par l'industrie. En 1987, le
langage SQL, qui étend l'algèbre relationnelle, a
été standardisé.
4. Modèle objet
La notion de bases de données objet ou
relationnel-objet est plus récente et encore en phase de recherche et de
développement. Elle sera très probablement ajoutée au
modèle relationnel.
29
II.3. Système de gestion de base de
données (SGBD
) II.3.1. Notions et définition
La recherche sur la gestion et l'accès à une
base de données sont assurés par un ensemble de programmes qui
constituent le Système de gestion de base de données (SGBD). Un
SGBD exerce les fonctions comme l'ajout, la modification et la recherche de
données. Il est chargé d'héberge
généralement plusieurs bases de données, qui sont
destinées à des logiciels ou des thématiques
différents.
Cependant du fait de recevoir plusieurs requêtes, la
plupart des SGBD fonctionnent selon un mode client/serveur. Le serveur
(sous-entendu la machine qui stocke les données) reçoit des
requêtes de plusieurs clients et ceci de manière concurrente. Le
serveur analyse la requête, la traite et retourne le résultat au
client. Le modèle client/serveur est assez souvent
implémenté au moyen de l'interface des sockets (voir le cours de
réseau) ; le réseau étant Internet.
Dans ce mouvement, une variante de ce modèle est le
modèle ASP (Application Service Provider). Dans ce modèle, le
client s'adresse à un mandataire (broker) qui le met en relation avec un
SGBD capable de résoudre la requête. La requête est ensuite
directement envoyée au SGBD sélectionné qui résout
et retourne le résultat directement au client.
La déclinaison de ce modèle est qu'un des
problèmes fondamentaux à prendre en compte est la
cohérence des données. Par exemple, dans un environnement
où plusieurs utilisateurs peuvent accéder concurremment à
une colonne d'une table par exemple pour la lire ou pour l'écrire, il
faut s'accorder sur une évidence d'écriture. Cette
évidence peut être : les lectures concurrentes sont
autorisées mais dès qu'il y a une écriture dans une
colonne, l'ensemble de la colonne est envoyée aux autres utilisateurs
l'ayant lue pour qu'elle soit rafraîchie.
Un Système de Gestion de Base de Données est
alors considérer comme un ensemble de logiciels prenant en charge la
structuration, le stockage, la mise à jour et la maintenance des
données. Autrement dit, il permet de décrire, modifier,
interroger et administrer les données. C'est, en fait, l'interface entre
la base de données et les utilisateurs (qui ne sont pas forcément
informaticiens).
30
II.3.2. Objectifs, propriétés, composants et
organisation de la mise en oeuvre d'un SGBD
§1. Objectifs d'un SGBD
Les objectifs et les propriétés principaux ont
été fixés aux SGBD dès l'origine de ceux-ci et ce,
afin de résoudre les problèmes causés par la
démarche classique.
· Indépendance physique
: La façon dont les données sont définies
doit être indépendante des structures de stockage
utilisées.
· Indépendance logique
: Un même ensemble de données peut être vu
différemment par des utilisateurs différents. Toutes ces visions
personnelles des données doivent être intégrées dans
une vision globale.
· Accès aux données
: L'accès aux données se fait par
l'intermédiaire d'un Langage de Manipulation de Données (LMD). Il
est crucial que ce langage permette d'obtenir des réponses aux
requêtes en un temps « raisonnable ». Le LMD doit donc
être optimisé, minimiser le nombre d'accès disques, et tout
cela de façon totalement transparente pour l'utilisateur.
· Administration centralisée des
données (intégration) : Toutes les données
doivent être centralisées dans un réservoir unique commun
à toutes les applications. En effet, des visions différentes des
données (entre autres) se résolvent plus facilement si les
données sont administrées de façon centralisée.
· Non redondance des données
: Afin d'éviter les problèmes lors des mises
à jour, chaque donnée ne doit être présente qu'une
seule fois dans la base.
· Cohérence des données
: Les données sont soumises à un certain nombre de
contraintes d'intégrité qui définissent un état
cohérent de la base. Elles doivent pouvoir être exprimées
simplement et vérifiées automatiquement à chaque
insertion, modification ou suppression des données. Les contraintes
d'intégrité sont décrites dans le Langage de Description
de Données (LDD).
· Partage des données :
Il s'agit de permettre à plusieurs utilisateurs d'accéder aux
mêmes données au même moment de manière transparente.
Si ce problème est simple à résoudre quand il s'agit
uniquement d'interrogations, cela ne l'est plus quand il s'agit de
modifications dans un contexte multi-utilisateurs car il faut : permettre
à deux (ou plus) utilisateurs de modifier la même donnée
« en même temps » et assurer un résultat d'interrogation
cohérent pour un utilisateur consultant une table pendant qu'un autre la
modifie.
31
· Sécurité des données
: Les données doivent pouvoir être
protégées contre les accès non autorisés. Pour
cela, il faut pouvoir associer à chaque utilisateur des droits
d'accès aux données.
· Résistance aux pannes
: Que se passe-t-il si une panne survient au milieu d'une
modification, si certains fichiers contenant les données deviennent
illisibles ? Il faut pouvoir récupérer une base dans un
état « sain ». Ainsi, après une panne intervenant au
milieu d'une modification deux solutions sont possibles : soit
récupérer les données dans l'état dans lequel elles
étaient avant la modification, soit terminer l'opération
interrompue.
§2. Propriétés d'un SGBD
Cette partie retrace les propriétés fondamentales
d'un SGBD à savoir:
· Base formelle reposant sur des
principes parfaitement définis,
· Organisation structurée
des données dans des tables interconnectées
(d'où le qualificatif relationnelles), pour pouvoir détecter les
dépendances et redondances des informations,
· Implémentation d'un langage
relationnel ensembliste permettant à l'utilisateur de
décrire aisément les interrogations et manipulation qu'il
souhaite effectuer sur les données,
· Indépendance des données
vis-à-vis des programmes applicatifs (dissociation entre
la partie "stockage de données" et la partie "gestion" - ou
"manipulation"),
· Gestion des opérations concurrentes
pour permettre un accès multi-utilisateur sans conflit
· Gestion de l'intégrité des
données, de leur protection contre les pannes et les
accès illicites,
§3. Composants des SGBD
La montée en possession d'un certain nombre des
composants logiciels d'un SGBD précise:
· La description des données
au moyen d'un Langage de Définition de
Données(LDD). Le résultat de la compilation est un ensemble de
tables, stockées dans un fichier spécial appelé
dictionnaire (ou répertoire) des données,
· La manipulation des données
au moyen d'un Langage de Manipulation de Données(LMD)
prenant en charge leur consultation et leur modification de façon
optimisée, ainsi que les aspects de sécurité,
32
· La sauvegarde et la
récupération après pannes, ainsi que des
mécanismes permettant de pouvoir revenir à l'état
antérieur de la base tant qu'une modification n'est pas finie (notion de
transaction),
· Les accès concurrents aux
données en minimisant l'attente des utilisateurs et en
garantissant l'obtention de données cohérentes en cas de mises
à jours simultanées,
§4. Organisation de la mise en oeuvre des
SGBD
Les entreprises cherchent à généraliser
les outils d'aide à la décision pour la gestion des
données. Au travers les besoins que concernent cette gestion, c'est sans
conséquence que le souhait des fonctions avec pour objectif de
sécuriser, maintenir et mettre à jour ces informations que le
partage beaucoup plus fin et transparent de l'information via le système
informatique entre les cadres et les agents a des effets sur les modes
d'évaluation du travail des entreprises.
De ce fait, nous décrivons quatre catégories de
fonctions qui consacrent cette gestion de données:
· Les tâches liées à
l'architecture de données consistent à analyser,
classifier et structurer les données au moyen de modèles
confirmés,
· L'administration de données
vise à superviser l'adéquation des
définitions et des formats de données avec les directives de
standardisation et les normes internationales, à conseiller les
développeurs et les utilisateurs, et à s'assurer de la
disponibilité des données à l'ensemble des applications.
L'administrateur assume en outre des responsabilités importantes dans la
maintenance et la gestion des autorisations d'accès,
· Les professionnels en technologie de
données ont en charge l'installation, la supervision, la
réorganisation, la restauration et la protection des bases. Ils en
assurent aussi l'évolution au fur et à mesure des progrès
technologiques dans ce domaine,
· L'exploitation de données
consiste à mettre à disposition des utilisateurs
les fonctions de requête et de reporting (générateurs
d'états), ainsi qu'à assurer une assistance aux différents
services pour qu'ils puissent gérer leur stock propre de données
en autonomie (service infocentre).
Pour atteindre certains de ces objectifs
précités (surtout les deux premiers), trois niveaux de
description des données ont été définis par la
norme ANSI/SPARC.
II.3.3. Affinement de niveaux de description des
ANSI/SPARC
Ce modèle, utilisé pour la phase de conception,
s'inscrit notamment dans le cadre d'une méthode plus
générale et très répandue :
Merise.
33
? Le niveau externe : correspond
à la perception de tout ou partie de la base par un groupe donné
d'utilisateurs, indépendamment des autres. On appelle cette description
le schéma externe ou vue. Il peut exister plusieurs schémas
externes représentant différentes vues sur la base de
données avec des possibilités de recouvrement. Le niveau externe
assure l'analyse et l'interprétation des requêtes en primitives de
plus bas niveau et se charge également de convertir
éventuellement les données brutes, issues de la réponse
à la requête, dans un format souhaité par l'utilisateur.
? Le niveau conceptuel :
décrit la structure de toutes les données de la base, leurs
propriétés (i.e. les relations qui existent entre elles : leur
sémantique inhérente), sans se soucier de l'implémentation
physique ni de la façon dont chaque groupe de travail voudra s'en
servir. Dans le cas des SGBD relationnels, il s'agit d'une vision tabulaire
où la sémantique de l'information est exprimée en
utilisant les concepts de relation, attributs et de contraintes
d'intégrité. On appelle cette description le schéma
conceptuel.
? Le niveau interne ou physique :
s'appuie sur un système de gestion de fichiers pour définir la
politique de stockage ainsi que le placement des données. Le niveau
physique est donc responsable du choix de l'organisation physique des fichiers
ainsi que de l'utilisation de telle ou telle méthode d'accès en
fonction de la requête. On appelle cette description le schéma
interne.
II.4. Modélisation des bases de données
: le modèle entités-associations
II.4.1. Généralités
§1. Pourquoi une modélisation
préalable ?
Ouvrir l'aspect sur la modélisation revient à
dire qu'il est difficile de modéliser un domaine sous une forme
directement utilisable par un SGBD. Cependant, une ou plusieurs
modélisations intermédiaires sont donc utiles, le modèle
entités-associations constitue l'une des premières et des plus
courantes.
Ce modèle, présenté par Chen (1976),
permet une description naturelle du monde réel à partir des
concepts d'entité et d'association. Basé sur la théorie
des ensembles et des relations, ce modèle se veut universel et
répond à l'objectif d'indépendance
données-programmes.
34
§2. Merise
C'est bien ce qui constitue la spécificité de
la méthode MERISE (Méthode d'Étude et de
Réalisation Informatique pour les Systèmes d'Entreprise) qui est
certainement à la disparité comme le langage de
spécification le plus répandu dans la communauté de
l'informatique, des systèmes d'information, et plus
particulièrement dans le domaine des bases de données.
Une représentation Merise permet de valider des choix
par rapport aux objectifs, de quantifier les solutions retenues, de mettre en
oeuvre des techniques d'optimisation et enfin de guider jusqu'à
l'implémentation. Reconnu comme standard, Merise devient un outil de
communication. En effet, Merise réussit le compromis difficile entre le
souci d'une modélisation précise et formelle, et la
capacité d'offrir un outil et un moyen de communication accessible aux
non-informaticiens.
Cela explique que certains des concepts clés de la
méthode Merise est la séparation des données et des
traitements. Cette méthode est donc parfaitement adaptée à
la modélisation des problèmes abordés d'un point de vue
fonctionnel [6].
Si on prend l'exemple méthodologique, on observe que
les données représentent la statique du système
d'information et les traitements sa dynamique. L'expression conceptuelle des
données conduit à une modélisation des données en
entités et en associations.
Merise règne et propose une démarche, dite par
niveaux, dans laquelle il s'agit de hiérarchiser les
préoccupations de modélisation qui sont de trois ordres :
la conception, l'organisation et la technique.
Des nombreuses études ont régulièrement
mis en avant cette méthode, pour aborder la modélisation d'un
système, au fil de temps il convient de l'analyser en premier lieu de
façon globale et de se concentrer sur sa fonction : c'est-à-dire
de s'interroger sur ce qu'il fait avant de définir comment il le fait.
Quelques niveaux de modélisation, sont organisés dans une double
approche données/traitements.
La contrainte est de parler de ces trois niveaux de
représentation des données :
? Niveau conceptuel : le
modèle conceptuel des données (MCD) décrit les
entités du monde réel, en termes d'objets, de
propriétés et de relations, indépendamment de toute
technique d'organisation et d'implantation des données. Ce modèle
se concrétise par
35
un schéma entités-associations
représentant la structure du système d'information, du point de
vue des données.
· Niveau logique : le
modèle logique des données (MLD) précise le modèle
conceptuel par des choix organisationnels. Il s'agit d'une transcription
(également appelée dérivation) du MCD dans un formalisme
adapté à une implémentation ultérieure, au niveau
physique, sous forme de base de données relationnelle ou réseau
d'où les choix techniques d'implémentation (choix d'un SGBD) ne
seront effectués qu'au niveau suivant.
· Niveau physique : le
modèle physique des données (MPD) permet d'établir la
manière concrète dont le système sera mis en place (SGBD
retenu).
II.4.2. Le modèle entités-associations
[W2] II.4.2.1. Définitions
· Une entité est un
objet spécifique, concret ou abstrait, de la réalité
perçue. Ce peut être une personne, un objet inerte, un concept
abstrait, un événement, ...
· Un attribut est une
caractéristique ou une qualité d'une entité ou d'une
association. Il peut être atomique (ex. nom,
prénom) ou composé (ex.
adresse=n°+rue+code_postal+ville)
et peut prendre une ou plusieurs valeur(s) (on parle d'attribut mono- ou
multivalué). Le domaine d'un attribut est
l'ensemble des valeurs que peut prendre celui-ci; il est utile pour
vérifier la validité d'une donnée.
· Un type d'entité est
la classe de toutes les entités de la réalité
perçue qui sont de même nature et qui jouent le même
rôle. Un type d'entité est défini par un nom et un ensemble
d'attributs, qui sont les caractéristiques communes à toutes les
entités de même type; ces dernières forment un ensemble
d'entités (par exemple, un ensemble des travailleurs,
caractérisés par leurs nom et prénom). Par simplification
de la terminologie, on appellera entité un type d'entité, et
occurrence d'une entité un individu
particulier faisant partie d'une entité.
· Le schéma ou intention d'une
entité en est la description ; l'ensemble des occurrences
d'une entité qui existent dans la base à un instant donné
s'appelle l'extension de l'entité. Le schéma d'une entité
ne change pas fréquemment car il en décrit la structure ; son
extension, en revanche, change à chaque insertion ou suppression d'une
occurrence d'entité.
36
? L'attribut clé ou identifiant d'une
entité est un groupe minimal d'attributs permettant de
distinguer sans ambiguïté les occurrences d'entités dans
l'ensemble considéré.
? Un identifiant ou clé d'un
type-entité ou d'un type-association est constitué
par un ou plusieurs de ses attributs qui doivent avoir une valeur unique pour
chaque entité ou association de ce type.
Il est donc impossible que les attributs constituant
l'identifiant d'un type-entité (respectivement type-association)
prennent la même valeur pour deux entités (respectivement deux
associations) distinctes. Prenons un cas pratique : Exemples
d'identifiant: le numéro de sécurité sociale
pour une personne, le numéro d'immatriculation pour une voiture, le code
ISBN d'un livre pour un livre (mais pas pour un exemplaire).
Figure II.1. Cas pratique de type-entité
Sémantique de la figure II.1. Comportant quatre
attributs dont un est un identifiant : deux personnes peuvent avoir le
même nom, le même prénom et le même âge, mais
pas le même numéro de sécurité sociale.
? Une association ou relation est
une correspondance entre 2 ou plusieurs occurrences d'entités à
propos de laquelle on veut conserver des informations. On dit que les
occurrences d'entités participent ou jouent un rôle dans
l'association. Un type d'association est défini par un nom et une liste
d'entités avec leur rôle respectif (notation : A (ro1:E1,
ro2 :E2... ron: En)). Eu des termes simples, on appelle
association un type d'association et occurrence d'association toute
correspondance qui existe entre deux ou plusieurs occurrences d'entités.
L'ensemble des occurrences d'une association qui existe dans la base à
un instant donné s'appelle l'extension de l'association.
Exemple d'association: APPARTENANCE (appartient: ELEVE,
inclut: CLASSE) décrit le fait qu'un élève appartient
à une classe et, symétriquement, qu'une classe inclut plusieurs
élève.
37
Figure II.2. Cas pratique de modèle
entité-association Figure II.3. Exemple d'occurrences de
l'association APPARTENANCE
? Une association peut aussi
posséder des attributs. Un attribut de l'association APPARTENANCE
pourrait être, par ex., un entier indiquant le(s) semestre(s) scolaire(s)
suivi(s) par l'élève.
? Le degré (ou la dimension) d'une
association est le nombre d'entités y participant. Le cas
le plus fréquent est celui de l'association binaire
II.4.2.2. Cardinalité d'une association
La cardinalité d'une association exprime le nombre
minimum et le nombre maximum de fois où chaque occurrence
d'entité participe à une relation.
Autrement dit, la cardinalité de A(ro1:E1,
ro2:E2,...,ron:En) est définie par un ensemble de
couples (mini, maxi) où mini (resp. maxi) indique le nombre minimum
(resp. maximum) de fois que toute occurrence de Ei doit assumer le rôle
roi.
De ce fait, on distingue 4 cas principaux :
Tableau II.1. Exemples cardinalités et types
38
Figure II.4. Représentation graphique et exemples
(suppose qu'un livre ne peut posséder
qu'un auteur) sur les
cardinalités
La mobilité, en particulier des cardinalités
revêt deux explications à savoir :
? L'expression de la cardinalité est obligatoire pour
chaque patte d'un type-association. ? Une cardinalité minimal est
toujours 0 ou 1 et une cardinalité maximale est toujours 1 ou n.
L'idée de basculer de son fonctionnement revient
à dire que, si une cardinalité maximale est connue et vaut 2, 3
ou plus, alors nous considérons qu'elle est indéterminée
et vaut n.
Cela limitait en effet l'idée : si nous connaissons n
au moment de la conception, il se peut que cette valeur évolue au cours
du temps. Il vaut donc mieux considérer n comme inconnue dès le
départ.
De la même manière, on ne modélise pas des
cardinalités minimales qui valent plus de 1 car ces valeurs sont
également susceptibles d'évoluer. Enfin, une cardinalité
maximale de 0 n'a pas de sens car elle rendrait le type-association inutile.
Les seuls cardinalités admises sont donc :
? 0,1 : une occurrence du
type-entité peut exister tout en étant impliquée dans
aucune association et peut être impliquée dans au maximum une
association.
? 0,n : c'est la cardinalité
la plus ouverte ; une occurrence du type-entité peut exister tout en
étant impliquée dans aucune association et peut être
impliquée, sans limitation, dans plusieurs associations.
? 1,1 : une occurrence du
type-entité ne peut exister que si elle est impliquée dans
exactement (au moins et au plus) une association.
? 1,n : une occurrence du
type-entité ne peut exister que si elle est impliquée dans au
moins une association.
39
Pour pouvoir procèder à des mouvements des
éntités du type-entité, il est tout à fait possible
de preciser qu'une cardinalité minimale de 1 doit se justifier par le
fait que les entités du type-entité en questions ont besoin de
l'association pour exister.
Dans tous les autres cas, la cardinalité minimale vaut
0. Ceci dit, la discussion autour d'une cardinalité minimale de 0 ou de
1 n'est intéressante que lorsque la cardinalité maximale est 1.
Cela explique, que nous verrons cette traduction vers un schéma
relationnel, lorsque la cardinalité maximale est n, nous ne ferons pas
la différence entre une cardinalité minimale de 0 ou de 1.
II.4.3. Notations d'associations
type-entité
II.4.3.1. Associations plurielles
Figure II.5. Cas pratique d'associations plurielles entre un
type-entité
Sémantique de la figure II.5. Cette figure comporte
un type-association qui permet de modéliser que des personnes
écrivent des livres et un autre que des personnes critiquent (au sens de
critique littéraire) des livres.
Il faut aussi noter que deux mêmes entités
peuvent être plusieurs fois en association comme la figure
précédente le démontre.
II.4.3.2. Associations réflexives
Les type-associations réflexifs sont présents
dans la plupart des modèles, il est défini comme un
type-association est qualifié de réflexif quand il
matérialise une relation entre un type-entité et lui-même
comme la fugure suivante.
40
Figure II.6. Cas pratique d'associations réflexives
sur le type-entité personne
Sémantique de la figure II.6. Cette figure comporte
un type-association qui permet de modéliser la relation parent/enfant et
le deuxième type-association la relation de fraternité.
Cette nouvelle règle pose une possession de
légitimité d'une occurrence de ce type-association (i.e. une
association) associe généralement une occurrence du
type-association (i.e. une entité) à une autre entité du
même type. Cette relation peut être symétrique, c'est le cas
du type-association Etre frère la figure II.4.4. le démontre, ou
ne pas l'être, comme le type-association Etre parent sur cette même
figure. Dans le cas où la relation n'est pas symétrique, on peut
préciser les rôles sur les pattes du type-association comme pour
la relation Etre parent de la meme figure. L'ambivalence posée par la
non-symétrie d'un type-association réflexif sera levée
lors du passage au modèle relationnel.
II.4.3.3. Associations n-aire (n>2)
Cette partie introduit la notion de type-association n-aire.
Ce type-association met en relation n type-entités. Même s'il n'y
a, en principe, pas de limite sur l'arité d'un type-association, dans la
pratique on ne va rarement au-delà de trois. Les associations de
degré supérieur à deux sont plus difficiles à
manipuler et à interpréter, notamment au niveau des
cardinalités.
Cas pratique d'association n-aire
inappropriée
41
Figure II.7. Cas pratique de type-association ternaire
inapproprié.
Sémantique de la figure II.7. Cette figure comporte le
type-association ternaire Contient associant les type-entités Facture,
Produit et Client représenté est inapproprié puisqu'une
facture donnée est toujours adressée au même
client.
Le champ d'influence est en effet, cette modélisation
suivante qui implique pour les associations (instances du type association)
Contient une répétition du numéro de client pour chaque
produit d'une même facture.
Figure II.8. Cas pratique de Type-association ternaire de la
figure précédente corrigé en deux type-associations
binaires.
Sémantique de la figure II.8. Cette figure comporte
le type-association ternaire Contient associant les type-entités
Facture, Produit et Client représenté est inapproprié
puisqu'une facture donnée est toujours adressée au même
client.
42
Cet constat rélativise une autre solution qui consiste
à éclater le type-association ternaire contient en deux
type-associations binaires.
Figure II.9. Cas pratique de type association ternaire entre
des type-entités Créneau horaire,
Salle et Film.
Sémantique de la figure II.9. Cette figure nous
montre un exemple de type-association ternaire entre les type-entités
Créneau horaire, Salle et Film. Il est toujours possible de s'affranchir
d'un type-association n-aire (n > 2) en se ramenant à des
type-associations binaires de la manière suivante :
On remplace le type-association n-aire par un
type-entité et on lui attribut un identifiant.
On crée des type-associations binaire entre le nouveau
type-entité et tous les type-entités de la collection de l'ancien
type-association n-aire.
La cardinalité de chacun des type-associations binaires
créés est 1, 1 du côté du type-entité
créé (celui qui remplace le type-association n-aire), et 0, n ou
1, n du côté des type-entités de la collection de l'ancien
type-association n-aire.
Cette figure suivante illustre le résultat de cette
transformation sur le schéma de la figure II.10. d'où l'avantage
du schéma de la figure suivante est de rendre plus intelligible la
lecture des cardinalités. Il ne faut surtout pas le voir comme un
aboutissement mais comme une étape intermédiaire avant d'aboutir
au schéma de la figure II.10. Ainsi, le mécanisme, que nous
venons de détailler ci-dessus,
43
Figure II.10. Cas pratique de transformation du
type-association ternaire de la figure 2.10 en un type-entité et trois
typeassociations binaires.
Sémantique de la figure II.10. Cette figure nous
montre le passage d'un type-association n-aire (n > 2) à un
type-entité et n type-associations binaires est tout à fait
réversible à condition que :
Toutes les pattes des type-associations binaires autour du
type-entité central ont une cardinalitémaximale de 1 au centre et
de n à l'extérieur ;
Les attributs du type-entité central satisfont la
règle de bonne formation des attributs de typeassociation.
Détection d'une erreur de modélisation par
décomposition d'une association n-aire
La détéction d'une erreur pourrait expliquer une
forme de passage en difficulté dans la mesure de diposer d'un plus grand
taux de passage signifié passer par cette étape
intermédiaire ne comportant pas de type-association n-aire (n > 2)
qui peut, dans certains cas, éviter d'introduire un type-association
n-aire inapproprié. Considérons par exemple un type-association
ternaire Vol liant trois type-entités Avion, Trajet et Pilote comme
représenté sur la figure suivante. Cette transformation
consistant à supprimer le type-association ternaire produit le
modèle de la figure II.4.10. Ce modèle fait immédiatement
apparaître une erreur de conception qui était jusque là
difficile à diagnostiquer : généralement, à un vol
donné sont affectés plusieurs pilotes (par exemple le commandant
de bord et un copilote) et non pas un seul. Le modèle correct
modélisant cette situation est celui de la figure II.4.11 où le
type-entité Vol ne peut être transformé en un
type-association ternaire Vol comme sur la figure II.4.10.
44
Figure II.11. Cas pratique du Modèle
représentant un type-association ternaire Vol liant
trois
type-entités Avion, Trajet et Pilote.
Figure II.12. Cas pratique de transformation du
type-association ternaire de la figure 2.12 en
un type-entité et
trois typeassociations binaires.
Figure II.13. Cas pratique du Modèle de la figure
2.13 corrigé au niveau des cardinalités.
II.5. Bilan du chapitre
Le panorama bossé sur les évidences des bases
des données, a révélé des éléments
évidents sur les bases des données, ceux décrivant le
système de gestion de base de données et disséminer leurs
intérêt en terme de modélisation et des entités de
types-entités. Plus
45
formellement, une Base des Données est un ensemble
d'informations exhaustives, non redondantes, structurées et
persistantes, concernant un sujet.
De ce fait, introduire le Système de Gestion de Base de
Données peut être le choix de l'organisation, le stockage, la mise
à jour et la maintenance des données. La réponse à
cette question permet de décrire, modifier, interroger et administrer
les données.
46
Chapitre III: Les évidences de mutation vers les
bases de données relationnelles
III.1. Introduction
Avec l'augmentation du rendement de SGBDR, les entreprises ont
adopté le stockage des données dans le SGBDR, qui en fait sont
les logiciels intermédiaires entre les utilisateurs et les bases de
données. Avec ce regard spectaculaire la base de données, est
considérée comme étant un magasin de données
composé de plusieurs fichiers qui sont manipulés exclusivement
par le SGBD. Ce qui permet de cache la complexité de manipulation des
structures de la base de données en mettant à disposition une vue
synthétique du contenu.
La plus part de SGBD et la base de données est
destinée à permettre le stockage de données d'une
manière à offrir beaucoup des aspects relatif par rapport
à un enregistrement conventionnel dans des fichiers. Retenons aussi
qu'il permet d'obtenir et de modifier rapidement des données, de les
partager entre plusieurs usagers. Il garantit l'absence de redondance,
l'intégrité, la confidentialité et la
pérennité des données tout en donnant des moyens
d'éviter les éventuels conflits de modification et en cachant les
détails du format de fichier des bases de données.
Ainsi à la différence des données et le
SGBD, traçons une organisation préalable des indicateurs qui
précise que les données sont enregistrées sous forme de
suites, de bits représentant des lettres, des nombres, des couleurs, des
formes,... alors que le SGBD se compose des mécanismes destinés
à retrouver rapidement les données et de les convertir en vue
d'obtenir des informations qui aient un sens.
Une telle caractéristique, représente une
radicale remise en cause d'enregistrer des données, puis de les
rechercher, de les modifier et de créer automatiquement des comptes
rendus (anglais report) du contenu de la base de données. Il permet de
spécifier les types de données, la structure des données
contenues dans la base de données, ainsi que des règles de
cohérence telles que l'absence de redondance.
Bien qu'il soit indispensable les caractéristiques des
données enregistrées dans la base de données, ainsi que
les relations, les règles de cohérence et les listes de
contrôle d'accès sont enregistrées dans un catalogue qui se
trouve à l'intérieur de la base de données et
manipulé par le SGBD ; il est vrai que les opérations de
recherche et de manipulation des données, ainsi que la définition
de leurs caractéristiques, des règles de cohérence et des
autorisations d'accès peuvent être exprimées sous forme de
requêtes (anglais query) dans un
47
langage informatique reconnu par le SGBD. SQL est le langage
informatique le plus populaire, c'est un langage normalisé de
manipulation des bases de données.
III.2. Généralités sur la notion
de modèle des données
Nombres d'études ayant trait à la notion de
modèle de données mobilisent et insiste sur la portion de
système de types qui est issue des langages de programmation. Il
s'ensuit qu'une des caractéristiques importantes d'un système de
types est sa capacité à modéliser plus ou moins facilement
une situation donnée. Cependant, la notion de type est présente
dans tous les modèles ci-dessus mais elle n'est pas seulement
intentionnelle. Or, dire cela revient à que la notion de modèle
des données est intégrée dans des concepts plus globaux
permettant d'exprimer d'autres notions utiles dans les SGBD. Car, par suite, le
concept décrivant le type d'une entité est notamment
utilisé pour définir le contenant de ces entités.
A ce stade de la réflexion, il apparait donc de
supposer que cette spécificité des activités de service
comme les systèmes de types des langages de programmation
décrivent le modèle de mémoire utilisé par
l'environnement d'exécution du langage, d'où les modèles
de données déterminent le modèle mémoire
implanté par les SGBD. Pour répondre à cette question,
nous mettons en lumière deux niveaux de mémoire (mémoire
centrale / mémoire secondaire), ce qui explique que son système
de types soit moins puissant que ceux des langages de programmation.
Ce faisant, ces derniers travaillent en effet exclusivement en
mémoire centrale. Ainsi, nous pouvons donc dire que, pour ces
différents types de SGBD, le modèle de données
associé est grandement influencé par l'efficacité du
modèle de mémoire qui peut être mis en oeuvre (la
réciproque étant vraie aussi), et surtout celle du modèle
de stockage.
III.3. Structure des modèles des données
à objet
Nous avons vu que la notion des modèles d'objets
constitue la portion de système de types qui est issue des langages de
programmation. Par-là même, dans cette partie nous allons parler
des modèles de données à objet. D'où, il en
résulte que la partie principale qui différencie les
modèles à base de valeurs des modèles objets est la
référence.
En ce sens, elle est utilisée pour dissocier
l'identification d'un objet de sa valeur définissant ainsi des objets
abstraits. Ces choses étant dites, nous reviendrons aussi dans ces
modèles d'identificateur d'objet (oid) et d'état d'un objet.
Sachant cela, nous proposons une étude de ces différentes notions
dans différents modèles de systèmes existants.
Par ailleurs, comme nous ne pouvons pas non plus structurer un
attribut en un autre n-uplet, pour pouvoir définir l'abstraction de
l'adresse dans PERSONNE, nous devons
48
III.3.1. Le modèle de données d'Orion [9]
Le modèle des données dit Orion est un SGBD
orienté objet développé au MCC à Austin (USA). On
peut donc dire de ce modèle qu'il s'agit d'une extension du langage
Lisp, dans lequel sont introduits des concepts objets et base de données
à travers la notion de classe. S'il est pour partie imposée, cela
indique que dans le modèle d'Orion, tout est objet ; à cela nous
n'avons la notion de valeur qu'au niveau des attributs d'un objet.
De plus, la classe apporte aussi des fonctionnalités de
la base de données. Mais cela ne change rien à l'affaire, comme
la relation, la classe définit à la fois un type d'objet et
désigne l'ensemble des instances de cette classe.
On peut donc dire de manière structurel que le
modèle d'Orion est très proche du modèle relationnel
puisque d'un côté le constructeur ensemble est mis en oeuvre
seulement au niveau de la classe et d'un autre coté l'état d'un
objet a une structure de n-uplet dont les attributs sont soit des valeurs de
base, soit des objets abstraits.
C'est plutôt que, dans la mesure où le seul moyen
de représenter des attributs multi values est alors de gérer
explicitement des structures de listes comme cela est fait pour les champs
"Prenoms" et "Enfants" de la classe Personne.
49
définir un objet de classe ADRESSE. S'il est clairement
établi que nous considérons l'adresse comme propre à
chaque personne, Orion offre la possibilité de définir des liens
dit "composite" entre objet.
Cela signifie que l'objet Adresse ne peut être
partagé par aucun autre objet et qu'il existe une dépendance
existentielle entre les deux objets (si un objet PERSONNE est détruit,
l'objet "composite" ADRESSE l'est aussi). La sémantique de ces deux
types de liens ne peut être mise en oeuvre qu'au niveau de la
référence ou de l'identificateur de l'objet car c'est une
contrainte dynamique associée à l'objet et non à sa
classe.
Autrement dit, toutes les instances d'une classe Orion sont
persistantes. Nous avons donc deux espaces d'instanciation bien
séparés : l'espace temporaire des données Lisp
(essentiellement composé de listes) et l'espace des objets persistants
décrit par les classes.
Mais ce n'est pas tout, nous constatons que le
dysfonctionnement au niveau du système de type n'a pas été
supprimé. Outre, nous avons deux systèmes de types qui partagent
néanmoins leurs domaines de base, ce qui réduit le
dysfonctionnement. Avec les nouveaux concepts objet et la base de
données ne sont donc pas orthogonaux aux autres concepts du langage
initial.
III.3.2. EXTRA : un modèle de données pour
EXODUS
Le modèle de données pour EXODUS [12] est un
SGBD extensible développé à l'université de
Wisconsin (USA). De ce modèle, chacun s'accordera à reconnaitre
qu'il s'agit d'une boite à outils devant permettre d'implanter des SGBD
et ce pour n'importe quel modèle de données. En vue de le
concrétiser, un modèle de données, nommé EXTRA et
un langage de requêtes, nommé EXCESS, sont proposés dans
[13].
C'est un modèle d'objets complexes assez proche de ceux
proposés dans Galileo [10] ou dans Fad [10], dans lequel tous les objets
sont des valeurs. Il est même fréquent que l'introduction d'un
constructeur ref permet de manipuler explicitement les références
aux valeurs de la base. En ce sens, la notion de type permet de définir
structurellement ces valeurs.
50
Il sied de dire que seules les valeurs
générées à partir des types du schéma
peuvent être référencées. Cette diversité des
valeurs générées sont introduites par le constructeur own
dans la définition où leur type intervient. En somme, ces valeurs
sont divisées en deux catégories : les valeurs
référençables et celles qui ne le sont pas. Les valeurs
référençables sont introduites par own ref alors que les
autres le sont par own seulement. Le constructeur own introduit dans tous les
cas une dépendance existentielle pour la valeur ainsi
désignée.
Signalons néanmoins que la manipulation des valeurs de
la base rend transparente la notion de référence. Comme
l'accès à une valeur par un nom qui la désigne directement
ou par un nom qui désigne une référence vers cette valeur
se fait de la même manière pour l'utilisateur. Il est alors
possible de dire que le système infère automatiquement, par
rapport au schéma, le fait qu'il accède à cette valeur par
la fonction í ° ñ ou í ° ñ °
ñ (pour les valeurs référencées). Prenons un cas
pratique, si nous supposons que "pers"est un nom qui désigne une valeur
de type "personne", nous accédons de la même manière
"pers.Nom" et "pers.Epoux.Nom" alors que "pers.Epoux" désigne une
référence vers une valeur de type "personne".
Au final, il s'avère que la différence
étant explicite dans le schéma, car elle est prise en compte lors
de l'opération d'affectation. Seulement tel n'est pas forcément
le cas ; de ce fait nous en distinguons deux types : l'affectation de valeur
(copy to...) et l'affectation d'une référence à une valeur
(insert into...).
En revanche, nous pouvons étendre les domaines de base
avec les ADT (types de données abstraits). Les ADT sont des classes
persistantes définies à partir du langage E [14] (extension de
C++). Un cas pratique de leur utilisation est le champ "DateNais" dans le
type
En cela O2 offre donc un modèle d'objets complexes
faisant intervenir de manière orthogonale les constructeurs n-uplet
(tuple), ensemble (set) et séquence (list). Nous n'avons
51
"personne" dont le type Date est un ADT. Un ADT définit
donc une valeur encapsulée par différentes méthodes qui
lui sont attachées.
Cela revient à dire que toutes les valeurs
créées sont persistantes. Et que nous avons donc un seul espace
d'instanciation dont les données sont manipulées à travers
un langage de requêtes (EXCESS) du même niveau qu'un langage comme
SQL. Ce langage de manipulation n'est pas complet ; nous n'avons pas dans ce
système une intégration entre un langage général et
les aspects base de données.
III.3.3. Le modèle de données de O2
Le modèle de données dit O2 [15] est un SGBD
orienté objet développé par le GIP-Altaïr à
Paris (France). Son objectif est d'offrir un système multi-langages
permettant à ces derniers de manipuler des objets, notamment
persistants, à travers un modèle commun. Le modèle O2 [16]
distingue deux catégories de données : les valeurs et les
objets.
Le nommage des instances (create name...) est
séparé du nommage des types comme dans EXTRA. Cela nous
amène à pointer une autre façon de nommer les types
décrivant des valeurs (create type...) aussi bien que ceux qui
décrivent des objets abstraits (create class...) comme le montre la
représentation O2[17] du cas pratique des personnes.
52
pas explicitement la notion de référence et le
partage de données se fait exclusivement à travers des objets
abstraits.
Or, si celles-ci constituent un support à l'action, le
système permet de créer des objets persistants ainsi que des
objets temporaires. Mais ce n'est pas tout, car il faut alors distinguer deux
types de références suivant le statut de l'objet instancié
qui engendre en fait deux espaces d'instanciation différents.
Alors que, la notion d'objet abstrait impliquant qu'une
référence peut être instanciée dans d'autres objets,
il se pose le problème des références inter-espace. Et
cela n'est pas sans poser problème, qu'une référence dans
l'espace persistant est valide d'une exécution d'un programme à
une autre. Ce n'est pas le cas des références de l'espace
temporaire. Le problème est résolu dans O2 en
déplaçant tout objet abstrait temporaire dans l'espace persistant
si la référence qui l'identifie est instanciée dans
l'espace persistant.
Ces choses étant dites, regardons à
présent en quoi le modèle de O2 est intégré dans un
langage de programmation usuel tel que C, Lisp ou Basic. Pour ce faire, le
système de type défini par le modèle est ajouté au
système de type du langage d'immersion.
Cette intégration n'est pas orthogonale. A cette
caractéristique s'ajoute le fait que le dysfonctionnement au niveau du
système de type n'est donc pas résolu dans les différents
langages associés à O2 tels que O2C. A l'opposé, on a vu
que ce dysfonctionnement est moins sensible car le système de types pour
la définition des données persistantes est au moins aussi
puissant que celui du langage d'immersion même s'il ne partage pas les
domaines de base. Des coopérations sont tout de même possibles
comme un cas pratique qu'une affectation d'une entier C (int) dans un entier O2
(integer).
III.3.4. Le modèle de données de Guide
Le modèle de données de Guide [19] est un
système orienté objet distribué développé
par l'unité mixte Bull-Imag à Grenoble (France). Comme nous
l'avons vu, ce modèle sert de support à un langage orienté
objet portant le même nom dédié à la construction
d'applications réparties. Ici, la réponse d'objets est claire, le
système de type permet essentiellement de définir des objets
abstraits qui sont des instances des classes Guide. En remettant en question
l'explication, la notion de type présente dans Guide correspond à
une interface d'accès aux objets.
53
Nous nous retrouvons donc face à la difficile et
essentielle question de ces objets qui peuvent appartenir à
différentes classes avec une condition si celles-ci sont conformes
à l'interface proposée par le type.
Voilà pourquoi, avec le temps et l'expérience,
l'état associé à un objet Guide est une valeur qui peut
être construite [20]. Bien attendu, il va sans dire que le langage offre
deux constructeurs : le n-uplet (record) et le tableau (array). On voit bien
ici qu'ils peuvent être combinés de manière orthogonale.
Or, nous n'avons pas la puissance d'un modèle d'objets complexes, le
tableau n'offrant pas la dynamicité du constructeur ensemble. Nous avons
pu observer qu'il faut alors comme pour Orion, gérer explicitement des
listes chainées. Une modélisation possible pour le cas pratique
des personnes en Guide est la suivante :
De la même façon que la modélisation, tous
les objets Guide sont persistants. Dit autrement, ils ne persistent
réellement que lorsqu'ils sont accessibles à partir d'un nom.
Tout d'abord, il importe de préciser que, nous avons à faire ici
à un langage de programmation ce qui permet de distinguer deux
partitions dans l'espace de noms : les noms qui désignent des
données de la base, et les noms qui désignent des entités
dans l'environnement d'exécution. Mais ce n'est pas tout.
Nous pouvons par exemple répertorier dans cette
deuxième partition, qui n'existe que dans le cas d'un langage de
programmation, les noms désignant des variables locales d'une
procédure.
Pour résoudre ce problème et en quelque sorte
mettre en claire, cette seconde catégorie de noms peut être
déterminée statiquement par le schéma qui contient dans ce
cas les définitions des traitements (procédures ou
méthodes). Ce faisant d'un côté, ce n'est plus vrai
54
lorsque le langage supporte la récursivité
(empilage potentiellement infini d'environnements). Aussi bien que, comme nous
l'avons vu, l'environnement d'exécution comporte alors une pile
impliquant la création de nouveaux noms à chaque nouvel appel de
procédure. Quoiqu'il en soit, nous avons donc une deuxième racine
de nommage (la première étant la base de données
nommée "BaseDeDonnées") qui est l'environnement
d'exécution que nous nommons "Environ". Dans le cas d'un langage
classique, nous lui attachons généralement deux fils : un nom
désignant un n-uplet dont chaque attribut est une variable globale de
l'application (nous l'appelons "Global"), et le nom désignant la pile
d'exécution (nous l'appelons "Pile").
Seulement, dans Guide, nous pouvons ainsi créer des
objets qui sont désignés par des noms de l'environnement
d'exécution. Ce faisant, ils ont alors la durée de vie de ce nom,
c'est à dire au maximum celle de l'exécution en cours, à
moins qu'un autre nom de la base ne permette de les désigner avant la
fin de cette exécution. La nouveauté réside à
travers ce cas pratique de ce type de nom où
"Environ.Pile.main.Augmenter.this" désigne le paramètre contenant
l'objet sur lequel s'applique la méthode "Augmenter" qui a
été appelée dans la procédure "main" correspondant
au point d'entrée du programme.
Cela dit, tous les objets Guide qui sont créés
sont potentiellement persistants et deviennent réellement persistants
(ils subsistent à l'exécution du programme qui les a
créés) uniquement s'ils sont attachés
(désignés) par un nom de la base. Pour conclure, les
systèmes décrits précédemment, Guide offre un
service de nommage permettant de créer des points d'entrée vers
les objets de la base. Cela étant, ces noms ne font pas partie du
schéma ce qui est une divergence remarquable. Enfin et surtout, ces noms
ne sont pas typés (alors que Guide offre un typage fort) ce qui implique
le besoin de mettre en oeuvre de la vérification de type à
l'exécution lors de l'utilisation de ces noms.
III.4. Passage au modèle relationnel
III.4.1. Généralité de clé
étrangère
La clé étrangère d'une relation R est un
sous-ensemble C des attributs de R tel que :
? Il existe une relation R' (pas nécessairement
distincte de R) possédant une clé candidate C' ;
? Pour chaque valeur différente de C dans R, il existe
une valeur (unique) de C' dans R' identique à C.
55
De même, la clé étrangère dans une
table est un attribut ou une concaténation d'attributs qui forme une
clé d'identification d'une autre table (ou éventuellement de la
même table). Une clé primaire d'une table comportant des
clés étrangères peut être soit une
concaténation de celles-ci, soit une autre clé candidate - par
exemple une clé créée artificiellement.
III.4.2. Règles de passage
Avec les règles de passage, l'opération consiste
à représenter sous forme de tables les entités et les
associations obtenues précédemment. Pour ce faire, on applique
les règles suivantes :
? Chaque entité est traduite en une table distincte,
dont la clé primaire peut être soit celle de l'entité, soit
une autre clé candidate. Les autres attributs de l'entité sont
reportés comme attributs de la nouvelle table.
? La conversion d'une association dépend de sa
cardinalité :
R1. Une association de dimension 2 de type simple-complexe
(par exemple, (1,1)-(1,N)) ne nécessite pas la création d'une
nouvelle table, mais est traduite en définissant une clé
étrangère dans la table qui se situe du côté
"simple" de l'association. Cette clé doit faire référence
à la clé d'identification de la seconde table, et son nom est
judicieusement choisi en conséquence.
R2. Une association de dimension 2 de type simple-simple (par
exemple, (1,1)-(0,1)) se traite de la même façon, en choisissant
en principe d'introduire la clé étrangère dans la table
située du côté (1,1) de l'association.
R3. Chaque association de dimension 2 de type
complexe-complexe (par exemple, (0, N)-(1, N)) est représentée
par une table distincte, contenant les identifiants des deux entités
associées comme clés étrangères. Ces attributs
constituent souvent, à eux deux, la clé primaire de la nouvelle
table.
Si l'association comporte d'autres attributs, ceux-ci sont
également ajoutés à la table.
R4. Une association de dimension supérieure à 2 se
réécrit selon la règle R3.
Figure III.1 : Erreur de conception du modèle
entité association
56
III.4.3. Cas pratique
Tableau III.1 : Cas pratique d'usage des règles de
passage modèle entité-association du
modèle
relationnel
III.5. Pertinence de la normalisation dans la
conception d'une Base de données relationnelle
III.5.1. Redondance d'un attribut
Prenons un cas pratique d'un modèle relationnel obtenu
pour représenter les données relatives à l'inscription des
élève dans une classe se soit réduit à une seule
table (suite à une mauvaise conception du modèle
entité-association) :
57
Une pareille conception entraîne des difficultés
de redondance des informations. On s'aperçoit en effet que
l'intitulé de la classe est répété pour chaque
élève, et qu'il est identique pour tous les élèves
inscrits dans la même classe. Cet attribut est donc redondant, et il est
préférable de stocker ces informations, relatives à une
classe, dans une table séparée.
III.5.2. Anomalies de mutation
En conséquence, le schéma
précédent n'est pas satisfaisant car il engendre certaines
anomalies lors des opérations de mise à jour, d'insertion et de
suppression des données (anomalies dites de mutation).
? Si par exemple on modifie l'intitulé d'une classe
dans un tuple (ex. de "Etude de la Vie" en "Etude du Vivant"), ce même
intitulé devra être changé pour tous les autres
élèves concernés, sans quoi cette classe possédera
plusieurs intitulés différents (anomalie de mise à
jour).
? Si une nouvelle classe se crée, elle ne pourra pas
être ajoutée dans la table sans y inscrire immédiatement
des élèves, car la clé primaire (N°E) ne peut
être laissée vide. Cette anomalie d'insertion peut être
gênante, par exemple, parce que le stockage d'informations sur la
nouvelle formation (maquette, intervenants, ...) doit pouvoir intervenir avant
toute inscription d'élève.
? Si l'on supprime tous les élèves de la table
(par exemple parce qu'ils ont tous eu leur diplôme !), on perd du
même coup toutes les informations relatives aux promotions (anomalie de
suppression).
Ces termes définis, soulignons qu'à l'instar des
anomalies de mutation, une base de données relationnelle doit stocker un
ensemble de schémas relationnels sans redondance inutile et sans
comportement anormal des relations lors des opérations de mise à
jour. Cependant la théorie de la normalisation des relations a
été associée au modèle relationnel.
III.6. Dépendances fonctionnelles et
normalisations des relations
III.6.1. Dépendance fonctionnelle :
définitions
La notion de dépendance fonctionnelle (DF) a
été introduite par Codd en 1970, elle permet de
caractériser des relations qui peuvent être
décomposée sans perte d'information. Tout d'abord, sa
formalisation mathématique découle de l'observation des
rôles de cardinalité simple (au plus égale à 1). En
intégrant sa pratique, intuitivement, une DF traduit le fait que
58
les valeurs de certains attributs sont nécessairement
déterminées (fixées) lorsque le sont celles d'autres
attributs.
Partant de cela, on dit qu'un attribut ou un ensemble
d'attributs Y est fonctionnellement dépendant d'un autre (ensemble d')
attribut(s) X si, à chaque valeur prise par X correspond une valeur
unique de Y. Autrement dit, des valeurs identiques de X impliquent des valeurs
identiques de Y. Cette dépendance est notée X--Y.
Avec une particularité, qu'une propriété
remarquable des clés d'identification est que, justement, tout attribut
non-clé dépend fonctionnellement de la clé, puisque
celle-ci identifie chaque tuple de manière unique.
Mais avant cela, une des propriétés de la DF est
la transitivité : X--Y et Y--Z X--Z. On dit qu'un attribut Z est
transitivement dépendant d'un attribut X s'il existe un attribut Y tel
que X--Y et Y--Z, et aussi que X ne dépend pas fonctionnellement de
Y.
III.6.2. Normalisation des relations
En pointant la normalisation des relatons que sous-tendent ces
différentes relations, il s'agissait de mettre en exergue les anomalies
de mutation. Pour ce faire, pour éliminer les divers types de
dépendances, et donc éviter les anomalies de mutation, on
applique un processus de normalisation sur les différentes relations de
la base. Les étapes successives de ce processus imposent des
critères de plus en plus restrictifs aux tables normalisées:
? Une relation est en première forme normale
(notée 1NF) si les domaines de tous ses attributs sont des valeurs
atomiques (et non des ensembles, types énumérés ou
listes). De ce fait, tout attribut d'une relation 1NF doit donc être
monovalué. Bien attendu, la 1NF permet d'éliminer les domaines
composés. En sus, pour normaliser une table à la 1NF, il suffit
de créer un tuple distinct pour chaque valeur de l'attribut
multivalué. Cela introduit des redondances, mais la deuxième
forme normale permet d'y remédier.
? Plus précisément, une relation est en
deuxième forme normale (2NF) si elle est 1NF et si, de plus, tout
attribut non-clé dépend fonctionnellement de toute la clé
(et pas seulement d'une partie de celle-ci). Pour qu'une table soit 2NF, il
faut donc, si sa clé est composée (sous-entendu, de plusieurs
attributs), que tout autre attribut soit fonctionnellement dépendant de
la clé entière (on dit parfois qu'il y a dépendance
fonctionnelle totale). La 2NF garantit qu'aucun attribut n'est
déterminé seulement par
59
une partie de la clé. En somme, pour normaliser
à la 2NF une table possédant une clé composée, il
faut décomposer celle-ci en :
? une table formée des attributs dépendants
d'une partie de la clé, et de cette partie même.
? une seconde table formée de la clé
composée et des attributs restants :
Figure III.2 : Cas pratique de normalisation de la
2FN
? En suite, une relation est en troisième forme normale
(3NF) si elle est 2NF et si, de plus, tout attribut non-clé ne
dépend pas transitivement de la clé (ou, autrement dit, si tout
attribut non-clé ne dépend pas fonctionnellement d'un attribut
non-clé).
Dans ce cas, la 3NF permet d'éliminer les redondances
dues aux dépendances transitives. C'est-à-dire, pour normaliser
à la 3NF une table possédant une dépendance transitive, il
faut décomposer celle-ci en :
? une table formée de l'attribut redondant et de
l'attribut dont il dépend (nommé ici X); ce dernier devient la
clé de la nouvelle table,
? une seconde table formée de la clé, de
l'attribut X comme clé étrangère, et des autres attributs
:
Figure III.3 : Cas pratique de normalisation de la
3FN
Enfin et surtout, les formes normales 2NF et 3NF assurent
l'élimination des redondances parmi les attributs non-clé, mais
pas les redondances potentielles au sein d'attributs formant une clé
composite. Finalement, Boyce et Codd ont proposé une extension de la
3NF, il s'agit là d'une forme normale dite Boyce-Codd (BCNF).
De ce fait, une relation est en forme normale de Boyce-Codd
(BCNF) si, et seulement si, les seules dépendances fonctionnelles
élémentaires sont celles dans lesquelles une clé
détermine un attribut non-clé.
60
Plus simple que la 3NF, un peu plus restrictive, cette forme
est utile lorsqu'une table possède plusieurs clés candidates.
Plus précisément, lorsque les clés se chevauchent dans une
table, celle-ci risque de transgresser la forme normale de Boyce-Codd,
même si elle est en 3NF. Il faut alors la décomposer
d'après les clés candidates :
Figure III.4. Cas pratique de normalisation de la
BCFN
Cela étant, toute relation admet au moins une
décomposition en BCNF qui est sans perte; cependant, ne telle
décomposition ne préserve généralement pas les
dépendances fonctionnelles.
Retenons alors qu'il existe deux autres formes normales,
encore plus restrictives, mais qui se rencontrent bien moins
fréquemment. La quatrième (4NF), par exemple, est basée
sur les dépendances multivaluées.
III.6.3. Cas pratique
Pour éprouver ces différentes formes normales,
il faut dire que les critères des formes normales sont satisfaits si le
modèle entité-association est bien construit et que si les
règles de passage au modèle relationnel ont été
correctement appliquées. Par-là, la vérification de toutes
les formes normales successives n'a plus alors besoin d'être
systématique [26].
Outre, avec notre part, supposons au contraire que le
modèle entité-association ait fourni la relation suivante (figure
III.5.).
A l'évidence, celle-ci n'est pas en 1NF ; il faut donc
la transformer conformément à la figure III.6. Or, la clé
de la nouvelle table, composée des attributs N°E et Option,
détermine bien de manière unique les attributs non-clé
(c'est-à-dire qu'on a les dépendances fonctionnelles
(N°E,Option)--Nom, (N°E,Option)--Prénom, et
(N°E,Option)--Adresse). Cependant, la transformation a manifestement
créé des redondances et, intuitivement, on sait que l'adresse de
l'élève n'a aucun rapport avec l'option choisie. Cela se traduit
par le fait que les attributs non-clé sont fonctionnellement
dépendants d'une partie de la clé (N°E--Nom,
N°E--Prénom, et N°E--Adresse). La deuxième forme
normale exige donc de créer deux tables séparées (figure
III.7.).
Figure III.9. Passage en 3NF, après ajout de la table
Code_postal avec attributs (rue et ville).
61
Supposons qu'en plus des attributs précédents,
on ait stocké dans la table ELEVE le code postal et la ville, et qu'on
ait séparé le numéro de voie et la rue. La 2NF
correspondante est représentée figure III.8. (la table CHOIX n'a
pas été représentée). Dans cette table, l'attribut
CodePostal dépend fonctionnellement de l'attribut composé (Rue,
Ville) et, par là même, dépend transitivement de la
clé.
Pour passer en 3NF, il faut donc créer une table
CODE_POSTAL distincte, et faire apparaître dans ELEVE l'attribut codant
la rue et la ville sous forme de clé étrangère (figure
III.8.) :
Figure III.8. Passage en 3NF, en ajoutant la table
Code_postal avec attributs (rue et ville).
On trouve seulement, dans la nouvelle table, qu'il y a encore
de la redondance. C'est la raison pour laquelle, si la clé
composée de la rue et de la ville détermine bien le code postal,
la ville est aussi fonctionnellement dépendante du code postal
(c'est-à-dire (Rue,Ville)--CodePostal et CodePostal--Ville). Ceci est
lié au fait que l'attribut (Rue, CodePostal) constitue également
une clé candidate (clé secondaire). Pour obtenir une forme
normale de Boyce-Codd, il faut donc décomposer cette relation en deux
(figure 6-3) :
62
III.6. Intégrité structurelle
III.6.1. Notion et classification
Est appelé contrainte d'intégrité (CI),
une propriété ou une règle que doivent satisfaire les
données de la base pour être considérées comme
correctes (sans ambiguïtés ni incohérences). Une base de
données est dite intègre ou cohérente si ses contraintes
d'intégrité sont satisfaites.
Cela dit, qu'en pratique, ces contraintes ont pour effet de
limiter les occurrences possibles des structures d'informations. La conception
d'une base de données relationnelle se compose du schéma
relationnel même et d'un ensemble de CIs.
De cette présentation faite, il convient de classer les
contraintes selon les valeurs d'attributs à savoir:
? Les contraintes d'intégrité statiques sont des
propriétés qui doivent être vérifiées
à tout moment :
? Les contraintes individuelles imposent un type de
donnée (ex. entier long), un
ensemble de valeurs (par exemple,
AnnéeEmbauche={2010..2017},
AnnéeEmbauche={2001, 2010, 2015},
AnnéeEmbauche>AnnéeNaissance) ou une valeur obligatoire (ex.
"l'attribut pilote doit être obligatoirement renseigné").
? Les contraintes intra-relation portent sur les valeurs des
attributs : unicité devaleur, cardinalité, dépendances
entre les valeurs d'attributs différents (ex. "les espèces e3 et
e6 ne peuvent cohabiter").
? Les contraintes inter-relations sont des dépendances
référentielles ou existentielles (ex. "tout vol doit avoir comme
commandant de bord une personne référencée dans la table
des pilotes").
63
? Les contraintes d'intégrité dynamiques sont
des propriétés que doit respecter tout changement d'état
de la base de données; elles en définissent les séquences
possibles de changement d'état. (ex. "le salaire d'un employé ne
peut qu'augmenter")
Il s'ensuit que trois catégories de contraintes
d'intégrité structurelles sont particulièrement
importantes dans le modèle relationnel : les contraintes
d'unicité (chaque table possède une clé
d'identification qui en identifie les tuples de manière unique),
les contraintes de domaine (les valeurs possibles
d'un attribut sont restreintes à un ensemble de valeurs
prédéfinies) et les contraintes
d'intégrité référentielle (chaque
valeur d'une clé étrangère doit exister comme valeur de la
clé d'identification dans la table référencée).
III.6.2. Intégrité
référentielle
Ces choses étant dites, un avantage demeure, car le
mécanisme d'intégrité référentielle impose
que chaque valeur d'une clé étrangère existe comme valeur
de la clé d'identification dans la table
référencée.
Tout SGBDR digne de ce nom attire et supporte ce concept
fondamental ; prenons un exemple pour l'illustrer. Prenons le cas de la
normalisation en 3NF de la table ELEVE, dans laquelle figure la classe
d'inscription, ait fourni la table de la figure III.14. On remarque qu'aucune
valeur de la clé étrangère _Class ne viole
l'intégrité référentielle. Mais l'insertion d'un
tuple tel que "0005, Mader, DESSDC" serait rejetée si la clé
primaire de la table CLASSE ne contient pas la valeur "DESSDC".
Partant de ces figures, l'on remarque que le respect de
l'intégrité référentielle implique certaines
actions. On a vu que le SGBDR vérifiait l'existence d'une valeur de
clé étrangère lors de l'insertion d'un nouveau tuple ;
mais que se passe-t-il si l'on supprime ou si
64
l'on modifie une valeur de la clé primaire dont
dépendent d'autres valeurs dans une clé étrangère ?
Plusieurs stratégies sont possibles:
Tout d'abord, la suppression (ou la mise à jour)
interdite : l'opération est tout simplement refusée (
ex. la suppression de la ligne "MEEA,
Maîtrise EEA" est impossible car des tuples d'ELEVE y font
référence),
Ensuite, la suppression(ou la mise à jour) en cascade:
dans ce mode, lorsqu'un tuple de la table référencée est
supprimé (ou, respectivement, modifié dans ses attributs
clés), tous les tuples dépendants sont aussi supprimés
(resp. modifiés). Par exemple, la suppression du tuple "MEEA,
Maîtrise EEA" entraîne celle des élèves portant les
numéros 0001 et 0003 ; le changement de clé "MEEA" en "MEA"
affecte de la même façon les valeurs de la clé
étrangère pour ces élèves.
Enfin, la suppression avec initialisation: toutes les
clés étrangères égales à la clé
primaire supprimée sont mises à la valeur nulle (
ex. la suppression du tuple "MEEA,
Maîtrise EEA" entraîne la mise à NULL de l'attribut _Class
des élèves portant les numéros 0001 et 0003).
III.7. Bilan du chapitre
L'objet de ce chapitre était de révéler
ce qui fait la singularité des mutations des entreprises vers l'usage
des SGBD. Pour ce faire, nous avons tout d'abord voulu savoir quelle
était la contribution essentielle de l'usage de SGBD dans des
entreprises. C'est pourquoi nous avons examiné les apports et les
limites des différentes conceptions des modèles des
données. Il en est ressorti qu'en dépit de limites de chacun de
ces différentes conceptions des modèles des données, la
modélisation s'articuler avec la valeur du résultat après
chaque conception.
Ces choses étant dites, restait ensuite à
déterminer ce qui caractérise la valeur des attributs dans
chacune des tables pour chaque choix du modèle des données. Pour
y parvenir, nous nous sommes appuyés sur le passage au modèle
relationnel, sa normalisation des relations dans la conception d'une base de
données relationnelle, sa dépendance fonctionnelle et enfin
chuter par la notion d'intégrité structurelle. Il en est
résulté que la notion d'intégrité structurelle
renferme différentes classifications, d'où
l'intégrité référentielle constitue une
synthèse de ces dernières, car, elle impose que chaque valeur
d'une clé étrangère existe comme valeur de la clé
d'identification dans la table référencée.
65
Chapitre IV: Le langage Sql : un manipulateur de bases
de données relationnelles
IV.1. Introduction
Nombre d'études ayant trait au langage SQL (Structured
Query Language) soutiennent que ce langage d'interrogation des données
est par la plupart supporté par des produits commerciaux que ce soit par
les systèmes de gestion de bases de données micro tel que Access
ou par les produits plus professionnels tels que Oracle. Il s'ensuit que ce
langage a fait l'objet de plusieurs normes ANSI/ISO avec une remontée de
la norme SQL2 qui a été définie en 1992. Cependant, il est
considéré comme le langage d'accès normalisé aux
bases de données.
A ce stade de la réflexion, son succès est
dû essentiellement à sa simplicité et au fait qu'il
s'appuie sur le schéma conceptuel pour énoncer des requêtes
en laissant le SGBD responsable de la stratégie d'exécution. Or,
dire cela revient à expliquer que le langage SQL propose un langage de
requêtes ensembliste et assertionnel. Car, par suite, il ne
possède pas la puissance d'un langage de programmation :
entrées/sorties, instructions conditionnelles, boucles et
affectations.
Pour mieux saisir, avec certains traitements, il est donc
nécessaire de coupler le langage SQL avec un langage de programmation
plus complet. De ce fait, il apparaît donc légitime de dire que
SQL est un langage relationnel, il manipule donc des tables (i.e. des
relations, c'est-à-dire des ensembles) par l'intermédiaire de
requêtes qui produisent également des tables. Par ailleurs, s'il
faut considérer les jalons de son trajectoire, d'un côté
disons que les différents produits phares ont évolué,
entre autre la norme SQL est passée à SQL-2, puis SQL-3. Ainsi
voit-on des files d'évolutions d'attentes en continu, SQL est
désormais un langage incontournable pour tout SGBD moderne.
Dans les faits, la réalité est plus complexe,
bien qu'une norme existe, on assiste à une prolifération de
dialectes propres à chaque produit : soit des sous-ensembles de la norme
(certaines fonctionnalités n'étant pas implantées), soit
des sur-ensembles (ajout de certaines fonctionnalités, propres à
chaque produit). Du reste, Oracle et Informix dominent le marché actuel,
SQL-Server (de Microsoft) tente de s'imposer dans le monde des PC sous NT. Avec
ce lissage d'autres produits très chers, on voit exister heureusement
des systèmes libres et gratuits : MySQL et PostgreSQL qui au final sont
les plus connus.
66
De l'autre côté, bien que ces SGBDR n'aient pas
la puissance des produits commerciaux, certains s'en approchent de plus en
plus. Cela dit, les différences notables concernent principalement les
environnements de développement qui sont de véritables ateliers
logiciels sous Oracle et qui sont réduits à des interfaces de
programmation C, Python, Perl sous PostgreSQL. De même, pour les
interfaces utilisateurs : il en existe pour PostgreSQL, mais ils n'ont
certainement pas la puissance de leurs équivalents commerciaux.
Pour notre cas, nous ne présenterons ici que les
fonctionnalités principales de SQL. Il est ici probant que les langages
utilisés dans les bases de données relationnelles se fondent sur
l'algèbre relationnelle et/ou le calcul relationnel. Une fois de plus,
ce dernier, est basé sur la logique des prédicats (expressions
d'une condition de sélection définie par l'utilisateur). On
distinguer 3 grandes classes de langages :
Les langages algébriques,
basés sur l'algèbre relationnelle de CODD, dans lesquels les
requêtes sont exprimées comme l'application des opérateurs
relationnels sur des relations. Le langage SQL, standard pour l'interrogation
des bases de données, fait partie de cette catégorie.
Les langages basés sur le calcul
relationnel de tuples, construits à partir à partir
de la logique des prédicats, et dans lesquels les variables
manipulées sont des tuples (ex. : QUEL, QUEry Language).
Les langages basés sur le calcul
relationnel de domaines, également construit à
partir de la logique des prédicats, mais en faisant varier les variables
sur les domaines des relations.
Toutefois, le langage SQL, est un langage normalisé
permettant :
La définition des éléments
d'une base de données (tables, colonnes, clefs, index,
contraintes, ...),
La manipulation des données
(insertion, suppression, modification, extraction, . . .),
Le contrôle des données (acquisition et
révocation des droits),
L'interrogation de la base (clause
SELECT)
IV.2. Le langage de définition des
données (LDD) [31]
Le langage de définition de données (LDD, ou
Data Definition Language, soit DDL en anglais) est un langage orienté au
niveau de la structure de la base de données. Le LDD permet de
créer, modifier, supprimer des objets. Il permet également de
définir le domaine des données (nombre, chaîne de
caractères, date, booléen, . . .) et d'ajouter des contraintes
de
67
valeur sur les données. Ces choses étant dit, il
permet enfin d'autoriser ou d'interdire l'accès aux données et
d'activer ou de désactiver l'audit pour un utilisateur donné.
Les instructions du LDD sont : CREATE, ALTER, DROP, AUDIT,
NOAUDIT, ANALYZE, RENAME, TRUNCATE.
IV.2.1. Notion aux contraintes
d'intégrité
Soit le schéma relationnel minimaliste suivant : - Acteur
(Num-Act, Nom, Prénom), - Jouer (Num-Act, Num-Film), -
Film (Num-Film, Titre, Année),
1. Contrainte d'intégrité de
domaine
On ne cesse de parler de cette contrainte
d'intégrité de domaine sans expliquer la cause. Toute comparaison
d'attributs n'est acceptée que si ces attributs sont définis sur
le même domaine. Le SGBD doit donc constamment s'assurer de la
validité des valeurs d'un attribut. C'est pourquoi la commande de
création de table doit préciser, en plus du nom, le type de
chaque colonne.
Par exemple, pour la table Film, on précisera que le
Titre est une chaîne de caractères et l'Année une date.
Lors de l'insertion de n-uplets dans cette table, le système s'assurera
que les différents champs du n-uplet satisfont les contraintes
d'intégrité de domaine des attributs précisées lors
de la création de la base. Si les contraintes ne sont pas satisfaites,
le n-uplet n'est, tout simplement, pas inséré dans la table.
2. Contrainte d'intégrité de relation (ou
d'entité)
Ces choses étant dites, lors de l'insertion de
n-uplets dans une table (i.e. une relation), il arrive qu'un attribut soit
inconnu ou non défini. On introduit alors une valeur conventionnelle
notée NULL et appelée valeur nulle.
Cependant, une clé primaire ne peut avoir une valeur
nulle. De la même manière, une clé primaire doit toujours
être unique dans une table. Cette contrainte forte qui porte sur la
clé primaire est appelée contrainte d'intégrité de
relation.
Il convient de noter que tout SGBD relationnel doit
vérifier l'unicité et le caractère défini (NOT
NULL) des valeurs de la clé primaire.
3. Contrainte d'intégrité de
référence
Dans tout schéma relationnel, il existe deux types de
relation :
? Les relations qui représentent des entités de
l'univers modélisé ; elles sont qualifiées de statiques,
ou d'indépendantes ; les relations Acteur et Film en sont des exemples
;
68
? Les relations dont l'existence des n-uplets dépendent
des valeurs d'attributs situées dans d'autres relations ; il s'agit de
relations dynamiques ou dépendantes ; la relation Jouer en est un
exemple.
--Lors de l'insertion d'un n-uplet dans la relation Jouer, le
SGBD doit vérifier que les valeurs Num-Act et Num-Film correspondent
bien, respectivement, à une valeur de Num-Act existant dans la relation
Acteur et une valeur Num-Film existant dans la relation Film.
--Lors de la suppression d'un n-uplet dans la relation Acteur,
le SGBD doit vérifier qu'aucun n-uplet de la relation Jouer ne fait
référence, par l'intermédiaire de l'attribut Num-Act, au
n-uplet que l'on cherche à supprimer. Le cas échéant,
c'est-à-dire si une, ou plusieurs, valeur correspondante de Num-Act
existe dans Jouer, quatre possibilités sont envisageables :
? interdire la suppression ;
? supprimer également les n-uplets concernés dans
Jouer ;
? avertir l'utilisateur d'une incohérence ;
? mettre les valeurs des attributs concernés à une
valeur nulle dans la table Jouer,
si l'opération est possible (ce qui n'est pas le cas si
ces valeurs interviennent dans une clé primaire) ;
Les types de données
Les types de données peuvent être :
INTEGER : Ce type permet de stocker des entiers signés
codés sur 4 octets.
BIGINT : Ce type permet de stocker des entiers signés
codés sur 8 octets.
REAL : Ce type permet de stocker des réels comportant 6
chiffres significatifs codés sur 4 octets.
DOUBLE PRECISION : Ce type permet de stocker des réels
comportant 15 chiffres significatifs codés sur 8 octets.
NUMERIC[(précision, [longueur])] : Ce type de
données permet de stocker des données numériques à
la fois entières et réelles avec une précision de 1000
chiffres significatifs. longueur précise le nombre maximum de chiffres
significatifs stockés et précision donne le nombre maximum de
chiffres après la virgule.
CHAR(longueur) : Ce type de données permet de stocker des
chaînes de caractères de longueur fixe. longueur doit être
inférieur à 255, sa valeur par défaut est 1.
VARCHAR(longueur) : Ce type de données permet de stocker des
chaînes de caractères de longueur variable. longueur doit
être inférieur à 2000, il n'y a pas de valeur par
défaut. DATE : Ce type de données permet de stocker des
données constituées d'une date.
69
TIMESTAMP : Ce type de données permet de
stocker des données constituées d'une date et
d'une heure.
BOOLEAN : Ce type de données permet de
stocker des valeurs Booléenne.
MONEY : Ce type de données permet de
stocker des valeurs monétaires.
TEXT : Ce type de données permet des
stocker des chaînes de caractères de longueur variable.
IV.2.2. Créer une table : CREATE TABLE
1. Généralités
Une table est un ensemble de lignes et de colonnes. La
création consiste à définir (en fonction de l'analyse) le
nom de ces colonnes, leur format (type), la valeur par défaut à
la création de la ligne (DEFAULT) et les règles de gestion
s'appliquant à la colonne (CONSTRAINT).
2. Création simple
Certes, la commande de création de table la plus simple ne
comportera que le nom et le type de chaque colonne de la table. A la
création, la table sera vide, mais un certain espace lui sera
alloué. La syntaxe est la suivante :
CREATE TABLE nom_table (nom_col1 TYPE1, nom_col2 TYPE2,
...)
La commande CREATE TABLE permet de
définir une table, avec ses colonnes et ses contraintes :
CREATE TABLE nom_table {colonne|contrainte},
{colonne|contrainte_tbl}, ...
Soit, colonne définit à la fois le nom
de la colonne, mais aussi son type, sa valeur par défaut et ses
éventuelles contraintes de colonne (la colonne peut en effet accepter ou
non les valeurs nulles, certaines valeurs de validation, les doublons, ou bien
être une clé primaire ou étrangère) :
colonne:: nom_colonne {type|domaine} [DEFAULT val_default]
[contrainte_col] contrainte_col:: [NOT] NULL | CHECK (prédicat) | UNIQUE
| PRIMARY KEY | FOREIGN KEY [colonne] REFERENCES table(colonne)
spécif_référence
et où les contraintes de table permettent de
définir une clé multi-colonnes ainsi que des contraintes portant
sur plusieurs colonnes (unicité globale, validation multi-attributs ou
intégrité référentielle) :
contrainte_tbl:: CONSTRAINT nom_contrainte
{PRIMARY KEY (liste_cols) | UNIQUE | CHECK (prédicat_tbl)
| FOREIGN KEY (liste_cols) REFERENCES table(liste_cols)
spécif_référence}
70
Il sied de préciser que quand on crée une table, il
faut définir les contraintes d'intégrité que devront
respecter les données que l'on mettra dans la table.
Cas pratique : Si l'on souhaite imposer
les contraintes suivantes à la table Employés :
- les valeurs de département doivent appartenir à
l'intervalle 10..100
- les fonctions sont forcément 'Directeur', 'Analyste',
'Technicien', 'Commercial' ou 'President' - tout employé embauché
après 1986 doit gagner plus de 1000€
IV.2.3. Modifier une table : ALTER TABLE
La commande ALTER TABLE permet de modifier la
définition d'une table en y ajoutant ou en supprimant une colonne ou une
contrainte (mais elle ne permet pas de changer le nom ou le type d'une colonne,
ni d'ajouter une contrainte de ligne [NOT]NULL) :
ALTER TABLE nom_table {
ADD definition_colonne |
ADD CONSTRAINT definition_contrainte |
ALTER nom_colonne {SET DEFAULT valeur_def|DROP DEFAULT} |
DROP nom_colonne [CASCADE|RESTRICT] |
DROP CONSTRAINT nom_contrainte [CASCADE|RESTRICT] };
L'option CASCADE / RESTRICT permet de gérer
l'intégrité référentielle de la colonne ou la
contrainte.
Ajout ou modification de colonnes
ALTER TABLE nom_table {ADD/MODIFY} ([nom_colonne type
[contrainte], ...])
Cas pratique: Modifier la définition de
la table Employés pour que le salaire total dépasse
forcément 1000€ :
ALTER TABLE employes ADD CONSTRAINT ChkSalTot CHECK (salaire+comm
> 1000)
Ajout d'une contrainte de table
ALTER TABLE nom_table ADD [CONSTRAINT nom_contrainte]
contrainte
La syntaxe de déclaration de contrainte est identique
à celle vue lors de la création de table.
71
Si des données sont déjà présentes
dans la table au moment où la contrainte d'intégrité
est
ajoutée, toutes les lignes doivent vérifier la
contrainte. Dans le cas contraire, la contrainte
n'est pas posée sur la table.
Renommer une colonne
ALTER TABLE nom_table RENAME COLUMN ancien_nom TO nouveau_nom
Renommer une table
ALTER TABLE nom_table RENAME TO nouveau_nom
IV.2.4. Supprimer une table : DROP TABLE
La commande DROP TABLE permet de supprimer la
définition d'une table et, dans le même temps, de tout son contenu
et des droits d'accès des utilisateurs à la table (à
utiliser avec précaution, donc !) :
La syntaxe est la suivante :
DROP TABLE nom_table
IV.3. Le langage de manipulation des données
(LMD)
Le langage de manipulation de données (LMD, ou Data
Manipulation Language, soit DML en anglais) est l'ensemble des commandes
concernant la manipulation des données dans une base de données.
Le LMD permet l'ajout, la suppression et la modification de lignes, la
visualisation du contenu des tables et leur verrouillage [30].
Les instructions du LMD sont : INSERT, UPDATE, DELETE, SELECT,
EXPLAIN, PLAN, LOCK TABLE.
Ces éléments doivent être validés par
une transaction pour qu'ils soient pris en compte.
IV.3.1. Insertion de n-uplets : INSERT INTO
La commande INSERT permet d'insérer une ligne dans une
table en spécifiant les valeurs à insérer.
La syntaxe est la suivante :
INSERT INTO nom_table(nom_col_1, nom_col_2, ...) VALUES (val_1,
val_2, ...)
La liste des noms de colonne est optionnelle. Si elle est
omise, la liste des colonnes sera par défaut la liste de l'ensemble des
colonnes de la table dans l'ordre de la création de la table. Si une
liste de colonnes est spécifiée, les colonnes ne figurant pas
dans la liste auront la valeur NULL.
72
Il est possible d'insérer dans une table des lignes
provenant d'une autre table. La syntaxe est
la suivante :
INSERT INTO nom_table(nom_col1, nom_col2, ...)
SELECT ...
L'instruction SELECT sera développer dans les sections
suivantes surtout avec la partie LCD.
IV.3.2. Modification de n-uplets : UPDATE
La commande UPDATE permet de modifier les valeurs d'une ou
plusieurs colonnes, dans une ou plusieurs lignes existantes d'une table. La
syntaxe est la suivante :
UPDATE nom_table
SET nom_col_1 = {expression_1 | ( SELECT ...) }, nom_col_2 =
{expression_2 | ( SELECT ...) },
...
nom_col_n = {expression_n | ( SELECT ...) } WHERE predicat
Les valeurs des colonnes nom_col_1, nom_col_2, ..., nom_col_n
sont modifiées dans toutes les lignes qui satisfont le prédicat.
En l'absence d'une clause WHERE, toutes les lignes sont mises à jour.
Les expressions expression_1, expression_2, ..., expression_n peuvent faire
référence aux anciennes valeurs de la ligne.
IV.3.3. Suppression de n-uplets : DELETE
La commande DELETE permet de supprimer des lignes d'une table. La
syntaxe est la suivante :
DELETE FROM nom_table WHERE predicat
Toutes les lignes pour lesquelles predicat est
évalué à vrai sont supprimées. En l'absence de
clause WHERE, toutes les lignes de la table sont supprimées.
IV.4. Le langage de contrôle des données
(LDC)
Le langage de protections d'accès (ou Data Control
Language, soit DCL en anglais) s'occupe de gérer les droits
d'accès aux tables [25].
Les instructions du DCL sont : GRANT, REVOKE.
La protection des données consiste à identifier
les utilisateurs et gérer les autorisations d'accès. Pour cela,
une mesure fondamentale est de ne fournir aux utilisateurs qu'un accès
aux tables ou aux parties de tables nécessaires à leur travail,
ce que l'on appelle des vues. Grâce à elles, chaque utilisateur
pourra avoir sa vision propre des données. Une vue
73
est définie en SQL grâce à la commande
CREATE VIEW comme résultat d'une requête d'interrogation
SELECT:
CREATE VIEW nom_vue AS SELECT ...
Cas pratique: Créer une vue
constituant une restriction de la table Employés aux noms et salaire des
employés du département 10 :
CREATE VIEW emp10 AS SELECT nom, salaire FROM employes WHERE
_num_dep = 10;
Avec ce cas pratique, il n'y a pas de duplication des
informations, mais le stockage de la définition de la vue. Une fois
créée, la vue peut être interrogée exactement comme
une table. Les utilisateurs pourront consulter la base à travers elle,
c'est-à-dire manipuler la table résultat du SELECT comme s'il
s'agissait d'une table réelle.
En revanche, il existe deux restrictions à la
manipulation d'une vue par un INSERT ou un UPDATE :
Le SELECT définissant la vue ne doit pas comporter de
jointure ;
Les colonnes résultats du SELECT doivent être des
colonnes réelles et non pas des expressions.
Cas pratique: Augmentation de 10% des
salaires du département10 à travers la vue Emp10 :
UPDATE emp10 SET salaire=salaire*1.1;
Une vue peut être supprimée ou renommée par
les commandes :
DROP VIEW nom_vue ouRENAME ancien_nom TO nouveau_nom
Une protection efficace des données nécessite en
outre d'autoriser ou d'interdire certaines opérations, sur les tables ou
les vues, aux différentes catégories d'utilisateurs. Les
commandes correspondantes sont :
GRANT type_privilege1, type_privilege2,... ON {table|vue|*} TO
utilisateur; REVOKE type_privilege1, type_privilege2,... ON {table|vue|*}FROM
utilisateur;
Les types de privilèges correspondent aux commandes SQL
(SELECT pour la possibilité d'interroger, UPDATE pour celle de mise
à jour, etc.) et les utilisateurs concernés sont
désignés par leur identifiant de connexion au serveur, ou par le
mot-clé PUBLIC pour désigner tous les utilisateurs.
Cas pratique: Autoriser la
suppression de la vue Emp10 au seul représentant du personnel
identifié par ID7788:
GRANT DELETE ON emp10 TO ID7788;
Gestion des transactions. Une transaction est un ensemble de
modifications de la base qui forment un tout indivisible, qu'il faut effectuer
entièrement ou pas du tout, sous peine de laisser la base dans un
état incohérent. SQL permet aux utilisateurs de gérer
leurs transactions:
74
la commande COMMIT permet de valider une
transaction. Les modifications deviennent définitives et visibles
à tous les utilisateurs [23];
la commande ROLLBACK permet à tout
moment d'annuler la transaction en cours. Toutes les modifications
effectuées depuis le début de la transaction sont alors
défaites [23].
Enfin, pour assurer ainsi l'intégrité de la base
en cas d'interruption anormale d'une tâche utilisateur, les SGBD dits
transactionnels utilisent un mécanisme de verrouillage qui empêche
deux utilisateurs d'effectuer des transactions incompatibles.
IV.5. Interroger une base de données
IV.5.1. Notion de base
S'il est clairement établi dans certaines des sections
de cette partie, la commande SELECT constitue, à elle
seule, le langage d'interrogation d'une base. A cela, elle permet de:
Sélectionner certaines colonnes d'une table
(opération de projection) ;
Sélectionner certaines lignes d'une table en fonction de
leur contenu (restriction) ; Combiner des informations venant de plusieurs
tables (jointure, union, intersection, différence) ;
Combiner ces différentes opérations ;
Une interrogation, ou requête de sélection, est
une combinaison d'opérations portant sur des tables et dont le
résultat est lui-même une table, mais
éphémère ou dynamique (car elle n'existe que le temps de
la requête).
Dans ce qui suit, nous utiliserons les conventions typographiques
suivantes :
en MAJUCULES les commandes ou opérateurs qu'il faut
recopier tels quels (ex. SELECT)
en italique les paramètres devant être
remplacés par une valeur appropriée (ex. table, alias) en
souligné la valeur par défaut (ex. {ASC|DESC})
des crochets [...] encadrent une valeur optionnelle (ex.
[DISTINCT], [AS alias]) des accolades {...} encadrent des valeurs
(séparées par | ) dont l'une doit être saisie (ex.
{ON|OFF})
des points de suspension ... indiquent que les valeurs
précédentes peuvent être répétées
plusieurs fois (ex. table, ...peut prendre comme valeur table1, table2,
table3)
75
les signes de ponctuation (parenthèses, virgules et
points-virgules) doivent être saisis comme présentés. En
particulier, ne pas oublier le point-virgule obligatoire
à la fin de chaque requête.
Par ailleurs, on désigne par:
alias un synonyme d'un nom de table, de
colonne, ou d'expression calculée
condition une expression prenant la
valeur vrai ou faux
sous-interrogation(ou
sous-requête) une expression de requête (SELECT) figurant
dans une clause WHERE d'une requête principale
expr une colonne ou un attribut
calculé par une expression
num un numéro de colonne
Enfin, dans ce qui suit, nous illustrerons les requêtes sur
une base formée des relations suivantes :
Employes(numemp,nom,fonction,_superieur,date_embauche,salaire,comm,_num_dep)
Departements(num_dep,nom,ville)
76
IV.5.2. Syntaxe de base
La syntaxe de base de la commande SELECT est la suivante :
Les attributs sont les colonnes que l'on souhaite
voir apparaître dans la réponse. Si l'on souhaite toutes les
colonnes, il faut utiliser le symbole*.
Cas pratique :
Nous avons aussi la possibilité de faire
précéder les noms des attributs de la table où ils
figurent. Cela est obligatoire si l'on extraie les données de plusieurs
tables et que deux attributs sélectionnés portent le même
nom :
SELECT employes.nom, departements.nom FROM employes,
departements;
Il est également possible de renommer une colonne ou
une table par un alias, ce qui est utile lorsqu'on veut donner un nom plus
« parlant » ou plus court pour faciliter sa désignation
ultérieurement dans la requête.
Pour renommer une colonne, on utilise la syntaxe Col1 AS
'Nouveau nom' dans le SELECT (les guillemets ne sont obligatoires que si
l'alias comporte des espaces ou des caractères spéciaux). Pour
renommer une table, il suffit de faire suivre son nom par son alias dans la
clause FROM :
Ceci est particulièrement utile lorsque l'on
définit un attribut calculé à
partir des attributs de tables. Il est en effet possible de faire figurer comme
résultat d'un SELECT une expression composée d'opérateurs,
de fonctions prédéfinies, de variables et de constantes :
La clause WHERE permet de
spécifier quelles sont les lignes à sélectionner. Le
prédicat de sélection, formé d'une expression comportant
des opérandes liés par des opérateurs, sera
évalué pour chaque ligne de la table, et seules les lignes pour
lesquelles il est vrai seront retenues.
77
Les opérandes figurant dans le prédicat peuvent
être des noms de colonnes, ou des constantes de type :
nombres : peuvent inclure un signe, un point décimal et
une puissance de dix (ex. - 1.2E-5)
chaînes : chaînes de caractères entre
apostrophes (Attention : 'Victor' ?'VICTOR') dates : chaînes de
caractères entre apostrophes dans un format spécial. Pour
s'affranchir des problèmes inhérents aux incompatibilités
dans les différentes langues, il est conseillé d'utiliser le
format suivant : 'aaaa-mm-jj' (ex. {d '2001-1031'})
la valeur NULL (valeur non définie), que l'on doit tester
avec l'opérateur IS, et pas = (cf. ci-dessous).
Les opérateurs figurant dans le prédicat peuvent
être :
les opérateurs de comparaison traditionnels (=
(égal), <> (différent de), <, <=, >, >=) les
opérateurs spéciaux
? BETWEEN ... AND (valeur comprise entre 2 bornes) : expr1
BETWEEN expr2
AND expr3
? IN (valeur comprise dans une liste) : expr1 IN (expr2, expr3,
...)
? LIKE (chaîne semblable à une chaîne
générique) : expr1 LIKE chaine
La chaîne générique peut comporter les
caractères jokers `_' (remplace 1 seul caractère quelconque) et
`%' (remplace une chaîne de caractères quelconque, y compris de
longueur nulle)
les opérateurs logiques AND, OR et NOT (inversion logique)
pour combiner plusieurs prédicats.
Des parenthèses peuvent être utilisées
pour impose rune priorité dans l'évaluation du prédicat
(par défaut, l'opérateur AND est prioritaire par rapport à
OR).
Cas pratique :
Employés dont la commission est supérieure au
salaire
SELECT nom, salaire, comm FROM employes WHERE comm >
salaire;
Employés gagnant entre 1700 et 2550€
SELECT nom, salaire FROM employes WHERE salaire BETWEEN 1700 AND
2550;
78
Employés commerciaux ou analystes
SELECT num_emp, nom, fonction FROM employes WHERE fonction IN
('Commercial', 'Analyste');
Employés dont le nom commence par V
SELECT nom FROM employes WHERE nom LIKE 'M%';
Employés du département 30 ayant un salaire
supérieur à 2700 €
SELECT nom FROM employes WHERE _num_dep=30 AND
salaire>2700;
Employés directeurs ou commerciaux travaillant dansle
département 10
SELECT nom, fonction FROM employes
WHERE (fonction='Directeur' OR fonction ='Commercial') AND
_num_dep=10;
Employés percevant une commission
SELECT nom, salaire, comm FROM employes WHERE comm IS NOT
NULL;
IV.5.3. Les jointures
On appelle jointure une opération permettant de
combiner des informations issues de plusieurs tables. Elle se formule
simplement en spécifiant, dans la clause FROM , le nom des tables
concernées et, dans la clause WHERE, les conditions qui vont permettre
de réaliser la jointure (en effet, si l'on ne précise pas de
condition de sélection, on obtient le produit cartésien des
tables présentes derrière le FROM, ce qui n'est en
général pas souhaité).
Or, structurellement, il existe plusieurs types de jointures
(cfr. figure IV.1) :
Equi-jointure (ou jointure naturelle, ou jointure
interne) : permet de relier deux colonnes appartenant à
deux tables différentes mais ayant le même "sens" et venant
vraisemblablement d'une relation 1-N lors de la conception. Les tables sont
reliées par une relation d'égalité entre leur attribut
commun ou, à partir de SQL2, avec la clause INNER JOIN.
Cas pratique : Donner le nom de chaque
employé et la ville où il/elle travaille
SELECT employes.nom, Ville FROM employes, departements WHERE
employes._num_dep=departements.num_dep;
ou
SELECT employes.nom, departements.ville FROM employes
79
INNER JOIN departements ON employes._num_dep =
departements.num_dep;
Auto-jointure: cette jointure d'une
table à elle-même permet derelier des informations venant d'une
ligne d'une table avec des informations venant d'une autre ligne de la
même table. Dans ce cas, il faut renommer au moins l'une des deux
occurrences de la table pour pouvoir préfixer sans ambiguïté
chaque nom de colonne.
Cas pratique : Donner pour chaque
employé le nom de son supérieur hiérarchique
SELECT employes.nom, superieurs.nom FROM employes, employes AS
superieurs WHERE employes._superieur=superieurs.num_emp;
ou
SELECT employes.nom, superieurs.nom FROM employes INNER JOIN
employes AS superieurs
ON employes._superieur=superieurs.num_emp;
O-jointure: si le critère
d'égalité correspond à la jointure la plus naturelle, les
autres opérateurs de comparaison sont également utilisables dans
le prédicat de jointure. Néanmoins, cette possibilité doit
être utilisée avec précaution car elle peut entraîner
une explosion combinatoire (on rappelle qu'une jointure ne constitue qu'une
restriction du produit cartésien de deux relations ou plus).
Cas pratique : Quels sont les
employés gagnant plus que Victor ?
SELECT e1.nom, e1.salaire, e1.fonction FROM employes AS e1,
employes AS e2 WHERE e1.salaire>e2.salaire AND e2.nom='Victor';
Jointure externe: lorsqu'une ligne
d'une table figurant dans une jointure n'a pas de correspondant dans les autres
tables, elle ne satisfait pas au critère d'équi-jointure et ne
figure donc pas dans le résultat de la requête. Une jointure
externe est une jointure qui favorise l'une des tables en affichant toutes ses
lignes, qu'il y ait ou non correspondance avec l'autre table de jointure. Les
colonnes pour lesquelles il n'y a pas de correspondance sont remplies avec la
valeur NULL. Pour définir une telle jointure, on utilise les clauses
LEFT OUTER JOIN (jointure externe gauche) et RIGHT OUTER JOIN (jointure externe
droite).
Cas pratique : Le département
de Cambridge n'apparaissait pas dans l'exemple de l'équi-jointure, mais
figurera ici :
SELECT employes.nom, departements.ville FROM employes
RIGHT JOIN departements ON employes._num_dep =
departements.num_dep;
Cas pratique : Le Président
Patton, sans supérieur hiérarchique, n'apparaissait pas dans
l'exemple de l'autojointure, mais figurera ici (avec NULL comme nom
desupérieur) :
80
SELECT employes.nom, superieurs.nom FROM employes
LEFT JOIN employes AS superieurs ON
employes._superieur=superieurs.num_emp;
Cas pratique : Retrouver les
départements n'ayant aucun employé :
SELECT departements.num_dep, employes.nom FROM employes
RIGHT JOIN departements ON employes._num_dep =
departements.num_dep WHERE employes.nom IS NULL;
Equi-jointure Auto-jointure Jointure externe
Figure IV.1. Les différents types de
jointures
IV.5.4. Les fonctions de groupes
Ces choses étant dites, dans les exemples
précédents, chaque ligne résultat d'un SELECT était
calculée sur les valeurs d'une seule ligne de la table consultée.
Il existe un autre type de SELECT qui permet d'effectuer des calculs sur
l'ensemble des valeurs d'une colonne, au moyen de l'une des
fonctions de groupe suivantes (toutes portent sur une expression,
qui peut-être un attribut d'une table ou un attribut calculé) :
SUM(expr) Somme des valeurs
AVG(expr) Moyenne des valeurs
COUNT([DISTINCT] expr) Nombre de valeurs (différentes
si
DISTINCT est présent)
COUNT(*) Compte toutes les lignes de la table
MIN(expr) ouMAX(expr) Minimum ou maximum des valeurs
VARIANCE(expr) ouSTDDEV(expr) Variance ou écart-type des
valeurs Cas pratique : Donner le total des salaires
des employés travaillant dans le département 10 :
SELECT SUM(salaire) AS som_salaires FROM employes WHERE
_num_dep=10;
Calcul de résultats sur plusieurs
groupes. Il est possible de subdiviser la table en
groupes, chaque groupe étant l'ensemble des
lignes ayant une valeur commune pour les expressions spécifiées.
C'est la clause GROUP BY qui permet de découper la table en plusieurs
groupes :
81
GROUP BY expr1, expr2, ...
Si l'on en tient compte du regroupement suivant une seule
expression, ceci définit les groupes comme les ensembles de lignes pour
lesquelles cette expression prend la même valeur. Si plusieurs
expressions sont présentes, le groupement va s'effectuer d'abord sur la
première, puis sur la seconde, et ainsi de suite : parmi toutes les
lignes pour lesquelles expr1prend la même valeur, on regroupe celles
ayant expr2identique, etc. Un SELECT de groupe avec une clause GROUP BY donnera
une ligne résultat pour chaque groupe.
Cas pratique : Donner le total des
salaires des employés pour chaque département :
SELECT_num_dep,SUM(salaire)AS som_salaires FROM employes GROUP BY
_num_dep;
Sélection des groupes. De
même que la clause WHERE permet de sélectionner certaines lignes,
il est possible de ne retenir, dans un SELECT comportant une fonction de
groupe, que les lignes répondant à un critère donné
par la clause HAVING. Cette clause se place après la clause GROUP BY et
son prédicat suit les mêmes règles de syntaxe que celui de
la clause WHERE, à la différence près qu'il ne peut porter
que sur des caractéristiques du groupe (fonction de groupe ou expression
figurant dans la clause GROUP BY).
Cas pratique : Donner la liste des
salaires moyens par fonction pour les groupes ayant plus de 2 employés
:
SELECT fonction, COUNT(*) AS nb_employes, AVG(salaire) AS
moy_salaires FROM employes GROUP BY fonction HAVING COUNT(*)>2;
Retenons que :
Dans la liste des colonnes résultat d'un SELECT
comportant une fonction de groupe, ne peuvent figurer que des
caractéristiques de groupe, c'est-à-dire soit des fonctions de
groupe, soit des expressions figurant dans la clause GROUP BY. En effet, de
manière générale, lorsqu'un attribut est
sélectionné dans une clause SELECT, le résultat peut
comporter de zéro à n valeurs ; cela pourrait provoquer des
conflits si l'on utilisait conjointement des fonctions statistiques qui, elles,
ne retournent qu'une seule valeur.
Un SELECT de groupe peut contenir à la fois les clauses
WHERE et HAVING. La première sera d'abord appliquée pour
sélectionner les lignes, puis les fonctions de groupe seront
évaluées, et les groupes ainsi constitués seront
sélectionnés suivant le prédicat de la clause HAVING.
82
Cas pratique : Pour les
départements comportant au moins 2 employés techniciens ou
commerciaux, donner le nombre de ces employés par département
:
SELECT _num_dep, COUNT(*) AS nb_techn_ou_comm FROM employes WHERE
fonction in('Technicien','Commercial')
GROUP BY _num_dep HAVING COUNT(*)>=2;
- Un SELECT de groupe peut être utilisé dans une
sous-interrogation ; inversement, une clause HAVING peut comporter une
sous-interrogation.
IV.5.5. Sous-interrogations
Nous pouvons dire, qu'une caractéristique puissante de
SQL est la possibilité qu'un critère de recherche employé
dans une clause WHERE (expression à droite d'un opérateur de
comparaison) soit lui-même le résultat d'un SELECT ; c'est ce que
l'on appelle une sous-interrogation ou un
SELECT imbriqué. Cela permet de
réaliser des interrogations complexes qui nécessiteraient sinon
plusieurs interrogations avec stockage des résultats
intermédiaires.
Un SELECT peut retourner de zéro
à n lignes comme résultat. On a donc les cas suivants :
Une sous-interrogation ne retournant aucune ligne se termine
avec un code d'erreur, à moins d'utiliser l'opérateur EXISTS qui
retourne faux dans ce cas, vrai si la
sous-interrogation retourne au moins une ligne. Cet opérateur permet
d'empêcher l'exécution de l'interrogation principale si la sous
interrogation ne retourne aucun résultat, mais s'emploie surtout avec
les sous-interrogations synchronisées.
Cas pratique: Donner la liste des
noms et salaires des employés si un des salaires est inférieur
à 1000 :
SELECT nom, salaire FROM employes
WHERE EXISTS(SELECT * FROM employes WHERE salaire<1000);
Si le résultat d'une sous-interrogation ne
comportequ'une seule ligne, il peut être utilisé directement avec
les opérateurs de comparaison classiques.
Cas pratique : Donner le nom des
employés exerçant la même fonction que Victor :
SELECT nom FROM employes
WHERE fonction =(SELECT fonction FROM employes WHERE
nom='Victor');
Une sous-interrogation peut retourner plusieurs lignes
à condition que l'opérateur de comparaison admette à sa
droite un ensemble de valeurs. Les opérateurs permettant de comparer une
valeur à un ensemble de valeurs sont :
83
Tableau IV.1. Les opérateurs de comparaison d'une
valeur à un ensemble de valeurs Cas pratique:
Donner la liste des employés gagnant plus que tous ceux du
département 30 :
SELECT nom, salaire FROM employes
WHERE salaire > ALL(SELECT salaire FROM employes WHERE
_num_dep=30);
Sous-interrogation synchronisée avec l'interrogation
principale. Dans les exemples précédents, la sous-interrogation
était évaluée d'abord, puis son résultat
était utilisé pour exécuter l'interrogation principale.
SQL sait également traiter une sous-interrogation faisant
référence à une colonne de la table de l'interrogation
principale. Dans ce cas, le traitement est plus complexe car il faut
évaluer la sous interrogation pour chaque ligne de l'interrogation
principale.
Cas pratique: Donner la liste des
employés ne travaillant pas dans le même département que
leur supérieur :
SELECT nom FROM employes e
WHERE _num_dep<>(SELECT _num_dep FROM employes WHERE
e._superieur=num_emp)
AND _superieur IS NOT NULL;
Il a fallu ici renommer la table Employes de l'interrogation
principale pour pouvoir la référencer sans ambiguïté
dans la sous-interrogation. La dernière ligne est utile car le
président ne possède pas de supérieur (valeur NULL) et la
sous-interrogation ne retourne alors aucune valeur.
Cas pratique: Donner les
employés des départements qui n'ont pas embauché depuis le
début de l'année 1982 :
SELECT * FROM employes e
WHERE NOT EXISTS(SELECT * FROM employes WHERE
date_embauche>=to_date('01/01/1982','DD-MM-YYYY') AND
_num_dep=e._num_dep);
IV.5.6. Bilan de l'instruction SELECT : syntaxe
étendue
La syntaxe étendue de l'instruction SELECT est la suivante
:
SELECT (DISTINCT] {* | expr (AS alias],
... } FROM table (alias], ...
(WHERE { conditions | sous
conditions} ] (GROUP BY expr, ...] (HAVING
conditions]
84
[ORDER BY {expr | num}{ASC |
DESC}, ...];
Tableau IV.2. Récapitulatif des différentes
clauses
IV.6. Bilan du chapitre
Au cours de ce chapitre, nous avons présenté les
fonctionnalités principales de SQL au sein d'un SGBD. En effet, il en
est résulté que le langage SQL est un langage normalisé
d'interrogation de bases de données très répandu qui
permet de manipuler assez facilement les bases des données
relationnelles. Il vient d'être montré que le Structured Query
Language est très variable bien qu'il ait été
normalisé deux fois. Sur le plan pratique, il permet d'ajouter des
données, de les supprimer, parfois par tables entières, de les
sélectionner dans des tables, selon toutes sortes de critères
(Order by, Group by, Where...) par-delà grâce à ses
instructions.
Néanmoins avant cela, il nous a été du
reste à examiner la commande SELECT avec ses différentes clauses
qui implique une interrogation et une standardisation des différents
langages, bien qu'ils soient (d'interrogation, de manipulation, de
définition et de contrôle).
85
Chapitre V: Le Sql intégré : un paquetage
de Sql Embarqué
V.1. Introduction
Cet aparté étant terminé, revenons
à présent sur le SQL intégré. Rappelons que SQL
intégré permet d'utiliser SQL dans un langage de troisième
génération (C, Java, Cobol, etc.) avec un(e) :
déclaration d'objets ou d'instructions ;
exécution d'instructions ;
gestion des variables et des curseurs ; traitement
des erreurs.
Bien qu'essentielle, les sections de ce chapitre décrit
le pacquage SQL embarqué pour PostgreSQL ECPG. Il est compatible avec
les langages C et C++ et a été développé par Linus
Tolke et Michael Meskes.
En approfondissant cette idée, un programme SQL
embarqué est en fait un programme ordinaire, dans notre cas un programme
en langage C, dans lequel nous insérons des commandes SQL incluses dans
des sections spécialement marquées. La description des
instructions Embedded SQL commencent par les mots EXEC SQL et se terminent par
un point-virgule (« ; »). Pour générer
l'exécutable, le code source est d'abord traduit par le
préprocesseur SQL qui convertit les sections SQL en code source C ou
C++, après quoi il peut être compilé de manière
classique.
Nous pouvons noter que le SQL embarqué présente
des avantages par rapport à d'autres méthodes pour prendre en
compte des commandes SQL dans du code C. comme par exemple, le passage des
informations de et vers les variables du programme C est entièrement
pris en charge. Ensuite, le code SQL du programme est vérifié
syntaxiquement au moment de la précompilation. Enfin, le SQL
embarqué en C est spécifié dans le standard SQL et
supporté par de nombreux systèmes de bases de données SQL.
L'implémentation PostgreSQL est conçue pour correspondre à
ce standard autant que possible, afin de rendre le code facilement portable
vers des SGBD autre que PostgreSQL.
Comme situation alternative au SQL intégré, on
peut citer l'utilisation d'une API (Application Programming Interface)
permettant au programme de communiquer directement avec le SGBD via des
fonctions fournies par l'API. Dans ce cas de figure, il n'y a pas de
précompilation à effectuer [32].
86
V.2. Connexion au serveur de bases de
données
Il en est de même pour le langage utilisé (C, Java,
PHP, etc.), pour pouvoir effectuer un traitement sur une base de
données, il faut respecter les étapes suivantes :
1. établir une connexion avec la base de
données ;
2. récupérer les informations
relatives à la connexion ;
3. effectuer les traitements désirés
(requêtes ou autres commandes SQL) ;
4. fermer la connexion avec la base de
données.
Mais ce qui va nous intéresser tout
particulièrement ici, c'est comment ouvrir et fermer une connexion, et
nous verrons dans les sections suivantes comment effectuer des traitements.
A. Ouverture de connexion
La connexion à une base de données se fait en
utilisant l'instruction suivante :
La cible peut être spécifiée de l'une des
façons suivantes :
- nom_base[@nom_hôte ][:port] ;
- tcp:postgresql://nom_hôte [:port ] [/nom_base][? options]
;
- unix:postgresql://nom_hôte[: port][/nom_base ][? options]
;
- une chaîne SQL littérale contenant une des formes
ci-dessus ;
- une référence à une variable contenant une
des formes ci-dessus ;
- DEFAULT.
D'une manière réelle, utiliser une chaîne
littérale (entre guillemets simples) ou une variable
de référence génère moins d'erreurs.
La cible de connexion DEFAULT initie une connexion
sur la base de données par défaut avec
l'utilisateur par défaut. Aucun nom d'utilisateur ou
nom de connexion ne pourrait être spécifié
isolément dans ce cas.
Il existe également différentes façons de
préciser l'utilisateur utilisateur :
- nom_utilisateur
- nom_utilisateur/ mot_de_passe
- nom_utilisateur IDENTIFIED BY mot_de_passe
- nom_utilisateur USING mot_de_passe
nom_utilisateur et mot_de_passe peuvent être un
identificateur SQL, une chaîne SQL
littérale ou une référence à une
variable de type caractère.
nom_connexion est utilisé pour gérer plusieurs
connexions dans un même programme.
Il peut être omis si un programme n'utilise qu'une seule
connexion. La dernière connexion
87
ouverte devient la connexion courante, utilisée par
défaut lorsqu'une instruction SQL est à exécuter.
B. Fermeture de connexion
On utilisera l'instruction suivante pour fermer une connexion:
EXEC SQL DISCONNECT [connexion];
Le paramètre connexion peut prendre l'une des valeurs
suivantes :
Si aucun nom de connexion n'est spécifié, c'est
la connexion courante qui est fermée. Il est préférable de
toujours fermer explicitement chaque connexion ouverte.
V.3. Exécuter des commandes SQL
Dans une même perspective, toute commande SQL, incluse
dans des sections spécialement marquées, peut être
exécutée à l'intérieur d'une application SQL
embarqué. Ces sections se présentent toujours de la
manière suivante :
EXEC SQL instructions_SQL ;
En ce qui concerne le mode par défaut, les instructions
ne sont validées que lorsque EXEC SQL COMMIT est
exécuté.
De même, l'interface SQL embarqué supporte aussi
la validation automatique des transactions via l'instruction EXEC SQL SET
AUTOCOMMIT TO ON.
Dans ce cas, chaque commande est automatiquement
validée. Ce mode peut être explicitement désactivé
en utilisant EXEC SQL SET AUTOCOMMIT TO OFF.
Voici un exemple permettant de créer une table :
V.4. Les variables hôtes
A. Notion aux variables hôtes
Aujourd'hui, la transmission de données entre le
programme C et le serveur de base de données est particulièrement
simple en SQL embarqué. C'est dans ce sens qu'il est possible d'utiliser
une variable C, dans une instruction SQL, simplement en la préfixant par
le caractère deux-points (« : »). Comme on peut le constater,
pour insérer une ligne dans la table individu on peut écrire :
EXEC SQL INSERT INTO individu VALUES (:var_num, 'Poustopol',
:var_prenom);
88
Pour pouvoir mettre en oeuvre un exploit, cette instruction
fait référence à deux variables C nommées var_num
et var_prenom et utilise aussi une chaîne littérale SQL
('Poustopol') pour illustrer que vous n'êtes pas restreint à
utiliser un type de données plutôt qu'un autre.
L'obtention d'informations dans l'environnement SQL, fait que
nous appelons les références à des variables C des
variables hôtes.
B. Déclaration des variables hôtes
En connaissant cela, il est dit que les variables hôtes
sont des variables de langage C identifiées auprès du
préprocesseur SQL. Pour cela, et pour être définies, les
variables hôtes doivent être placées dans une section de
déclaration, comme suit :
EXEC SQL BEGIN DECLARE SECTION; declarations_des_variables_C
EXEC SQL END DECLARE SECTION;
Pour pouvoir s'introduire, vous pouvez avoir autant de
sections de déclaration dans un programme que vous le souhaitez.
Grâce aux étapes précédentes, les
variables hôtes peuvent remplacer les constantes dans n'importe quelle
instruction SQL. Un premier accès est lorsque le serveur de base de
données exécute la commande, il utilise la valeur de la variable
hôte. Il en va de même lorsqu'une variable hôte ne peut pas
remplacer un nom de table ou de colonne. Ces choses étant
déjà dites, dans une instruction SQL, le nom de la variable est
précédé du signe deux-points (« : ») pour le
distinguer d'autres identificateurs admis dans l'instruction.
Plus loin, les initialisations sur les variables sont admises
dans une section de déclaration. Il s'agit surtout des sections de
déclarations qui sont traitées comme des variables C normales
dans le fichier de sortie du précompilateur. De ce fait, il ne faut donc
pas les redéfinir en dehors des sections de déclaration. C'est ne
pas tout, les variables qui n'ont pas pour but d'être utilisées
dans des commandes SQL peuvent être normalement déclarées
en dehors des sections de déclaration.
La puissance des variables en langage C ont leur portée
normale au sein du bloc dans lequel elles sont définies. Une fois de
plus, le préprocesseur SQL n'analyse pas le code en langage C. Par
contre, il ne respecte pas les blocs C. outre, pour le préprocesseur
SQL, les variables hôtes sont globales : il n'est pas possible que deux
de ces variables portent le même nom.
89
C. Types des variables hôtes
De leur côté, seul un nombre limité de
types de données du langage C est supporté pour les variables
hôtes. Aussi, certains types de variable hôte n'ont pas de type
correspondant en langage C. Dans ce sens, des macros prédéfinies
peuvent être utilisées pour déclarer les variables
hôtes. Comme, le type prédéfini VARCHAR est la structure
adéquate pour interfacer des données SQL de type varchar. Avec
une déclaration comme
VARCHAR var[31];
Est en fait convertie par le préprocesseur en une
structure :
struct varchar_var { int len; char arr[180]; } var;
D . Utilisation d'une variable hôte : clause
INTO
En ce qui concerne le cas d'une requête de ligne unique,
c'est à dire qui n'extrait pas plus d'une ligne de la base de
données, les valeurs renvoyées peuvent être stockées
directement dans des variables hôtes. Cependant, contrairement au langage
C ou C++, le SQL est un langage ensembliste : une requête peut
très bien retourner plus d'une ligne. Dans ce cas, il faut faire appel
à la notion de curseur.
Il en est également pour le cas d'une requête de
ligne unique, une nouvelle clause INTO est intercalée entre la clause
SELECT et la clause FROM. La clause INTO contient une liste de
variables hôtes destinée à recevoir la valeur de chacune
des colonnes mentionnées dans la clause SELECT. Le
nombre de variables hôtes doit être identique au nombre de colonnes
de la clause SELECT. A la suite, les variables hôtes
peuvent être accompagnées de variables indicateur afin de prendre
en compte les résultats NULL.
C'est peut être, d'ailleurs, le même lors de
l'exécution de l'instruction SELECT, le serveur de base de
données récupère les résultats et les place dans
les variables hôtes. A chaque palier, si le résultat de la
requête contient plusieurs lignes, le serveur renvoie une erreur. De
plus, si la requête n'aboutit pas à la sélection d'une
ligne, un avertissement est renvoyé.
Ainsi, les erreurs et les avertissements sont renvoyés
dans la structure SQLCA.
Il a par exemple, en reprenant la base de données de la
séance de travaux pratiques précédentes et une
requête que nous avons déjà rencontrée: «
nombre de fois que chacun des films a été projeté ».
Mis en avant, nous pouvons récupérer les résultats de
cette requête de ligne unique dans des variables hôtes de la
manière suivante :
90
V.5. Variables indicateurs
Aperçu
Etant donné l'augmentation, les variables indicateurs
sont des variables en langage C qui fournissent des informations
complémentaires pour les opérations de lecture ou d'insertion de
données. Après une analyse approfondie, il existe plusieurs types
d'utilisation pour ces variables :
Valeurs NULL : Pour permettre aux
applications de gérer les valeurs NULL.
Troncature de chaînes : Pour
permettre aux applications de gérer les cas où les valeurs lues
doivent être tronquées pour tenir dans les variables
hôtes.
Erreurs de conversion : Pour stocker
les informations relatives aux erreurs.
En analysant ces types d'utilisations, une variable indicateur
est une variable hôte de type int suivant immédiatement une
variable hôte normale dans une instruction SQL. Utilisation de variables
indicateur
La meilleure manière d'apprécier les
données SQL, est que la valeur NULL représente un attribut
inconnu ou une information non applicable. Cela est dû, il ne faut pas
confondre la valeur NULL de SQL avec la constante du langage C qui porte le
même nom (NULL). Cette dernière représente un pointeur non
initialisé, incorrect ou ne pointant pas vers un contenu valide de zone
mémoire.
La valeur NULL n'équivaut à aucune autre valeur
du type défini pour les colonnes. Ainsi, si une valeur NULL est lue dans
la base de données et qu'aucune variable indicateur n'est fournie, une
erreur est générée (SQLE_NO_INDICATOR). Pour transmettre
des valeurs NULL à la base de données ou en recevoir des
résultats NULL, des variables hôtes d'un type particulier sont
requises : les variables indicateurs.
Comme dans l'exemple précédent, une erreur est
générée si, pour une raison quelconque, le titre du film
n'existe pas et que sa valeur est NULL. Pour s'affranchir de ce
problème, on utilise une variable indicateur de la manière
suivante :
91
Dans cet exemple, la variable indicateur val_ind vaudra
zéro si la valeur retournée n'est pas NULL et elle sera
négative si la valeur est NULL. Cette approche vaut, si la valeur de
l'indicateur est positive, cela signifie que la valeur retournée n'est
pas NULL mais que la chaîne a été tronquée pour
tenir dans la variable hôte.
V.6. Gestion des erreurs
A. Configurer des rappels : instruction WHENEVER
Nous devons noter, que l'instruction WHENEVER est une
méthode simple pour intercepter les erreurs, les avertissements et les
conditions exceptionnelles rencontrés par la base de données lors
du traitement d'instructions SQL.
Par ailleurs, elle consiste à configurer une action
spécifique à exécuter à chaque fois qu'une
condition particulière survient. Cette opération s'effectue de la
manière suivante :
EXEC SQL WHENEVER condition action;
Le paramètre condition peut prendre une des valeurs
suivantes :
SQLERROR : L'action spécifiée
est appelée lorsqu'une erreur survient pendant l'exécution d'une
instruction SQL.
SQLWARNING : L'action spécifiée est
appelée lorsqu'un avertissement survient pendant l'exécution
d'une instruction SQL.
NOT FOUND : L'action spécifiée est
appelée lorsqu'une instruction ne récupère ou n'affecte
aucune ligne.
Le paramètre action peut avoir une des valeurs suivantes
:
CONTINUE : Signifie effectivement que la condition est
ignorée. C'est l'action par défaut. SQLPRINT :
Affiche un message sur la sortie standard. Ceci est utile pour des programmes
simples ou lors d'un prototypage. Les détails du message ne peuvent pas
être configurés. STOP : Appel de exit(1), ce qui terminera le
programme.
BREAK : Exécute l'instruction C break. Cette action est
utile dans des boucles ou dans des instructions switch.
GOTO label et GO TO label : Saute au label
spécifié (en utilisant une instruction C goto).
92
CALL nom (args) et DO nom (args) : Appelle
les fonctions C spécifiées avec les arguments
spécifiés.
Le standard SQL ne définit que les actions
CONTINUE et GOTO ou GO TO.
De plus, l'instruction WHENEVER peut
être insérée en un endroit quelconque d'un programme SQL
embarqué.
En raison du caractère évolutif d'interrompre
les erreurs, cette instruction indique au préprocesseur de
générer du code après chaque instruction SQL. En
conséquence, cette instruction reste active pour toutes les instructions
en SQL embarqué situées entre la ligne de l'instruction
WHENEVER et l'instruction WHENEVER suivante contenant
la même condition d'erreur, ou jusqu'à la fin du fichier
source.
Ce sont là tous les conditions d'erreur qui sont
fonction du positionnement dans le fichier source de langage C et non du moment
où l'instruction est exécutée.
Seule, cette instruction est fournie pour vous faciliter le
développement de programmes simples. Il est plus rigoureux de
contrôler les conditions d'erreur en vérifiant directement le
champ sql code de la zone SQLCA. A l'issue de cette réflexion,
l'instruction WHENEVER est inutile. Pourquoi parce que en fait,
l'instruction WHENEVER se contente de demander au
préprocesseur de générer un test if (SQLCODE )
après chaque instruction SQL.
B. Zone de communication SQl (SQLCA)
Que faut-il finalement retenir de la zone de communication SQL
(SQLCA), elle est une zone de mémoire qui permet, pour chaque demande
adressée à la base de données, de communiquer des
statistiques et de signaler des erreurs. Il est intéressant, en
consultant la zone SQLCA, vous pouvez tester un code d'erreur
spécifique. Comme un code d'erreur s'affiche dans les champs sqlcode et
sqlstate lorsqu'une requête adressée à la base de
données provoque une erreur.
C'est en nous fondant sur cette observation, qu'une variable
SQLCA globale (sqlca) est définie dans la bibliothèque
d'interface, elle a la structure suivante :
93
Dans la majorité, SQLCA couvre à la fois les
avertissements et les erreurs. Si plusieurs avertissements ou erreurs
surviennent lors de l'exécution d'une instruction, alors sqlca ne
contient que les informations relatives à la dernière. Si aucune
erreur ne survient dans la dernière instruction SQL,
sqlca.sqlcode vaut 0 et sqlca.sqlstate vaut
"00000". Si un avertissement ou une erreur a eu lieu, alors
sqlca.sqlcode sera négatif et sqlca.sqlstate
sera différent de "00000".
Il est aussi possible que les champs sqlca.sqlstate
et sqlca.sqlcode soient deux schémas
différents fournissant des codes d'erreur. Cette différence
stipule que les deux sont spécifiés dans le standard SQL mais
sqlcode est indiqué comme obsolète dans
l'édition de 1992 du standard et a été supprimé
dans celle de 1999. Du coup, les nouvelles applications sont fortement
encouragées à utiliser sqlstate.
V.7. Curseurs pour résultats à lignes
multiples
Notion
Il est déjà possible, lorsque vous
exécutez une requête dans une application, le jeu de
résultats est constitué d'un certain nombre de lignes. Nous nous
proposons en général, lorsque vous ne connaissez pas le nombre de
lignes que l'application recevra avant d'exécuter la requête, il
est de lors possible que les curseurs constituent un moyen de gérer les
jeux de résultats d'une requête à lignes multiples.
Ces choses étant dites, les curseurs vous permettent de
naviguer dans les résultats d'une requête et d'effectuer des
insertions, des mises à jour et des suppressions de données
sous-jacentes en tout point d'un jeu de résultats.
A cela s'ajoute que, pour gérer un curseur vous devez
respecter les étapes suivantes :
1. Déclarer un curseur pour une instruction SELECT
donnée à l'aide de l'instruction
DECLARE :
EXEC SQL DECLARE nom_curseur CURSOR FOR
requête_select ;
2. Ouvrir le curseur à l'aide de l'instruction OPEN :
EXEC SQL OPEN nom_curseur ;
3. Récupérer une par une les lignes du curseur
à l'aide de l'instruction FETCH : FETCH [ [
NEXT | PRIOR | FIRST | LAST | { ABSOLUTE | RELATIVE } nombre ]
{ FROM | IN } ] nom_curseur
INTO liste_variables
NEXT : Récupère la ligne suivante. Ceci est la
valeur par défaut.
PRIOR : Récupère la ligne
précédente.
FIRST : Récupère la
première ligne de la requête (identique à ABSOLUTE 1). LAST
: Récupère la dernière ligne de la requête
(identique à ABSOLUTE -1).
94
ABSOLUTE nombre : Récupère la
nombre e ligne de la requête ou la abs
(nombre)e ligne à partir de la fin si nombre
est négatif. La position avant la première ligne ou après
la dernière si nombre est en-dehors de l'échelle ; en
particulier, ABSOLUTE 0 se positionne avant la première ligne.
RELATIVE nombre : Récupère la
nombre e ligne ou la abs
(nombre)e ligne avant si nombre est négatif.
RELATIVE 0 récupère de nouveau la ligne
actuelle si elle existe.
nom_curseur : Le nom d'un curseur ouvert.
liste_variables : La liste des variables
hôtes destinées à recevoir la valeur de chacun des
attributs de la ligne courante. Le nombre de variables hôtes doit
être identique au nombre de colonnes de la table résultat.
4. Continuez l'extraction des lignes tant qu'il y en a.
5. Fermer le curseur à l'aide de l'instruction CLOSE :
CLOSE nom_curseur
Cette étape est que lors de son ouverture, un curseur est
placé avant la première ligne. Par
défaut, les curseurs sont automatiquement refermés
à la fin d'une transaction.
Voici un exemple utilisant la commande FETCH
:
V.8. Précompilation et compilation
A. Inclusion de fichiers
Dans sa description, pour inclure un fichier externe SQL
embarqué dans votre programme, utilisez la commande :
EXEC SQL INCLUDE nom_fichier;
Cette commande indique au préprocesseur du SQL
embarqué de chercher un fichier nommé nom_fichier.h, de traiter
et de l'inclure dans le fichier C généré. Du coup, les
instructions SQL embarqué du fichier inclus sont gérées
correctement.
En utilisant la directive classique
#include <nom_fichier.h>
95
De par sa sémantique, le fichier nom_fichier.h ne
serait pas sujet au pré-traitement des commandes SQL. A noter que cela,
vous permet de continuer à utiliser la directive #include
pour inclure d'autres fichiers d'en-tête.
B. Précompilation et compilation
Tout d'abord, il importe de préciser que, la
première étape consiste à traduire les sections SQL
embarqué en code source C, c'est-à-dire en appels de fonctions de
la librairie libecpg. En remettant cette étape en
cause, il s'avère qu'elle est assurée par le préprocesseur
appelé ecpg qui est inclus dans une installation standard de
PostgreSQL.
Face à cette étape, les programmes SQL
embarqué sont nommés typiquement avec une extension
.pgc. et que si vous avez un fichier programme nommé
prog.pgc, vous pouvez le passer au préprocesseur par la
simple commande [33] :
ecpg prog1.pgc
S'agissant ce fichier programme, cette étape permet de
créer le fichier prog.c. Si vos fichiers en
entrée ne suivent pas le modèle de nommage suggéré,
vous pouvez spécifier le fichier de sortie explicitement en utilisant
l'option -o.
Une fois ce fichier traité par le préprocesseur,
il peut alors être compilé de façon classique, comme le
démontre l'exemple suivant:
cc -c prog.c
En remettant en pratique ce fichier programme, il en est de
même que cette étape permet de créer le fichier
prog.o. Les fichiers sources en C générés
incluent les fichiers d'entête provenant de l'installation de
PostgreSQL. Si vous avez installé PostgreSQL
à un emplacement qui n'est pas parcouru par défaut, vous
devez ajouter une option comme - I/usr/local/pgsql/include sur la ligne de
commande de la compilation.
Cette mise à l'épreuve permet enfin de lier le
programme avec la bibliothèque libecpg qui contient les
fonctions nécessaires. Ces fonctions récupèrent
l'information provenant des arguments, exécutent la commande SQL en
utilisant l'interface libpq et placent le résultat dans
les arguments spécifiés pour la sortie. Pour lier un programme
SQL embarqué, vous devez donc inclure la bibliothèque
libecpg :
cc -o monprog prog.o -lecpg
Dit autrement, on peut avoir besoin d'ajouter une option comme
- L/usr/local/pgsql/lib sur la ligne de commande.
V.9. Cas pratique complet
Admettre ce cas pratique, cela revient à accepter la
concrétisation des opérations suivantes : La
connexion à la base ;
96
La vérification de la réussite de la
connexion ;
L'affichage du contenu de la table individu en
utilisant un curseur ; La fermeture de la connexion.
En tenant compte que ce programme est enregistré dans
un fichier nommé prog.pgc, l'exécutable est obtenu de la
manière suivante :
V.10. Bilan du chapitre
Dans ce chapitre, nous avons tout d'abord fait une
régression relativement en détail sur les commandes de SQL vu
précédemment. Nous avons vu que ces principales commandes nous
ont principalement servis de base. Ensuite, nous avons abordé le
thème des instructions Embedded SQL qui constituent la voie pour
commencer et terminer l'exécution du programme. Nous avons
constaté que, pour générer l'exécutable, le code
source est d'abord
97
traduit par le préprocesseur SQL qui convertit les
sections SQL en code source C ou C++, après quoi il peut être
compilé de manière classique. Ces choses étant dites, nous
avons remarqué que le SQL embarqué comme il a été
démontré dans nombreux de cas pratique construit des avantages
vis-à-vis des autres pour prendre en compte les commandes SQL. Il reste
que l'intérêt de SQL embarqué en C est
spécifié dans le standard SQL et supporté par de nombreux
systèmes de bases de données SQL.
Finalement, un des aspects prépondérant avec
l'apport des fonctionnalités du PostgreSQL est d'un côté,
utile que ces fonctionnalités placent toujours le PostgreSQL dans la
catégorie des bases de données relationnel-objet. Cela revient
à dire qu'il ne faut pas confondre cette catégorie avec celle des
serveurs d'objets qui ne tolère pas aussi bien les langages
traditionnels d'accès aux SGBDR. Ainsi, bien que PostgreSQL
possède certaines fonctionnalités orientées objet, il
appartient avant tout au monde des SGBDR. C'est essentiellement l'aspect SGBDR
de PostgreSQL que nous avons abordé dans cette partie. De l'autre,
PostgreSQL apporte une puissance additionnelle substantielle en incorporant les
quatre concepts de base suivants afin que les utilisateurs puissent facilement
étendre le système : classes, héritage, types,
fonctions. Or, d'autres fonctionnalités accroissent la
puissance et la souplesse comme: contraintes, déclencheurs,
règles, intégrité des transactions. Au
final, si ces concepts influent sur les qualités du PostgreSQL,
d'être un logiciel libre, cela c'est à cause de sa gratuité
et que donc les sources sont disponibles, d'où il est alors possible de
l'installer sur les systèmes Unix/Linux et Win32.
98
Conclusion générale
Notre étude a permis d'appréhender la gestion
d'informations-mutations vers les bases des données
relationnelles-langage SQL. L'objectif de cette recherche était de
mettre en évidences les définitions et les enjeux de ces
pratiques dans des organisations enfin de bannir toutes les déperditions
des données.
Nous revenons sur les principaux justificatifs d'usage des
BDR, les défauts qui occasionnent la décadence des données
dans des organisations, et les avantages de valorisation de l'usage du langage
de manipulation de bases des données SQL, ceux qui motiveraient une
mutation des premières envergures.
C'est pourquoi, nous exposons une considération sur les
mutations des BDR ainsi que ses instructions pour servir valablement les
évidences proposées selon les bilans suivants.
Bilan des travaux
S'agissant des gains et avantages qui attraient à la
gestion des informations dans des entreprises, il a été
démontré et déceler que l'ordinateur renferme la
mémoire précieuse de stockage. Notamment au vu de la
quantité d'informations fournies dans des entreprises, l'ensemble des
évidences admises ont démontré de manière
permanente que l'ordinateur peut faire dans un premier temps la gestion des
données (mémoriser de l'information : DD, RAM, ROM, DVD, CD,
clé USB, ...) sans lui rajouter beaucoup d'instructions. Comme il est
clair, il y a la possibilité que cette performance d'informations au
sein des entreprises nécessité des méthodes assez
gestionnaire des données.
Toutefois, même si une certaine maturité de
gestion des données semble venir épauler l'ordinateur dans sa
quête gestionnaire, les évidences des bases des données,
ont décrit le système de gestion de base de données et
disséminer leurs intérêt en terme de modélisation
à travers les entités de types-entités. Dans ce contexte,
une Base des Données est un ensemble d'informations exhaustives, non
redondantes, structurées et persistantes, concernant un sujet. Dans
cette claire définition, introduire le Système de Gestion de Base
de Données peut être le choix de l'organisation, le stockage, la
mise à jour et la maintenance des données. Certes, la
stratégie à cette évidence permet de décrire,
modifier, interroger et administrer les données.
En traversant le tableau que nous peint les différents
modèles d'objets d'une base de données, la singularité des
mutations des entreprises vers l'usage des SGBD est quasi-total capital. C'est
pourquoi, nous avons tout d'abord voulu savoir quelle était la
contribution essentielle de l'usage de SGBD dans des entreprises. Voilà
que nous avons examiné les apports et les limites des différentes
conceptions des modèles des données. Naturellement, Il
99
en est ressorti qu'en dépit de limites de chacun de ces
différentes conceptions des modèles des données, la
modélisation s'articuler avec la valeur du résultat après
chaque conception.
Ces choses étant dites, restait ensuite à
déterminer ce qui caractérise la valeur des attributs dans
chacune des tables pour chaque choix du modèle des données. Pour
y parvenir, nous nous sommes appuyés sur le passage au modèle
relationnel, sa normalisation des relations dans la conception d'une base de
données relationnelle, sa dépendance fonctionnelle et enfin
chuter par la notion d'intégrité structurelle. En effet, nous
avons vu que la notion d'intégrité structurelle renferme
différentes classifications, d'où l'intégrité
référentielle constitue une synthèse de ces
dernières, car, elle impose que chaque valeur d'une clé
étrangère existe comme valeur de la clé d'identification
dans la table référencée.
Tout compte fait, avec des manipulations des bases de
données relationnelles, nous avons présenté les
fonctionnalités principales de SQL au sein d'un SGBD. Ce qui a pour gain
d'engendrer une dimension assez pratique. Qui plus est, un langage
normalisé d'interrogation de bases de données très
répandu qui permet de manipuler assez facilement les bases des
données relationnelles. Nous serions face à un langage
très variable bien qu'il ait été normalisé deux
fois. Avec son développement, il s'est avéré qu'il permet
d'ajouter des données, de les supprimer, parfois par tables
entières, de les sélectionner dans des tables, selon toutes
sortes de critères (Order by, Group by, Where...) par-delà
grâce à ses instructions. De la sorte, cette accessibilité
des instructions a permis d'examiner la commande SELECT avec ses
différentes clauses, ce qui impliquerait une interrogation et une
standardisation des différents langages, bien qu'ils soient
(d'interrogation, de manipulation, de définition et de
contrôle).
En définitive, nous avons fait une régression
détaillant les commandes de SQL vu précédemment. De
ceux-là, les principales commandes nous ont principalement servis de
base. Le principal choix a été celui des instructions Embedded
SQL qui constituent la voie pour commencer et terminer l'exécution du
programme. Cette cible, nous a amené à dévoiler que pour
générer l'exécutable, le code source est d'abord traduit
par le préprocesseur SQL qui convertit les sections SQL en code source C
ou C++, après quoi il peut être compilé de manière
classique. Une constatation que nous avons remarqué, le SQL
embarqué comme il a été démontré dans
nombreux de cas pratique construit des avantages vis-à-vis des autres
pour prendre en compte les commandes SQL. C'est pour pouvoir envisager la
solution que nous avons expliqué le SQL embarqué qui en C est
spécifié dans le standard SQL et supporté par de nombreux
systèmes de bases de données SQL.
Outre, nous nous sommes principalement concentrés sur
l'apport des fonctionnalités du PostgreSQL qui d'un côté,
reste utile, pour cela, elles placent toujours le PostgreSQL dans
100
la catégorie des bases de données
relationnel-objet. Il y a là essentiellement le
déréférence à ne pas confondre cette
catégorie avec celle des serveurs d'objets qui ne tolère pas
aussi bien les langages traditionnels d'accès aux SGBDR. C'est à
un dire que le PostgreSQL possède certaines fonctionnalités
orientées objet, il appartient avant tout au monde des SGBDR. C'est
essentiellement l'aspect SGBDR de PostgreSQL que nous avons abordé. Ce
relais du PostgreSQL apporte une puissance additionnelle substantielle en
incorporant les quatre concepts de base suivants afin que les utilisateurs
puissent facilement étendre le système : classes,
héritage, types, fonctions. Or, d'autres
fonctionnalités accroissent la puissance et la souplesse comme:
contraintes, déclencheurs, règles,
intégrité des transactions. Ces
fonctionnalités nous ont notamment montré que ces aspects
influent sur les qualités du PostgreSQL, d'être un logiciel libre,
à partir de là a été expliqué sa
gratuité et la disponibilité de ses sources.
Les perspectives
Le travail dans lequel nous nous sommes engagés est un
travail de grande ampleur car il couvre tous les niveaux de stockage des
données dans les SGBD et l'usage d'un langage des manipulations des
données. Les premières perspectives concernent la prise en compte
dans la gestion, de toutes les données des organisations. C'est
notamment le cas pour les informations amples qui nous amènent à
envisager leur traitement avec par exemple une approche de gestion
relationnelle. Cela nous conduit alors aussi vers l'étude des
modèles des données liées à la modélisation
et son langage de manipulation des données.
Les autres perspectives concernent d'une part les
considérations des SGBDR vers de nouvelles fonctionnalités et,
d'autre part, à l'étude plus approfondie de l'architecture du
langage qui soutient les pages Web. Cet axe est en train de prendre beaucoup
d'importance dans la communauté des bases de données : on parle
alors de SGBDR (Système de Gestion de Bases des Données
Relationnelles). Il s'agira là, d'un élément
fédérateur qui facilitera la gestion des toutes les
données des organisations. Un des défis pour la recherche dans
les années à venir pourrait bien être la gestion de la
complexité de tels environnements intégrés.
101
Bibliographie
[1] ANSI, (ISO/ANSI working draft) Database
Language SQL2, (X3H2-90-398), Octobre 1990.
[2] R.Grin. Introduction aux bases de
données. Université de Nice Sophia-Antipolis Version 2.1,
decembre 2000.
[3] P.Rigaux. Cours de bases de données.
cours, page 9, juin 2001.
[4] JP.Antoni et Y.Flety. Introduction aux
bases de données. cours.
[5] Codd, E. F. (1970, June). A Relational
Model of Data for Large Shared Data Banks. Communications of the ACM,
377-387.
[6] Dionisi, D. (1993). L'essentiel sur merise. Eyrolles.
[7] S. CLUET, Langages et Optimisation de
Requêtes pour Systèmes de Gestion de Base de Données
Orientés-Objet, Thèse de doctorat de 3ième cycle,
Université de Paris-Sud - Centre d'Orsay, Juin 1991.
[8] S. ABITEBOUL et C. BEERI, On the Power
of Languages for the Manipulation of Complex Objects, (INRIA Research Report
#846), INRIA, Mai 1988.
[9] W. KIM et al., « Integrating an
Object-Oriented Programming System with a Database System», Proc. OOPSLA
88 Conference, Septembre 1988.
[10] A. ALBANO, L. CARDELLI et R. ORSINI,
«Galileo: A Strongly-Typed,Interactive Conceptual Language», Readings
in Object-Oriented Database Systems , édité par S. Zdonik, D.
Maier, Morgan-Kaufman, 1985.
[11] F. BANCILHON, T. BRIGGS, S. KHOSHAFIAN et P.
VALDURIEZ, «FAD, a Powerful and Simple Database Language»,
Proc. VLDB 87 Conference , Brighton, 1987.
[12] M. CAREY et al., The Architecture of
the EXODUS Extensible DBMS: A Preliminary Report , (644), University of
Wisconsin - Madison, Mai 1986.
[13] M. CAREY, D. DE WITT et S. VANDENBERG,
«A Data Model and a Query Language for EXODUS», Proc. ACM SIGMOD 88
Conference, Chicago, Juin 1988.
[14] J.E. RICHARDSON et M.J. CAREY,
«Implementing Persistence in the E Language», International Workshop
on Persistent Object System, 1989.
102
[15] O DEUX et al., «The Story of
O2», IEEE Transactions on Knowledge and Data Engineering, 12(1), Mars
1990.
[16] C. LECLUSE, P. RICHARD et F. VELEZ,
«O2, an Object-Oriented Data Model», Proc. ACM SIGMOD 88 Conference,
Chicago, Juin 1988.
[17] O2 Technology, The O2 User's Manual , 7,
rue du Parc de Clagny 78000 Versailles (France), Décembre 1991.
[18] S. KRAKOWIAK, M. MEYSEMBOURG, H. NGUYEN VAN, M.
RIVEILL et C.ROISIN, «Design and implementation of an
object-oriented, strongly typed language for disributed applications»,
Journal of Object-Oriented Programming, 3(3), Septembre 1990.
[19] C. BEERI et Y. KORNATZKY, «Algebraic
Optimization of Object-Oriented Query Languages », Proc. ICDT 90
Conference , Paris, Décembre 1990.
[20] H. Nguyen Van, M. Riveill et C. Roisin,
Manuel du langage Guide (V1.5), (3-90), Unité mixte Bull-Imag
(Grenoble), Décembre 1990.
[21] Akoka, J. & Comyn-Wattiau, I.
(2001). Conception des bases de données relationnelles. Vuibert
informatique.
[22] Banos, D. & Mouyssinat, M. (1990).
De merise aux bases de données. Eyrolles.
[23] Bourda, Y. (2005a). Le langage SQL.
(http :// wwwlsi.supelec.fr/ www/ yb/ poly_bd/ sql/ tdm_sql.html).
[24] Bourda, Y. (2005b). Systèmes de
Gestion de Bases de Données Relationnelles. (http :// wwwlsi.supelec.fr/
www/ yb/ poly_bd/ poly.html).
[25] Gabillaud, J. (2004). SQL et
algèbre relationnelle - Notions de base. ENI.
[26] Godin, R. (2000a). Systèmes de
gestion de bases de données (Vol. 2). Loze-Dion.
[27] Godin, R. (2000b). Systèmes de
gestion de bases de données (Vol. 1). Loze-Dion.
[28] Gruau, C. (2006). Conception d'une base
de données. (http :// cyril-gruau.developpez.com/ uml/ tutoriel/
ConceptionBD/).
[29] Guézélou, P. (2006).
ModÉlisation des donnÉes : Approche pour la conception des bases
des données. (http ://
philippe.guezelou.free.fr
/mcd /mcd.htm).
[30] Hernandez, M. J. & Viescas, J. L.
(2001). Introduction aux requêtes SQL. Eyrolles.
103
[31] Kauffman, J., Matsik, B. & Spencer, K.
(2001). Maîtrisez SQL (Wrox Press, Ed.). CampusPress.
[32] PostgreSQL (The PostgreSQL Global
Development Group, 2005)
[33] The PostgreSQL Global Development Group.
(2005). Documentation PostgreSQL 7.4.7. (http :// traduc.postgresqlfr.org/
pgsql-fr/ index.html).
104
Références Web
[W1]Encyclopédie Wikipédia.
(2005). Articles en ligne sur Wikipédia. (http ://
fr.wikipedia.org). Mai 2017
[W2]Introduction aux modèles EA et
relationnel:
www.iutc3.unicaen.fr/~moranb/cours/acsi/menu.htm
Janvier 2018
[W3]Bases de données, SGBD: www-
lsr.imag.fr/Les.Personnes/Herve.Martin/HTML/FenetrePrincipale.htm,
Février 2018
[W4] SGBD et SQL :
wwwdi.supelec.fr/~yb/poly_bd/node1.html,
Juin 2017
[W5] Articles en ligne sur
Developpez.com. (2005a). LE
SQL de A à Z : Le simple ( ?) SELECT et les fonctions SQL.
(http :// sql.developpez.com/ sqlaz/ select). Juillet 2017
[W6] Articles en ligne sur
Developpez.com. (2005b). LE
SQL de A à Z : Les jointures, ou comment interroger plusieurs
tables. (http :// sql.developpez.com/ sqlaz/ jointures). Novembre 2017
@mj
§1. Objectifs d'un SGBD 30
105
Tables des matières
Sommaire 1
Remerciements 5
Lexique 7
Résume 9
Abstract 10
Liste des figures 11
Liste des tableaux 13
Introduction générale 14
Chapitre I : L'ordinateur auxiliaire de stockage
17
I.1. Introduction 17
I.2. Ordinateur auxiliaire de stockage 17
I.3. Fonctionnalités 19
I.4. Tumulte des couloirs du cosmopolite et trivial de
complexité 20
I.4.1. Tumulte des couloirs du cosmopolite
20
I.4.2. Trivial de complexité 20
I.5. Repères pour une question 21
I.6. Des perspectives pour la recherche ? 22
I.7. Bilan du chapitre 23
Chapitre II: Les bases des
données : une nouvelle considération de stockage et
manipulation des données 24
II.1. Introduction 24
II.2. Base de données 25
II.2.1. Définition 25
§1. Définition d'une BD comme ensemble de
données 25
§2. Définition d'une BD comme ensemble de
données structuré 25
§3. Retenons ces quelques définitions
informatisées 25
II.2.2. Domaine problème posé
26
II.2.3. Modèle de base de données
27
II.3. Système de gestion de base de données
(SGBD) 29
II.3.1. Notions et définition 29
II.3.2. Objectifs, propriétés, composants et
organisation de la mise en oeuvre d'un
SGBD 30
§2.
106
Propriétés d'un SGBD 31
§3. Composants des SGBD 31
§4. Organisation de la mise en oeuvre des SGBD
32
II.3.3. Affinement de niveaux de description des
ANSI/SPARC 32
II.4. Modélisation des bases de données :
le modèle entités-associations 33
II.4.1. Généralités 33
§1. Pourquoi une modélisation
préalable ? 33
§2. Merise 34
II.4.2. Le modèle entités-associations
35
II.4.3. Notations d'associations type-entité
39
II.5. Bilan du chapitre 44
Chapitre III: Les évidences de mutation vers les
bases de données relationnelles 46
III.1. Introduction 46
III.2. Généralités sur la notion de
modèle des données 47
III.3. Structure des modèles des données
à objet 47
III.3.1. Le modèle de données d'Orion
48
III.3.2. EXTRA : un modèle de données pour
EXODUS 49
III.3.3. Le modèle de données de O2
51
III.3.4. Le modèle de données de Guide
52
III.4. Passage au modèle relationnel
54
III.4.1. Généralité de clé
étrangère 54
III.4.2. Règles de passage 55
III.4.3. Cas pratique 56
III.5. Pertinence de la normalisation dans la conception
d'une Base de données
relationnelle 56
III.5.1. Redondance d'un attribut 56
III.5.2. Anomalies de mutation 57
III.6. Dépendances fonctionnelles et
normalisations des relations 57
III.6.1. Dépendance fonctionnelle :
définitions 57
III.6.2. Normalisation des relations 58
III.6.3. Cas pratique 60
III.6. Intégrité structurelle
62
III.6.1. Notion et classification 62
III.6.2. Intégrité
référentielle 63
III.7. Bilan du chapitre 64
107
Chapitre IV: Le langage Sql : un manipulateur de bases de
données relationnelles 65
IV.1. Introduction 65
IV.2. Le langage de définition des données
(LDD) 66
IV.2.1. Notion aux contraintes d'intégrité
67
IV.2.2. Créer une table : CREATE TABLE
69
IV.2.3. Modifier une table : ALTER TABLE 70
IV.2.4. Supprimer une table : DROP TABLE 71
IV.3. Le langage de manipulation des données
(LMD) 71
IV.3.1. Insertion de n-uplets : INSERT INTO
71
IV.3.2. Modification de n-uplets : UPDATE 72
IV.3.3. Suppression de n-uplets : DELETE 72
IV.4. Le langage de contrôle des données
(LDC) 72
IV.5. Interroger une base de données
74
IV.5.1. Notion de base 74
IV.5.2. Syntaxe de base 76
IV.5.3. Les jointures 78
IV.5.4. Les fonctions de groupes 80
IV.5.5. Sous-interrogations 82
IV.5.6. Bilan de l'instruction SELECT : syntaxe
étendue 83
IV.6. Bilan du chapitre 84
Chapitre V: Le Sql intégré : un paquetage
de Sql Embarqué 85
V.1. Introduction 85
V.2. Connexion au serveur de bases de données
86
V.3. Exécuter des commandes SQL 87
V.4. Les variables hôtes 87
V.5. Variables indicateurs 90
V.6. Gestion des erreurs 91
V.7. Curseurs pour résultats à lignes
multiples 93
V.8. Précompilation et compilation 94
V.9. Cas pratique complet 95
V.10. Bilan du chapitre 96
Conclusion générale 98
Bilan des travaux 98
Les perspectives 100
Bibliographie 101
108
Références Web 104
Tables des matières 105