COCEPTION DES BASES DE DONNEES RELATIONNELLES

Les BD constituent le cœur du système d'information. La conception de ces bases est la tâche la plus ardue du processus de développement du système d'information.

Les méthodes de conception, telle Merise, préconisent une démarche en étapes et font appel à des modèles pour représenter les objets qui composent les systèmes d'information, les relations existantes entre ces objets ainsi que les règles sous-jacentes.

La modélisation se réalise en trois étapes principales qui correspondent aux trois niveaux d'abstraction différents.

Le premier niveau, ou schéma conceptuel, représente le contenu de la base en termes conceptuels, indépendamment de toute considération informatique.

Le second niveau, appelé niveau logique, résulte de la traduction du schéma conceptuel en un schèma propre à un type de BD.

Le troisième niveau, ou niveau physique, est utilisé pour décrire les méthodes d'organisation et d'accès aux données de la base. Nous allons étudier ici les SGBD relationnelles.

I. Modélisation conceptuel (premier niveau du processus d'abstraction)

La modélisation est une étape fondamentale de la conception de la BD dans la mesure où, d'une part, on y détermine le contenu de la BD et, d'autre part, on y définit la nature des relations entre les concepts principaux.

Les éléments de base du modèle ER (Entité-Relation, modèle de base).

Les concepts :

Entité : définit comme un objet pouvant être identifie distinctement.
Ex : un client, un livre, un compte bancaire, une commande, etc.

Il existe deux catégories d'entités :

Entités faibles : son existence dépend de l'existence d'une autre entité.
Ex : une entité LIGNE DE COMMANDE n'existe que si l'entité COMMANDE correspondante est présente.

L'entité faible aura un identifiant composé de l'identifiant de l'entité dont elle dépend et d'un autre attribut. Graphiquement on peut encadrer les entités faibles d'un double rectangle.

Entités régulières : son existence ne dépend pas de l'existence d'une autre entité.


Attribut : caractéristiques ou propriétés des objets.
Ex : le client a un code client, une raison sociale, une adresse, un montant de découvert, etc.

Identifiant : parmi tous les attributs de l'entité, l'identifiant est un attribut ou un ensemble
d'attributs permettant de déterminer une et une seule entité à l'intérieur de l'ensemble.
Ex : un code client identifie un seul client de l'entreprise.


Les relations : représentent les liens existantes entre les entités.
Ex : les clients sont reliés aux commandes.
Contrairement aux entités, les relations n'ont pas de relations propres. Les relations sont caractérisées, comme les entités, par un nom et éventuellement des attributs.

La dimension ou degré de la relation est le nombre d'entités impliquées dans une relation.

Les relations peuvent être de :

" Dimension I (ou réflexive) : elle ne concerne qu'une entité type dont elle relie deux éléments.
Ex : La relation Mariage relie deux éléments de l'entité PERSONNE

" Dimension II : c'est la plus fréquente.
Ex : la relation entre la commande et le client est une relation binaire ou de dimension 2.

" Dimension III : une relation est ternaire dans la mesure où elle ne peut être décomposée en deux ou trois relations binaires équivalentes.
Ex : une location de voiture représente une relation entre un véhicule, une personne et une date.

De manière générale, une relation peut être caractérisée par n dimensions.


Cardinalité : la description complète d'une relation nécessite la définition précise de la participation des entités. La cardinalité est le nombre de participation d'une entité à une relation.

Ex : la relation binaire Stock entre deux ensembles d'entités PRODUIT et DEPOT.

Cardinalité I-I : si et seulement si un produit ne peut être stocké que dans un seul dépôt et un dépôt ne contient qu'un seul type de produit.

Cardinalité I-N : un produit peut être stocké dans plusieurs dépôts mais où chaque dépôt ne contient qu'un type de produit, ou inversement.

Cardinalité M-N : un type de produit peut être stocké en plusieurs dépôts et un dépôt donné peut contenir plusieurs types de produits.


Pour les relations ternaires, les cardinalités possibles sont : I-I-1, I-I-N, I-M-N, et M-N-P.

Les cardinalités ci-dessus traduisent les contraintes propres aux entités et relations. Elles sont appelées cardinalités maximales dans la mesure où elles représentent le nombre maximum de participations d'une entité à une relation.


NB : Deux différentes notions de cardinalité :

- l'approche anglo-saxonne met l'accent sur le nombre de correspondant d'une entité au sein d'une relation ;

- l'approche française (Merise) définit la cardinalité comme le nombre de participations de l'entité à la relation.

Pour les relations binaires, cette différence de vision n'a pas de conséquence sur le modèle conceptuel obtenu, elle modifie simplement la convention de représentation de ces cardinalités. En revanche, pour les relations ternaires ou plus, il existe une réelle différence entre les approches.

Ex : une relation ternaire au sens de Merise peut, dans certains cas, se noter I-M-N dans la convention anglo-saxonne. L'approche anglo-saxonne a l'avantage de permettre la déduction automatique de la clé de la table relationnelle qui traduira la relation. Nous adoptons l'approche français.

Les éléments de base du modèle EER (modèle enrichi).


Cardinalité minimale : nombre minimal de participations d'une entité à une relation. La cardinalité minimale peut être 0 ou 1.

Ex : dans la relation Conduire entre des entités PERSONNE et VEHICULE, une personne peut ne pas conduire de véhicule, dans ce cas la cardinalité minimale est 0.

Généralisation : la généralisation d'entités permet de décrire un ensemble d'entités à différents niveaux d'abstraction.

Ex : un même ensemble de personnes travaillant dans une entreprise peut être divisé selon la qualification, le sexe, etc. Cette précision permet p.e. d'enrichir le schéma conceptuel en représentant, pour chaque relation, l'ensemble des entités impliquées dans la relation.

Représentation graphique d'un schéma ER

IMAGE


Une situation à modéliser peut avoir plusieurs schémas différents. Chaque modèle peut présenter des avantages et des inconvénients. Pour mesurer la qualité d'une modélisation ER ou EER il existent plusieurs critères à utiliser de manière combinée :

L'expressivité : traduit la richesse sémantique du schéma. Peut être caractérisée p.e. par le nombre de concepts et/ou contraintes exprimés dans le tableau ;

La minimalité : tend à privilégier les schémas avec un nombre de redondances minimales ;
La lisibilité : consiste à évaluer la représentation graphique proprement dite ;
La simplicité : privilégie les schémas contenant un nombre de concepts minimum. On peut la mesurer p.e. on calculant le nombre d'entités et d'associations présentes sur un schéma.

Démarche pour construire un schéma conceptuel

La construction d'un schéma conceptuel peut se réaliser de la manière suivante :

EXERCICE:

Cas pratiques
Gestion d'une bibliothèque

Vous avez été contacté par le directeur d'une bibliothèque municipale de Genève, qui désire automatiser sa gestion.
Actuellement, la gestion de la bibliothèque est faite entièrement manuellement, au moyen d'un système de fiches manuscrites. Ce système entraîne une forte charge de travail pour les employés et un gaspillage important (fiches périmées retirées du fichier). La lourdeur du système est évidente si l'on considère que la bibliothèque possède actuellement 36872 livres répartis entre 21709 titres différents et 2634 abonnés. Chaque année, la bibliothèque acquiert environ 4000 ouvrages nouveaux tandis que 400 ouvrages anciens sont mis au rebut. Le nombre d'abonnés augmente d'environ 200 par an, compte tenu des inscriptions non renouvelées.

Grâce au système informatique, un abonné doit pouvoir retrouver un livre dans les rayons en connaissant son titre. Les livres sont identifiés par un code catalogue qui leur est affecté à l'achat et par un code rayon qui permet de les situer dans la bibliothèque. L'abonné doit aussi pouvoir connaître la liste des livres d'un auteur ou la liste par éditeur ou encore la liste par genre (bande dessinée, science-fiction, policier...). Chaque livre est acheté en un ou plusieurs exemplaires (on stocke la date d'acquisition). Tous les exemplaires d'un même livre ont un code rayon différent mais le même code catalogue. Les différents exemplaires d'un même livre peuvent éventuellement provenir de différents éditeurs. Pour suivre de près l'état du stock, la bibliothèque utilise un code indiquant l'état d'usure de chaque livre. Ce code d'usure est éventuellement mis à jour par un bibliothécaire à chaque retour d'un livre en prêt.
Le directeur souhaite également mettre en place une procédure de recherche documentaire par mots clés.
Vous devez donc prévoir la possibilité de recherche à partir d'un mot-clé de tous les ouvrages correspondants. Un ouvrage peut avoir un nombre quelconque de mots clés.
La bibliothèque utilise aussi un fichier des abonnés organisé par numéro matricule qui contient notamment les coordonnées (nom, adresse et téléphone) de l'abonné, sa date d'adhésion, sa date de naissance, sa catégorie professionnelle (ou bien étudiant ou enfant, le cas échéant).
La gestion des prêts implique la possibilité de connaître à tout moment la liste des livres détenus par un abonné, et inversement, qu'on puisse retrouver le nom des abonnés détenant un livre non présent dans les rayons.
Les prêts sont accordés pour une durée de quinze jours, éventuellement renouvelable, si aucune demande de ce livre n'a eu lieu entre-temps. Il faut donc connaître pour chaque livre emprunté, la date du prêt et la date de retour. La gestion des prêts nécessite aussi la mémorisation des livres demandés par un abonné. Cet abonné sera prioritaire lors du retour du livre en prêt. Sa priorité est maintenue pendant une semaine, à partir de la date de retour du livre. Les fonctions que le système devra effectuer sont:

  • la gestion des prêts (prêts et retours);
  • la mise à jour du fichier des livres (mises au rebut ou achats de livres);
  • la mise à jour du fichier des abonnés (retraits et nouvelles inscriptions);
  • la gestion des demandes non satisfaites;
  • la mise en place d'un échéancier permettant le contrôle des restitutions par les abonnés ainsi que la gestion automatique des relances;
  • la possibilité d'aide au choix d'un ouvrage grâce à une procédure de recherche par nom d'auteur, par éditeur, par thème, ou par mot-clé;
  • la possibilité d'établir des états statistiques permettant de connaître quel type d'abonné (catégorie d'âge, catégorie professionnelle) emprunte les livres d'un
    thème donné.

EX:


II. Conception logique relationnelle

La modélisation conceptuelle résulte en un schéma conceptuel qu'il faut rendre opérationnelle à l'aide d'une représentation logique dont le formalisme dépend du type de système de gestion de base de données visé.

Les concepts :

Le modèle relationnel allie la simplicité de la représentation des données au moyen des tables à une définition rigoureuse des concepts fondée sur la théorie mathématique des relations. Le modèle relation s'appui sur trois concepts fondamentaux :

Domaine : ensemble de valeurs défini en extension ou en intension. Un domaine peut être simple ou composé.

Domaine simple : si tous les éléments sont atomiques ou décomposables.
Ex : l'ensemble des grades du salarié peut être définit en extension par employé, agent de maîtrise, ou cadre.

Domaine composé : si les éléments peuvent être décomposés.
Ex : les dates sont décomposées d'un jour, un mois et une année.

Relation ou table : sous-ensemble du produit cartésien d'une liste de domaines. Autrement dit, une relation est un tableau à deux dimensions, chaque colonne appelée aussi attribut contient un ensemble des valeurs d'un domaine. Chaque ligne représente un tuple.

Schéma d'une relation : nom de la relation suivi de la liste des attributs, de la définition de leurs domaines et de l'ensemble des contraintes d'intégrité associées à cette table.

Schéma relationnel : ensemble des schémas de relation d'une base de données.

Contraintes d'intégrité : expression logique qui doit être vrai, à tout moment, dans une base de données. Ex : on ne peut pas avoir deux cours dans la même salle à la même heure.

Spécifier les contraintes d'intégrité permet d'en assurer la vérification systématique par le SGBD et ainsi de contrôler la cohérence des données.
Types de contraintes d'intégrité :

Contrainte de domaine : restriction de l'ensemble des valeurs possibles d'un attribut.

Contrainte de clé : définit un sous-ensemble minimal des colonnes tel que la table ne puisse contenir deux lignes ayant mêmes valeurs pour ces colonnes.

Contrainte obligatoire : précise qu'un attribut ou plusieurs attributs doivent toujours avoir une valeur.

Contrainte d'intégrité référentielle ou d'inclusion: lie deux colonnes ou deux ensembles de colonnes de deux tables différentes.


La théorie de la normalisation

La théorie de la normalisation est l'un des points forts du modèle relationnel. Elle permet de définir formellement la qualité des tables au regard du problème posé par la redondance des données. En effet, une mauvaise conception d'un schéma relationnel peut entraîner une redondance des données, voir une perte d'information. Cette redondance peut entraîner des anomalies lors d'opération de mise à jours des données.

La théorie de la normalisation s'appui sur la dépendance fonctionnelle rappelée ci-dessous.

Cod a définit un ensemble de formes normales caractérisant les tables relationnelles :
Première forme normale (IFN) : si elle ne contient que des attributs atomiques.
Deuxième forme normale (2FN) : si elle est en IFN et, si de plus, il n'existe pas de dépendance fonctionnelle entre une partie d'une clé et une colonne non clé de la table.
Troisième forme normale (3FN) : si elle est en 2FN et si, de plus, aucune dépendance fonctionnelle entre les colonnes non clé.

Ainsi, plus une table est normalisée moins elle comporte de redondances et donc de risques d'incohérence sémantiques dans les schémas relationnels.


Démarche pour la conception d'un schéma relationnel

Les règles principales de transformation d'un schéma conceptuel entité-relation en un schéma relationnel sont :

Règle I : Toute entité est traduite en une table relationnelle dont les caractéristiques sont les suivantes :
" le nom de la table et le nom de l'entité ;
" la clé de la table et l'identifiant de l'entité ;
" les autres attributs de la table forment les autres colonnes de la table.

Règle II : Toute relation binaire M-N est traduite en une table relationnelle dont les caractéristiques sont les suivantes :
" le nom de la table est le nom de la relation ;
" la clé de la table est formée par la concaténation des identifiants des entités participant à la relation ;
" les attributs spécifiques de la relation forment les autres colonnes de la table.

Une contrainte d'intégrité référentielle est générée entre chaque colonne clé de la nouvelle table et la table d'origine de cette clé.

Règle III : Toute relation binaire 1-N est traduite :

1. Soit par un report de clé : l'identifiant de l'entité participant à la relation côté N est ajoutée comme colonne supplémentaire à la table représentant l'autre entité. Cette colonne est parfois appelée clé étrangère. Le cas échéant, les attributs spécifiques à la relation sont eux aussi ajoutés à la même table ;

2. soit par une table spécifique dont les caractéristiques sont les suivantes :
" le nom de la table est le nom de la relation ;
" la clé de la table est l'identifiant de l'entité participent à la relation côté 1 ;
" les attributs spécifiques de la relation forment les autres colonnes de la table.

De plus une contrainte d'intégrité référentielle est générée.
Le choix du mode de traduction (report de clé ou table spécifique) peut être dicté par des considérations liées aux traitements futurs sur la base. Même si l'on dispose pas nécessairement d'une spécification détaillée des ces traitements, on peut partiellement les anticiper par l'analyse plus approfondie de cette relation. Un élément d'appréciation de ces traitements est la cardinalité minimale de l'entité côté 1. S cette cardinalité minimale est égale à 1, il est préférable d'opter pour le report de clé, dont l'avantage est de minimiser le nombre de tables. A noter que l'effet de cette minimisation n'est pas tant d'économiser l'espace disque que d'améliorer les performances de la base en réduisant le nombre de jointures entre tables.
Si la cardinalité minimale est égale à 0, nous proposons alors d'examiner la proportion d'entités participant effectivement à la relation. Si cette proportion est importante, on peut en déduire que la relation l'est aussi et opter encore pour le report de clé. En revanche, si cette proportion est relativement faible, il est préférable d'opter pour la table spécifique, dans la mesure où l'on peut penser que cette faible proportion exprime une importance relative de cette relation dans l'application.

EX2

Cas pratiques

Gestion d'une bibliothèque

Énoncé
À partir du schéma ER conçu pour la gestion de bibliothèque, produire le schéma relationnel correspondant. Dans chaque table, souligner la clé et préciser, le cas échéant, les clés candidates. Vérifier que le schéma obtenu est en troisième forme normale.

Corrigé
Par application de la règle I, on obtient les tables suivantes:

Par application de la règle 2, on obtient de plus les deux tables suivantes:

ÉCRIT(code_auteur, code_catalogue)
DÉCRIT(code_mot_clé, code_catalogue)


Et les contraintes d'intégrité référentielle suivantes:

ÉCRIT[code_auteur] - AUTEUR[code_auteur|
ÉCRIT[code_catalogue| - LiVRE|code_catalogue]
DÉCRIT|code_mot_clé] - MOT_CLÉ [code_mot_clé]
DÉCRIT|code_catalogue] - LIVRE[code_catalogue]


Le schéma ER comporte trois relations I-N. Toutes trois sont à cardinalité minimale 1 du côté où la cardinalité maximale est 1 :
•tout livre porte sur un et un seul thème;
•tout exemplaire se rapporte à un livre;
•tout exemplaire provient d'un éditeur.


Par application de la règle 3, en utilisant le report de clé, on complète de la façon suivante les deux tables LIVRE et EXEMPLAIRE:
LIVRE(code_catalogue, titre, code_thème)
EXEMPLAIRE(code_rayon, usure, date_acquisition, année_édition, code_éditeur,code_catalogue)

Et les contraintes d'intégrité référentielle suivantes:
EXEMPLAiRE[code_catalogue] - LiVRE[code_cataloguel]
LIVRE[code_thème] THEME [code_thème]
EXEMPLAiRE[code_éditeur] - ÉDiTEUR[code_éditeur]
Reste à traduire les deux relations ternaires Demande et Emprunt. Par application de la règle 5, on ajoute deux tables DEMANDE et EMPRUNT comportant, en plus des attributs propres (date_retour pour l'emprunt) les clés des entités participantes. On obtient ainsi la table DEMANDE:
DEMANDE(code_catalogue, matricule, date)
Et les contraintes d'intégrité référentielle suivantes:
DEMANDE[code_catalogue| - LIVRE[code_catalogue]
DEMANDE[matricule] - ABONNE[matricule]


La table EMPRUNT entre dans le cas particulier mentionné à la règle 5. En effet, sa clé peut être simplifiée dans la mesure où un même exemplaire à une même date ne peut être emprunté que par, au plus, un abonné. La clé, sous-ensemble minimum d'attributs, ne comprend donc pas le matricule de l'abonné:
EMPRUNT(code_ravon, date, matricule, date_retour)

Et les contraintes d'intégrité référentielle suivantes:
EMPRUNT[code_rayon] - EXEMPLAIRE[code_rayon]
EMPRUNT[matricule] - ABONNÉ [matricule]

La date, entité monoattribut, ne nécessite pas de traduction spécifique.
Le schéma relationnel obtenu est le suivant (les clés étrangères sont en italique):

ABONNÉ(matricule, nom, adresse, téléphone, date_adhésion, date_naissance, csp)
THÈME(code_thème, intitulé)
MOT_CLÉ(code_mot clé, mot_clé)
AUTEUR(code_auteur, nom_auteur, prénom_auteur)
ÉDITEUR(code_éditeur, nom_éditeur, adresse_éditeur)
ÉCRiT(code_auteur, code_catalogue)
DÉCRiT(code_mot_clé, code_catalogue)
LIVRE(code_catalogue, titre, code_thème)
EXEMPLAiRE(code_rayon, usure, date_acquisition, année_édition, code_éditeur, code _catalogue)
DEMANDE(code_catalogue, matricule, date)
EMPRUNT(code_rayon, date, matricule, date_retour)

Avec les contraintes d'intégrité référentielles suivantes:
ÉCRIT[code_auteur]- AUTEUR [code_auteur]
ÉCRIT[code_catalogue] - LIVRE[code_catalogue]
DÉCRIT[code_mot_clé] - MOT_CLÉ [code_mot_clé]
DÉCRIT[code_catalogue] - LivRE[code_catalogue]
EXEMPLAiRE[code_catalogue]- LiVRE[code_catalogue]
LIVRE[code_thème] -THÈME[code_thème]
EXEMPLAiRE[code_éditeur]- ÉDITEuR [code_éditeur]
DEMANDE [code_catalogue] -LIVRE[code_catalogue|
DEMANDE[matricule] - ABONNE [matricule]
EMPRUNT [code_rayon] - EXEMPLAiRE[code_rayon]
EMPRUNT[matricule] - ABONNÉ[matricule]

On vérifie le schéma relationnel obtenu en établissant la liste des dépendances fonctionnelles valides: dans la table ABONNE par exemple, les seules dépendances fonctionnelles sont constituées de MATRICULE en partie gauche. En effet, il n'y a pas de dépendance de nom vers adresse, ce qui signifierait que deux abonnés ne peuvent porter le même nom.
De même il n'y a pas de dépendance de téléphone vers nom, puisque deux personnes peuvent partager un numéro de téléphone sans toutefois porter le même nom.
De la même façon, on peut vérifier qu'aucune autre dépendance fonctionnelle n'existe dans la table ABONNE. Donc il n'y a pas, au sein de cette table, de dépendance fonctionnelle entre les colonnes non clé ou d'une partie de la clé vers un attribut non clé.
On en déduit donc que la table relationnelle ABONNE est en troisième forme normale. Il est aisé de vérifier qu'il en est de même pour les autres tables du schéma relationnel.
Cela confirme qu'un bon schéma conceptuel mène à un schéma relationnel normalisé.

SQL

Gestion d'une bibliothèque

Énoncé

À partir du schéma relationnel conçu pour la gestion de bibliothèque, définir à l'aide du langage SQL, l'ensemble des commandes de génération de ce schéma sur un noyau Oracle. Créer les index nécessaires.
Créer une vue permettant de rechercher toutes les caractéristiques d'un exemplaire: code rayon, code catalogue et titre du livre correspondant, thème.


Corrigé
Le schéma relationnel obtenu est le suivant (les clés étrangères sont en italiques):

ABONNÉ(matricule, nom, adresse, téléphone, date_adhésion, date_naissance, csp)
THÈME(code_thème, intitulé)
MOT_CLÉ(code_mot clé, mot_clé)
AUTEUR(code_auteur, nom_auteur, prénom_auteur)
ÉDITEUR(code_éditeur, nom_éditeur, adresse_éditeur)
ÉCRiT(code_auteur, code_catalogue)
DÉCRiT(code_mot_clé, code_catalogue)
LIVRE(code_catalogue, titre, code_thème)
EXEMPLAiRE(code_rayon, usure, date_acquisition, année_édition, code_éditeur, code _catalogue)
DEMANDE(code_catalogue, matricule, date)
EMPRUNT(code_rayon, date, matricule, date_retour)

La génération des tables suppose l'utilisation de la commande CREATE TABLE, ce qui produit l'ensemble d'instructions suivant:

CREATE TABLE abonné (matricule INTEGER PRIMARY KEY, nom CHAR (30),
adresse VARCHAR(5O),
téléphone CHAR(10),
date_naissance DATE,
date_adhésion DATE,
csp CHAR(5));

CREATE TABLE thème (code_thème INTEGER PRIMARY KEY, intitulé char(30));

CREATE TABLE motclé (code_mot_clé INTEGER PRIMARY KEY, mot_clé CHAR(40));

CREATE TABLE auteur (code_auteur CHAR(2) PRIMARY KEY,
nom_auteur CHAR(30),
prénom_auteur CHAR(30));


CREATE TABLE éditeur (code_éditeur CHAR(2) PRIMARY KEY,
nom_éditeur CHAR(30),
adresse_éditeur CHAR(50));

CREATE TABLE écrit(code_auteur char(3) NOT NULL,
code_catalogue CHAR(8) NOT NULL,
UNIQUE(code_auteur,code_catalogue));

CREATE TABLE décrit (code_mot_clé INTEGER NOT NULL, code catalogue CHAR(8) NOT NULL,
UNIQUE(code_mot_clé,code_catalogue));

CREATE TABLE livre(code_catalogue CHAR(8) PRIMARY KEY,
titre VARCHAR(50) NOT NULL,
code_thème INTEGER REFERENCES thème(code_thème)
CONSTRAINT RC-thème);

CREATE TABLE exemplaire (code rayon INTEGER PRIMARY KEY,
usure INTEGER,
date_acquisition DATE,
année_édition INTEGER,
code_éditeur CHARC(2) REFERENCES éditeur(code_éditeur)),
code__catalogue CHAR(8) REFERENCES livre(code_catalogue));

CREATE TABLE demande(code_catalogue CHAR(8) REFERENCES
livre(code_catalogue),
matricule INTEGER REFERENCES abonné(matricule),
date_demande DATE,
UNIQUE(code_catalogue,rnatricule,date_demande));

CREATE TABLE emprunt (code_rayon INTEGER REFERENCES exemplaire (code_rayon),
date_emprunt DATE,
matricule INTEGER REFERENCES abonné(matricule),
date_retour DATE,
UNIQUE(code_rayon,date_emprunt),
CHECK MONTHS_BETWEEN(date_emprunt,date_retour) <= 1);

Cet exemple permet d'illustrer quelques types de données parmi les plus courants: entier (INTEGER, SMALLINT), décimal (DECIMAL(m,n),NUMBER(m,n)), réel flottant (FLOAT, REAL), chaîne de caractères (CHAR(n) .VARCHAR(n)), date (DATE).
La contrainte PRIMARY KEY permet de définir une clé primaire pour chaque table. La contrainte NOT NULL assure l'obligation de saisir des valeurs dans les colonnes des tables DECRIT, ECRIT, LIVRE. Autrement dit, on ne peut insérer une ligne dans la table ECRIT sans y faire figurer nécessairement un code_auteur. La contrainte NOT NULL est implicite pour les colonnes clés primaires.
Pour les colonnes identifiantes non clé primaire, on définit une contrainte d'unicité, par exemple on ne peut avoir deux emprunts du même exemplaire à la même date: UNIQUE(code_rayon, date_emprunt). La contrainte matricule integer références abonné(matricule) impose que matricule soit la clé primaire de la table ABONNE. C'est un des exemples de contraintes référentielles. On peut nommer les contraintes à l'aide du mot-clé CONSTRAINT. L'intérêt principal de ce nom est d'autoriser dans l'avenir la suppression de ladite contrainte au moyen de la commande DROP CONSTRAINT. La contrainte sémantique CHECK MONTHS_BETWEEN(date_emprunt,date_retour) <= 1;


sera vérifiée chaque fois qu'une date d'emprunt et/ou une date de retour sera saisie ou modifiée. MONTHS_BETWEEN est l'une des nombreuses fonctions qu'offre Oracle pour manipuler les dates. Comme son nom l'indique, la fonction calcule le nombre de mois s'écoulant entre deux dates. Elle renvoie un nombre entier. À noter que les systèmes possèdent certains mots réservés, qui ne peuvent donc être utilisés pour désigner les constituants du schéma. Ainsi, nous avons dû renommer les dates d'emprunt et de demande car le mot DATE est réservé par SQL pour spécifier le type de données DATE.
De la même façon, on peut créer l'ensemble des index de la base Bibliothèque, à l'aide d'instructions du type: CREATE UNIQUE INDEX il ON Abonné (matricule);
Cet index accélérera les recherches d'abonné à partir du matricule ou les jointures entre la table ABONNE et les autres tables contenant le matricule.

La création de la vue permettant de rechercher toutes les caractéristiques d'un exemplaire s'obtient de la façon suivante:
CREATE VIEW vueexemplaire
AS SELECT code_rayon, code_catalogue, titre, intitulé
FROM exemplaire, livre, thème
WHERE exemplaire.code_catalogue=livre.code_catalogue
AND 1ivre.code_thème=thème.code_thème;


La clause SELECT contient la liste des colonnes que l'on veut faire figurer dans la vue. La clause FROM contient les trois tables nécessaires pour extraire ces colonnes, à savoir EXEMPLAIRE, LIVRE et THEME. La clause WHERE contient les deux conditions de jointure entre ces trois tables, à savoir l'égalité des codes catalogues entre le livre et l'exemplaire et l'égalité des codes thèmes entre le livre et le thème. Cette vue pourra être utilisée par un programme pour afficher sur un écran toutes les données utiles sur un exemplaire de livre.

EX2

Géographie

Énoncé
Pour faciliter l'apprentissage de la géographie, on a constitué une base de données relationnelles dont le schéma est le suivant:

PAYS(code pays, nom_pays, population, continent)
CAPITALE(ville, code_pays)
GRANDE_VILLE(ville, code_pays, population)
FRONTIÈRE(code_pays 1, code_pays2)

La table PAYS contient une codification de chaque pays, sa population approximative et le continent auquel ce pays appartient. On considère que chaque pays se
trouve principalement rattaché à un seul continent. La table CAPITALE relie chaque pays à sa ville capitale. code_pays est une clé candidate de cette table. La table GRANDE_VILLE contient un grand nombre des villes importantes de ces pays.
Enfin, la table FRONTIERE contient les codes des pays qui ont une frontière comune (pays limitrophes). On suppose qu'il n'existe pas deux villes portan même nom. Utiliser SQL pour répondre aux questions suivantes:
1. Quels sont les pays d'Afrique dont la population est supérieure à 20 millions d'habitants?
2. Quelle est la capitale de la Finlande ?
3. À quel continent est rattachée l'Egypte ?
4. La Bulgarie et l'Albanie ont-elles une frontière commune ?
5. Quelle est la population de la capitale de la Finlande ?
6. Donner la liste des pays qui n'ont pas de frontière commune avec un autre pays.

Corrigé
1. SELECT nom_pays FROM pays
WHERE population > 20000000 AND continent='Afrique';

2. SELECT ville FROM capitale
WHERE code_pays IN
(SELECT code_pays FROM pays WHERE nom_pays='Finlande');

3. SELECT continent FROM pays
WHERE nom_pays='Egypte';

4. SELECT 'oui '
FROM pays
WHERE nom_pays='Bulgarie' AND code_pays IN
(SELECT code_paysl FROM frontière
WHERE code_pays2 IN
(SELECT code_pays FROM pays
WHERE nom_pays='Albanie')) OR code_pays IN
(SELECT code_pays2 FROM frontière
WHERE code_paysl IN
(SELECT codejays FROM pays WHERE nom_pays='Albanie')) ;

5. SELECT population FROM grande^ville
WHERE ville IN
(SELECT ville FROM capitale

WHERE code_pays IN (SELECT code_pays FROM pays WHERE nom_pays='Finlande'));

6. SELECT nom_pays FROM pays WHERE code_pays NOT IN
(SELECT code_paysl FROM frontière)
AND code_pays NOT IN
(SELECT code_pays2 FROM frontière);

Géographie
Énoncé
On reprend le schéma relationnel géographique du chapitre 3:

PAYS(code pays, nom_pays, population, pnb, continent)
CAPITALE(ville, code_pays)
GRANDE_VILLE(ville, code_pays, population)
FRONTIÈRE(code_pays 1, code_pays2)

On a ajouté la colonne pnb dans la table PAYS pour prendre en compte le produit
national brut de ce pays.


Utiliser SQL pour répondre aux questions suivantes:
1. Y a-t-il des pays limitrophes appartenant à des continents différents ?
2. Quels sont les pays dont la capitale n'est pas la ville la plus peuplée ?
3. Quels sont les pays ayant au moins une ville de plus d'un million d'habitants ?
4. Quel est le pays ayant le produit national brut le plus bas ?
5. Quel est le produit national brut moyen des pays d'Afrique ?
6. Quels sont les pays dont la capitale regroupe plus du tiers de leur population ?
7. Vérifier si la table FRONTIERE contient des doublons.

Corrigé
1. SELECT p1.nom_pays,p2.nom_pays
FROM pays p1, pays p2
WHERE EXISTS (SELECT *
FROM frontière
WHERE code_paysl=pl.code_pays
AND code_pays2=p2.code_pays)
AND p1.continent <> p2.continent ;

2. SELECT nom_pays
FROM pays
WHERE EXISTS
(SELECT *
FROM grande_ville
WHERE code_pays=pays.code_pays
AND population >
(SELECT population
FROM grande_ville
WHERE ville=
(SELECT ville
FROM capitale WHERE code_pays=pays.code_pays)));

3. SELECT nom_pays
FROM pays
WHERE code_pays IN
(SELECT code_pays
FROM grande_ville
WHERE population > 1000000);

4. SELECT nom_pays
FROM pays
WHERE pnb =
(SELECT MIN(pnb) FROM pays);

5. SELECT AVG(pnb)
FROM pays
WHERE continent - 'Afrique';

6. SELECT nom_pays
FROM pays
WHERE population <
(SELECT population *10/3 FROM
grande_ville
WHERE ville =
(SELECT ville
FROM capitale
WHERE code_pays=pays.code_pays));
7. SELECT FI.* FROM frontière FI
WHERE EXISTS
(SELECT F2.*
FROM frontière F2
WHERE F1.code_pays1=F2.code_pays2
AND F2.code_pays1=F1.code_pays2);

FINE