Objectifs
Identifier les concepts définissant le modèle relationnel.
Savoir distinguer la structure d’une base de données de son contenu.
Repérer des anomalies dans le schéma d’une base de données.
1. Introduction
Nous sommes bientôt à la fin du trimestre… Vous n'avez pas connu le temps où les enseignants calculaient les moyennes, les reportaient sur le bulletin (liasse carbonée) avant d'y écrire une appréciation. L'administration avait au préalable porté les informations personnelles et celles de la vie scolaire. Le président du conseil de classe écrivait en séance l'appréciation générale et signait. Un feuillet était destiné au dossier élève, un autre aux parents le dernier aux archives de l'établissement…
La technique (numérique) a progressivement remplacé le papier. Davantage d'informations sont stockées et accessibles, sur votre cursus mais également sur votre personne. Pour autant tout ne s'y trouve pas…
Un système d'information qu'il soit humain ou technique reflète des choix. C'est une modélisation de la réalité.
La gestion des informations comporte de nombreux enjeux :
• La sauvegarde des données
• Leur maintien à jour
• Des droits d'accès différents
• Protection contre les erreurs (marquage concurrent des absences)
2. Le modèle relationnel
2.1 Travail de recherche
1. Choisissez un des domaines suivant et faites un inventaire sous forme de dictionnaire des données que vous souhaitez voir gérer par votre système d'information.
(Garage automobile , EDT d'un établissement scolaire, Vidéothèque...) 2. Éliminer les infos superflues et celles qui se calculent à partir d'autres données Si vous mettez trop d'infos (attributs) ce sera difficile pour un premier jet.
Exemple pour l'EDT :
• nombre de chaises (d'une salle)
• couleur des cheveux du professeur
• nom d'une matière
• début (heure) d'un cours
• durée d'un cours
• fin (heure) du cours
• nom d'une salle
• …
3. Essayer d'organiser vos données en établissant des relations de dépendance entre les attributs.
C'est pas si simple…
Ces relations entre les attributs permettent de définir des entités.
Dans l'exemple ci-contre chaque salle est représentée par un quadruplet : ('D401', 4, 0, 'atelier SI')
('D402' ,19 , 13, 'labo SI NSI') ('D403', 21, 13, 'labo SI NSI')
La relation salle est l'ensemble de ces entités :
salle = {('D401', 4, 0, 'atelier SI'), ('D402' ,19 , 13, 'labo SI NSI'), ('D403', 21, 13, 'labo SI NSI')}
D'une manière générale une relation est définie par un schéma : salle = {'nom_salle', nbre_tables, nbre_pc, 'vocation'}
D'autres relations pourront définir les classes d'élèves, les professeurs etc.
4. Essayer d'écrire les schémas des relations de votre système d'information.
2.2 Modélisation
Une base de données est un ensemble de relations.
Dans l'exemple précédent nous avons vu la relation salle.
Chaque relation est définie selon un schéma composé des attributs de la relation.
Le schéma de relation salle est : salle = {'nom_salle', nbre_tables, nbre_pc, 'vocation'}
Chaque attribut a un domaine de définition : nom_salle est une chaîne de caractères nbre_tables est un entier
…
Par extension on nomme schéma d'une base de donnée l'ensemble des schémas de relation qui constitue la base.
LML dataBase.odt 1/6 02/10/20
nom salle
nbre tables nbre PC
vocation salle
2.3 Contraintes d'intégrité.
Il est nécessaire de s'imposer ces contraintes pour préserver la cohérence du système d'information.
a) Contrainte de domaine
Il faut choisir pour chaque attribut le domaine le plus approprié pour représenter l'information.
Dans l'exemple précédent, l'attribut vocation_salle n'a d'autre utilité que l'information. Le type CHAR semble le plus approprié. Par contre on pourrait ajouter au schéma un attribut tp_possible indiquant si on peut faire des TP dans la salle. Le type CHAR sera peu adapté si on veut faire une sélection ou recherche, le type BOOLEAN conviendra mieux. On aurait alors la relation :
salle = {'nom_salle' : CHAR20, nbre_tables : INTEGER, nbre_pc : INTEGER, 'vocation' : CHAR 20, tp_possible : BOOLEAN}
b) Contrainte d'entité
Chaque élément d'une relation doit être unique. Il doit également être associé à une entité sans ambiguïté. Pour cela on choisira un attribut (dans certains cas plusieurs) dans le schéma pour identifier chaque élément de manière unique. Souvent un entier plus aisé à traiter qu’une chaîne de caractère. Cet attribut sera la clé primaire de la relation. En pratique on sera souvent amener à créer cet attribut de type entier sans autre objectif que servir de clé primaire à la relation.
Exemple :
Pour la relation classe l'attribut nom_salle identifie de manière unique la salle mais il est de type String. On préférera ajouter un attribut id_salle de type Int non représentatif pour les humains mais facile à gérer par le système.
c) Contrainte de référence
Les clés primaires pourront également servir pour établir des relations entre entités… nous verrons cela plus tard.
2.4 Exercices
a) Annuaire téléphonique
On souhaite modéliser un annuaire téléphonique simple dans lequel chaque personne (identifiée par son nom et son prénom) est associée à son numéro de téléphone. Proposer une modélisation relationnelle de cet annuaire.
b) Bulletin scolaire
Donner la modélisation relationnelle d'un bulletin scolaire. On doit y trouver les informations suivantes :
• des élèves possédant un numéro d'élève unique.
• des disciplines
• au plus une note sur 20 par discipline et par élève c) Réseau de bus
Proposer une modélisation pour un réseau de bus. Elle doit permettre de générer, pour chaque arrêt de bus du réseau, une fiche horaire avec tous les horaires de passage de pour toutes les lignes qui desservent l'arrêt.
Il faudra dans un premier temps faire l'inventaire des informations pertinentes et comment les représenter. On pourra alors procéder à la modélisation sous forme de relation.
3. Les bases de données relationnelles
Le modèle relationnel est purement théorique. Il a permis d'établir les relations de notre système d'information. Pour l'appliquer nous allons utiliser un langage qui permettra de définir les relations (tables) et de manipuler les données.
3.1 Modèle conceptuel et logique des données
Il permet de créer les tables en spécifiant leur nom, leurs attributs, les types de ces derniers et les contraintes.
Application : on considère le modèle de conceptuel de données de la base de prêt à porter
On retrouve les entités qui décrivent nos relations
Travail préliminaire
• Compléter le modèle en surlignant sur chaque table la clé primaire qui garantie la contrainte d'entité.
• Sur chaque associations, préciser la cardinalité qui indique le nombre d'entités possible, ;0, 1 ou *
• Ajouter sur les associations les attributs qui vous semblent utiles
Remarque : Dans ce modèle on retrouve les relations (entités) avec leurs attributs et également les relations (associations) qui ont leur propres attibuts et qui comportent également les clés des entités qu'elles relient, ce qui traduit l'association.
modèle conceptuel des données
On peut donc établir un modèle logique de notre base de donnée.
Des changements sont apparus :
• les données d'adresse ont été regroupés en une seule table.
• Certaines associations ont donné de nouvelles tables (relations) : vente, appro
• Enfin les tables partagent des attributs, souvent des clés qui permettent d'établir un lien entre les entités.
• Exemple : à partir d'un article je pourrai obtenir le nom du motif qui se trouve dans la table tissu
→ Identifier les clés étrangères dans les tables
4. Le langage SQL
C'est aujourd'hui le langage standard de manipulation des bases de données.
Apparu en 1975 par Chamberlin sur les travaux de Childs et de Codds, le SQL s'est imposé dans les années 80 avec les systèmes de gestion de bases de données relationnelles. Non détrôné à ce jour.
C'est avant tout un langage de définition des données : 4.1 création des tables
L'instruction CREATE permet de créer les tables, les attributs, les domaines de définition et spécifier les clés primaires et étrangères :
CREATE TABLE `modele` (
`id_modele` INTEGER PRIMARY KEY,
`prix_achat` REAL,
`prix_vente` REAL,
`nom_modele` TEXT);
Application
Nous utilisons le système de gestion de base SQLite avec une application DB Browser.
1. Créer une nouvelle base de donnée > pap.
2. Utiliser les commandes graphiques pour créer la table > tissu.
Créer les attributs, dans leur domaine de définition et définir la clé primaire.
3. Utiliser la syntaxe SQL pour créer les autres tables conformément au MLD ci-dessus (identifier les clés primaires et étrangères).
Les types courants en SQL
Type Description
INTEGER Entier 32 bits signé
REAL Flottant 32 bits
DECIMAL(t, f) Decimal avec t chiffres dont f après la virgule
VARCHAR(n) Chaîne d’au plus n caractères
CHAR(n) Chaîne de n caractères (espace vide pour compléter)
TEXT Chaîne de taille quelconque
BOOLEAN Alternative CHAR(1) et ‘V’ ou ‘F’
DATE Date au format ‘AAAA-MM-JJ’
TIMESTAMP Un instant au format ‘AAAA-MM-JJ – hh:mm:ss’
NULL Attention avec les contraintes d’intégrité
LML dataBase.odt 3/6 02/10/20
4.2 Spécification des contraintes a) Contraintes d’intégrité
Clés primaires : Nous avons vu au-dessus comment définir les clés primaires avec la syntaxe PRIMARY KEY. A noter la possibilité d’ajouter une incrémentation automatique pour les clés entières.
Clés étrangères : on utilise le mot clé REFERENCES suivi du nom de l’attribut dans la table où se trouve la référence.
FOREIGN KEY(`id_tissu`) REFERENCES `tissu`(`id`);
b) Contraintes utilisateur
IL est également possible d’imposer un format des données pour un attribut avec la syntaxe CHECK : CHECK (prix_vente >= 0);
Le type NULL sera utile également pour éviter des champs vides qte INT NOT NULL
Application
Terminer la définition de la base :
• tables
• clés
• contraintes.
Une fois terminée exporter > Fichier.Export votre base au format SQL en précisant votre nom (pap.nom.sql).
4.3 Suppression
DROP TABLE nom_table
Attention cette instruction supprime également les données.
A noter que vous ne pourrez pas supprimer des tables si elles ont liés à d’autres par des contraintes d’intégrité :) 4.4 Écriture des données dans la base
En pratique cette étape se fera par le biais d’une application qui génère le code SQL à partir d’une IHM ou également à partir de fichier contenant les données (CSV, JSON, XML).
Néanmoins le faire manuellement est une bonne façon d’apprendre.
INSERT INTO modele VALUES (110, ‘short’, 7.50, 23.99);
on peut également préciser l’ordre des attributs.
INSERT INTO modele (nom, id, prix_vente, prix_vente) VALUES (‘short’, 110, 23.99, 7.50);
La vérification des contraintes se fait au moment de l’insertion des données, c’est donc là que le système lèvera des erreurs.
Application
Vous allez créer :
• 3 tissus
• 4 modeles
• 15 articles
• 2 fournisseurs
• 3 clients avec leur adresse
• 3 appros
• 4 ventes
Organisez vous en binôme. La tache sera effectuée à partir d’un script SQL.
Bien sur vous pouvez essayer de faire le travail en utilisant Python et la library sqlite3. Quelques exemples simple s ici Cela prendra un peu de temps, mais s’avérera plus rapide si vous voulez insérer beaucoup de données.
...
5. L’exploitation des données en SQL
En travaillant sur le stockage des données, Childs affirme que l'on peut exprimer toute question avec seulement 3 fonctions de base : la "sélection", la "relation", le "regroupement".
La relation est établie. Reste la sélection et le regroupement.
5.1 Les requêtes de sélection SELECT FROM et WHERE
Votre BD de prêt à porter est crée et les données inserées. Vous pouvez visualiser celles-ci avec l’appli DB Browser…
cependant l’intérêt d’une base donnée relationnelle est dans l’extraction sélective des données que l’on peut en faire.
Je peux par exemple rechercher les modèles et leur prix de vente pour lesquels le prix achat est supérieur à 10.
SELECT nom_modele, prix_vente FROM modele WHERE prix_achat > 10
On pourrait également afficher tous les attributs de la table modèle dont le prix d’achat est < 20 SELECT * FROM modele WHERE prix_vente < 20;
On peux également donner des alias aux attributs :
SELECT nom_modele AS vetement FROM modele
5.2 Clauses COUNT, ORDER BY, DISTINCT
La clause COUNT permet d’affiche le nombre de résultats
SELECT COUNT (prix_vente) AS total FROM modele WHERE prix_vente > 10;
La clause ORDER BY permet de trier sur les valeurs d’un attribut
SELECT modele.nom_modele, modele.prix_vente FROM modele ORDER BY modele.prix_achat ASC Remarquez que l’on peut utiliser la notation table.attribut pour lever les ambiguïtés de nommage.
La clause DISTINCT permet de ramener seulement les valeurs distinctes d’une requête.
SELECT taille FROM article SELECT DISTINCT taille FROM article
5.3 La jointure : JOIN
La relation vente associe les relations article et client. Par elle je peux connaître toutes les ventes enregistrées
SELECT * FROM vente
Mais ce n’est pas très parlant…
Essayons de faire mieux :
LML dataBase.odt 5/6 02/10/20
SELECT * FROM vente
JOIN client ON vente.client = client.id_client La jointure se fait ici sur les clé primaire et étrangère qui définissent l’association des deux relations.
On peut bien sur choisir les attribut à afficher.
SELECT client.nom_client, vente.qte FROM vente
JOIN client ON vente.client = client.id_client
On peut bien sur ajouter les autres clauses avec les jointures.
5.4 Exercices
Une « vue » est la table que ramène une requête SQL sur la base.
Écrire le code SQL qui permet de créer les vues suivantes.
1. Nom des tous les modèles avec leur prix de vente 2. Le nombre d’articles avec le tissu « hibiscus » 3. Les tailles de tous les tshirts restant en stock.
4. Dans quelles villes ont été vendus des shorts (nom_modele)
5. Combien d’articles ont été vendus par le fournisseur (nom_fournisseur) 6. Afficher tous les couleurs de tissus des articles de taille S
7. Lister les articles, leur modele, nom de tissu, taille et qté en stock.