Apprendre à dessiner ce genre de diagramme à partir d'une spécification "client" plus ou moins précise.
Puis implémenter le schéma par exemple dans PostgreSQL.
L'analyse des données constitue le point de passage obligé de toute conception d'application mettant en oeuvre un SGBDR (Système de Gestion de Base de Données Relationnelle).
La suite du cours décrit un (petit) sous ensemble de la méthode MERISE — Méthode d'Étude et de Réalisation Informatique pour les Systèmes d'Entreprise —, basée sur le modèle entités-associations.
Alternatives : UML (modélisation) + méthodeNote : le cours reprend essentiellement une formation de Cyril Gruau disponible ici.
(Type-)Entité = population d'individus homogènes.
Exemple : clients, produits, fournisseurs...
(Type-)Association = lien logique entre plusieurs entités.
Exemple : acteur — jouer dans — film.
Remarque : pas de lien direct client — fournisseur.
Attribut = propriété d'une entité ou d'une association.
Attribut = Exemple pour un article : prix, date de péremption...
Identifiant = attribut unique pour une (instance d') entité.
Identifiant = Exemples : numéro de client, numéro de commande.
Remarques :
Une entité est faible si sa clé contient un attribut d'une autre entité, ou + généralement si elle n'a de sens qu'en lien avec une autre entité.
La cardinalité d'un lien entre une entité et une association précise le minimum et le maximum de fois qu'un individu de l'entité peut être concerné par l'association — dans un certain contexte.
Se poser la bonne question pour établir les cardinalités :
Deux même entités peuvent être plusieurs fois en association.
Association d'une entité avec elle-même, comme sur la figure.
Un employé...Une entité en relation 1,1 avec k autres où k ≥ 2 est susceptible d'être remplacée par une association d'arité k.
Il existe (au moins) un autre type de schéma, similaire mais provenant d'un cadre plus général : les diagrammes UML.
Langage de modélisation graphique unifiée utilisé pour spécifier et visualiser les documents nécessaires au bon développement d'une application orientée objet.
Toute entité remplaçable par une association doit être remplacée. Par exemple :
Cela fonctionne tant que les cardinalités sont 1,1 autour de l'entité.
Un nom d'entité, d'association ou d'attribut doit être unique.
Conseils :Chaque entité doit posséder un identifiant.
Conseils :L'identifiant sur un schéma entités-associations doit être un entier, de préférence incrémenté automatiquement.
Attributs calculables = prix totaux, moyennes...
Attributs calculables = (procédures stockées : cf. cours suivant)
Attention il peut y avoir des exceptions (calculs lourds...)
Un attribut d'association dépend des identifiants de toutes les entités en relation.
Éliminer les associations fantômes, redondantes ou en plusieurs exemplaires.
S'il existe deux chemins pour se rendre d'une entité à une autre, alors ils doivent avoir deux significations ou deux durées de vie différentes. Sinon on supprime le plus court, déductible à partir de l'autre.
Ex. : client £\leftrightarrow£ règlement / client £\leftrightarrow£ facture £\leftrightarrow£ règlement.
Remarque : dans un SGBDR on pourrait gérer les cardinalités intermédiaires via des triggers (cf. cours suivant).
Exercice : comment modéliser une relation de parenté ?
Les attributs prennent des valeurs atomiques.
Remarque : écrire les noms d'attributs au singulier aide à respecter cette règle.
1NF et les attributs non identifiants de l'entité dépendent de l'identifiant en entier (éventuellement composé).
2NF et les attributs non identifiants d'une entité dépendent uniquement de l'identifiant (éventuellement composé).
3NF et aucun attribut de l'identifiant ne dépend d'un attribut non identifiant.
Assume the following dependencies:
Pour établir efficacement un modèle entités-associations normalisé, on peut étudier au préalable les dépendances fonctionnelles entre les attributs, puis les organiser en un graphe de couverture minimale.
... On peut aussi commencer par chercher à normaliser le schéma puis itérer les différentes étapes jusqu'à obtenir un résultat satisfaisant.
S'intéresser aux dépendances fonctionnelles est aussi l'occasion d'introduire un peu de théorie dans ce que l'on a vu jusqu'alors.
Un attribut Y dépend fonctionnellement d'un attribut X si et seulement si une valeur de X induit une unique valeur de Y. On note une dépendance fonctionnelle par une flèche simple : £X \rightarrow Y£.
Ex. : si X est le numéro d'un client et Y son nom, alors £X \rightarrow Y£.
X peut aussi désigner un groupe d'attributs, et déterminer une unique valeur de Y. On parle de DF non élémentaire.
Notation : £X \rightarrow Y£, ou bien comme suit.
Exercice : réexprimer les formes normales 2 et 3 en terme de DFs.
Relation : ensemble d'attributs formant une unité logique.
Exemple : R(numéro article, nom article, prix unitaire)
Soient X et Y deux ensembles d'attributs.
Dépendance fonctionnelle totale (DFT) :
la dépendance £X \rightarrow Y£ est totale ssi. £\forall X' \subset X, X' \nrightarrow Y£.
Clé minimale (ou irréductible) :
X est une clé minimale de R ssi. £\forall X' \subset X£, £X'£ n'est pas une clé.
Exercice : exprimer "X,Y est une clé minimale de R(X,Y,Z,W)"
Exercice : à l'aide de connecteurs logiques.
Soient X, Y, Z, W des ensembles d'attributs
Soient X, Y, Z, W (pas forcément des mêmes entités).
Réflexivité : | £\quad Y \subseteq X \Rightarrow X \rightarrow Y£ |
Augmentation : | £\quad X \rightarrow Y \land W \subseteq Z \Rightarrow X,Z \rightarrow Y,W£ |
Transitivité : | £\quad X \rightarrow Y \land Y \rightarrow Z \Rightarrow X \rightarrow Z£ |
Pseudo-transitivité : | £\quad X \rightarrow Y \land Y,Z \rightarrow W \Rightarrow X,Z \rightarrow W£ |
Union : | £\quad X \rightarrow Y \land X \rightarrow Z \Rightarrow X \rightarrow Y,Z£ |
Décomposition : | £\quad X \rightarrow Y,Z \Rightarrow X \rightarrow Y \land X \rightarrow Z£ |
Théorème (de Heath, ou de décomposition de Casey-Delobel...) :
Soit une relation R(X,Y,Z) avec X, Y, Z groupes d'attributs disjoints.
Si £X \rightarrow Y£ alors la relation peut être divisée sans perte d'information :
££R(X,Y,Z) = R_1(X,Y) \underset{R_1.X = R_2.X}{\bowtie} R_2(X,Z)££
[Jorma Rissanen]
Soit la relvar R(X,Y,Z) dans laquelle X, Y et Z sont des sous-ensembles d'attributs de R. Si R satisfait aux dépendances fonctionnelles £X \rightarrow Y£ et £Y \rightarrow Z£, alors plutôt que de décomposer R en {X,Y} et {X,Z}, on décomposera R en {X,Y} et {Y,Z} :
££R(X,Y,Z) = R_1(X,Y) \underset{R_1.Y = R_2.Y}{\bowtie} R_2(Y,Z)££
Exemple :R(A,B,C,D,E) avec B → E ; A,B → C et C → D.
On prend X={A,B}, Y={C,E} et Z={D} :
££R(A,B,C,D,E) = R_1(A,B,C,E) \bowtie R_2(C,E,D)££
Une décomposition (binaire) de la relation £R(X = X_1,...,X_n)£ consiste en un couple de relation £R_1(Y), R_2(Z)£ telles que £Y \cup Z = X£.
Soit une décomposition de R en £R_1£ et £R_2£...La projection de l'ensemble des DF de R sur £R_1£ est l'ensemble des DF de R qui ont leurs attributs de départ et d'arrivée dans £R_1£.
Soient £R(X_1,...,X_n)£ une relation et £\mathcal{D}£ un ensemble de DF sur R.
Une dépendance fonctionnelle de £\mathcal{D}£ est dite canonique si son terme de droite ne contient qu'un attribut. Par exemple £A \rightarrow B£.
Fermeture transitive £\mathcal{F}(R)£ = ensemble des dépendances fonctionnelles engendrées par £\mathcal{D}£ (notation non standard). On note £\mathcal{D}^+£ la fermeture obtenue à partir de £\mathcal{D}£.
Couverture minimale £\mathcal{C}(R)£ = ensemble de DF canoniques sur R permettant de reconstruire £\mathcal{D}^+£ par fermeture transitive, et telle qu'aucune de ses DF ne soit redondante (£\forall f \in \mathcal{C}, (\mathcal{C} \backslash f)^+ \neq \mathcal{D}^+£).
Exemple : £R(A,B,C,D), \mathcal{D} = \{A,B \rightarrow C, C \rightarrow D\}£.
Fermeture transitive = £\{A,B \rightarrow C,D, C \rightarrow D\}£.
Couverture minimale = £\mathcal{D}£.
Graphe de couverture minimale : graphe orienté dont les noeuds représentent des attributs (atomiques), et les arêtes des dépendances fonctionnelles directes (non transitives).
Pour une présentation plus formelle, voir ceci par exemple.
Le schéma E/A correspondant apparaît en suivant quelques étapes simples...
Remarque :
En réalité il faut déjà connaître les entités en présence pour établir correctement le graphe de
couverture minimale, ne serait-ce que pour y faire figurer leurs identifiants.
Donc cette technique est surtout une aide pour établir les associations entre les entités et pour
normaliser les entités et leurs associations.
La conception d'une base de données peut démarrer par l'élaboration d'un schéma entités-associations.
Ce schéma doit respecter un certain nombre de règles pour éviter la redondances de données et permettre des évolutions sans repenser toute la structure, facilitant ainsi la maintenance de la base.
Des extensions de la méthode existent pour mieux modéliser certaines situations ; voir le document de Cyril Gruau par exemple.
L'étape suivante consiste à traduire un schéma E/A en un schéma intermédiaire (modèle logique) puis à l'implémenter dans un SGBD comme PostGreSQL (modèle physique).
Objectif : traduire le schéma E/A obtenu précédemment en un ensemble de tables prêtes à être crées dans la base.
Dans une première partie on cherche à obtenir une représentation intermédiaire : le schéma relationnel.
Ensuite, celui-ci sert de support à l'implémentation physique.
Pour chaque entité, on commence par rechercher les références à des clés d'autres entités, indiquées par des dièses #.
Exemple :
clients(numéro_client, nom_client, prénom_client, adresse_client)
commandes(numéro_comd, date_comd, #numéro_client (non vide))
Quelques contraintes peuvent être spécifiées sur les attributs, comme "unique" ou "not null" (non vide ci-dessus).
Intégrité référentielle : Le SGBD vérifie à chaque opération que les clés étrangères ne prennent que des valeurs autorisées.
Remarque :
Un schéma relationnel ne peut faire la différence entre 0,n et 1,n.
Par contre, il peut la faire entre 0,1 et 1,1 (cf. règles 2 et 4 à suivre).
Règle 1 : toute entité devient une table dans laquelle les attributs deviennent les colonnes. L'identifiant de l'entité constitue alors la clé primaire de la table.
Règle 2 : une association binaire de type 1 : n disparaît, au profit d'une clé étrangère dans la table côté 0,1 ou 1,1 qui référence la clé primaire de l'autre table. Cette clé étrangère ne peut pas recevoir la valeur vide si la cardinalité est 1,1.
fournisseurs(num_four, nom_contact, num_tel_contact)
livraisons(num_livr, date_livr, nom_livr, #num_four (non vide))
Règle 3 : une association binaire de type n : m devient une table supplémentaire (table de jointure, table d'association ...) dont la clé primaire est composée de deux clés étrangères (qui référencent les deux clés primaires des deux tables en association). Les attributs de l'association deviennent des colonnes de cette nouvelle table.
Règle 4 : une association binaire de type 1 : 1 est traduite comme une association binaire de type 1 : n, sauf que la clé étrangère se voit imposer une contrainte d'unicité en plus d'une éventuelle contrainte de non vacuité (cette contrainte d'unicité impose à la colonne correspondante de ne prendre que des valeurs distinctes).
Règle 5 : une association non binaire est traduite par une table supplémentaire dont la clé primaire est composée d'autant de clés étrangères que d'entités en association. Les attributs de l'association deviennent des colonnes de cette nouvelle table.
Si le schéma E/A a été bien normalisé, le schéma relationnel en découlant est en principa normalisé. Cependant, la normalisation peut avoir lieu à ce stade également.
Objectifs :Il existe huit formes normales graduelles, visant chacune une robustesse accrue et des économies de mémoire ; en pratique on se contente souvent des trois premières.
En général plus une table (ou relation) est normalisée, moins les performances (en temps d'exécution) sont bonnes. C'est pourquoi on préfère parfois dénormaliser a posteriori certaines parties d'une base pour améliorer ces performances.
Une relation (schéma de table) est en 1NF si aucun de ses attributs ne peut prendre de valeur qui soit elle-même un ensemble (une relation).
Cependant, PostGreSQL (et d'autres SGBDR) permet la création de types composés, pouvant être utilisés comme attributs. On peut les considérer comme atomiques (p.ex. nombres complexes), ou violant la 1NF selon les cas.
Exemples :
Nom | Instrument | Adresse |
---|---|---|
Albert | Piano | 12 rue des lilas |
Albert | Clavecin | 12 rue des lilas |
Andrea | Clarinette | 23 rue des mimosas |
Andrea | Hautbois | 23 rue des mimosas |
Andrea | Flûte | 23 rue des mimosas |
Antoine | Basson | 34 rue des tulipes |
Solution :
Nom | Instrument |
---|---|
Albert | Piano |
Albert | Clavecin |
Andrea | Clarinette |
Andrea | Hautbois |
Andrea | Flûte |
Antoine | Basson |
Nom | Adresse |
---|---|
Albert | 12 rue des lilas |
Andrea | 23 rue des mimosas |
Antoine | 34 rue des tulipes |
CREATE TABLE marins(nom, date_de_naissance) PRIMARY KEY(nom);
CREATE TABLE embarquements(
marin, date_embarquement, bateau, tonnage)
PRIMARY KEY(marin, date_embarquement);
Est-ce en 2NF ? En 3NF ? Si non, quel est le problème ?
CREATE TABLE marins(nom, date_de_naissance) PRIMARY KEY(nom);
CREATE TABLE embarquements(marin, date_embarquement, bateau)
PRIMARY KEY(marin, date_embarquement);
CREATE TABLE bateaux(bateau_ID, tonnage) PRIMARY KEY(bateau_ID);
Déf. donnée dans ce document, que vous êtes invités à lire.
Une relvar R est en forme normale de Boyce-Codd (BCNF) si et seulement si pour chaque dépendance fonctionnelle non triviale £A \rightarrow B£ qui doit être vérifiée par R, A est une surclé de R.
Décryptage :
Clé candidate = ensemble irréductible d'attributs noté X tel que
Clé candidate = £\forall Y \in R, X \rightarrow Y£.
Surclé = ensemble d'attributs noté X tel que £\forall Y \in R, X \rightarrow Y£.
Slide issu d'un cours de J. Akoka & I. Wattiau
"L'étudiant de numéro NUMETUD pratique le sport SPORT et suit le cours COURS"
NUMETUD | SPORT | COURS |
---|---|---|
100 | Foot | Maths |
100 | Foot | Anglais |
200 | Foot | Maths |
200 | Tennis | Anglais |
200 | Foot | Anglais |
200 | Tennis | Maths |
(Ronald Fagin, 1977) :
une relation est en 4NF si les seules DM (dépendances multivariées) sont celles dans lesquelles une clé multidétermine un attribut.
Définition : X "multidétermine" Y si pour chaque valeur (n-uplet) de X l'ensemble des valeurs (n-uplets) possibles pour Y est restreint, et que cet ensemble est indépendant des autres attributs.
Remarque : une DF est un cas particulier de DM.
Une dépendance de jointure (DJ) sur une relation R est la donnée d'un n-uplet £X_1,..., X_n£ de sous-ensembles d'attributs de R vérifiant ££R = \pi_{X_1}(R) \bowtie \pi_{X_2}(R) \bowtie \dots \bowtie \pi_{X_n}(R)££
Définition : une relation R est en 5NF si toutes les DJ sont impliquées par les clés.
Très rarement nécessaire... (?!)
DKNF (Domain/key normal form) par Ronald Fagin en 1981.
Every constraint on the table is a logical consequence of the table's domain constraints and key constraints.
6NF par C.J. Date, Hugh Darwen, et Nikos Lorentzos en 2002.
Table features no non-trivial join dependencies at all (with reference to generalized join operator).
Voir par exemple le cours de fsmrel sur developpez.com ou cette page Wikipedia.
Un modèle physique de donéees est l'implémentation particulière du modèle logique de données par un logiciel.
La traduction d'un MLD conduit à un MPD qui précise notamment le stockage de chaque donnée à travers son type et sa taille (en octets).
Pour de (très) grandes bases, cette traduction est l'occasion d'un certain nombre de libertés prises par rapport aux règles de normalisation afin d'optimiser les performances du système.
Exemple clients/achats/produits (association n : m).
Obtenir la liste des achats avec les nom des clients et produits nécessite deux jointures. C'est souvent une opération coûteuse.
Attention cependant : la mise à jour des noms demandera plus de travail sous cette forme (maintenance plus complexe).
Il n'est pas si fréquent de se voir confier la tâche de création d'une base de données à partir de rien. Souvent, une base existe déjà avec ses qualités et défauts.
Si des problèmes sont constatés sur cette base (performance, essentiellement), il peut être nécessaire de "défaire" la base de données pour mieux la reconstruire.
On convertit d'abord le modèle physique en un schéma relationnel normalisé, puis on passe à un schéma E/A (à suivre).
Situation nécessitant les règle 2 et 4 précitées :
(En fait issue d'une modélisation de type "héritage"...)
Un schéma E/A se traduit quasi automatiquement en un schéma relationnel, décrivant directement la structure des tables.
Il peut être nécessaire de dénormaliser certaines parties de la base si l'on constate des problèmes de performance.
Face à une base de données existante mais mal conçue, on peut suivre les étapes inverses :/