Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
| tc_info:2020_cm_relation [2021/01/04 14:25] – edauce | tc_info:2020_cm_relation [2024/06/28 15:18] (Version actuelle) – modification externe 127.0.0.1 | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ===== Bases de données relationnelles ===== | ||
| + | On introduit dans ce chapitre le **modèle relationnel** qui sert de fondation à la conception de bases de données. | ||
| + | |||
| + | Les différents modèles utiles en représentation des connaissances reposent sur des notions de base de la théorie des ensembles : | ||
| + | * Ensemble finis | ||
| + | * Éléments partiellement (ou totalement) discernables | ||
| + | |||
| + | ==== 1 Structures de données ==== | ||
| + | |||
| + | === 1.1 Production des données === | ||
| + | |||
| + | Tout commence par une fiche à remplir… | ||
| + | |||
| + | {{https:// | ||
| + | |||
| + | * Un formulaire se présentant sous la forme d’un ensemble de rubriques à remplir. | ||
| + | * Le **modèle de fiche** définit le format des données à enregistrer: | ||
| + | * liste des rubriques du formulaire, | ||
| + | * domaine de valeurs attendues dans chaque rubrique. | ||
| + | * A toute fiche remplie correspond un **jeu de valeurs** (ou mesure) : | ||
| + | * liste de valeurs correspondant au contenu d’une fiche particulière. | ||
| + | |||
| + | <note tip> | ||
| + | Un jeu de valeurs sert à décrire : | ||
| + | * une personne réelle : assuré, client, étudiant, auteur, plaignant, contribuable, | ||
| + | * une personne morale : fournisseur, | ||
| + | * un objet physique : article, véhicule, composant, ingrédient, | ||
| + | * un objet contractuel ou administratif : fiche de paye, contrat, procès verbal, billet, dossier... | ||
| + | * un lieu : salle, local, manufacture, | ||
| + | * un événement : transaction, | ||
| + | * etc... | ||
| + | </ | ||
| + | |||
| + | === 1.2 Stockage des données === | ||
| + | |||
| + | * D’un point de vue informatique, | ||
| + | * correspondant à l’encodage des données recueillies sur un support numérique | ||
| + | * Une **structure de données** définit les données de manière logique, | ||
| + | * c’est à dire l’ordre dans lequel elles doivent être lues | ||
| + | * et la manière dont elles doivent être interprétées par les programmes qui les utilisent. | ||
| + | |||
| + | <note tip> | ||
| + | Exemples de structures de données (cours d' | ||
| + | * listes, | ||
| + | * listes de listes, | ||
| + | * dictionnaires, | ||
| + | * arbres,... | ||
| + | </ | ||
| + | |||
| + | * Les types des valeurs étant déterminés (selon les cas de taille fixe ou variable), | ||
| + | * la **structure de données** correspond au “véhicule” qui servira à transporter et échanger les données (entre programmes, entre ordinateurs). | ||
| + | * Différentes structures de données sont possibles pour l’encodage et le stockage d’un jeu de valeurs, voir : | ||
| + | * Données non structurées | ||
| + | * Données vectorielles | ||
| + | * Tuples | ||
| + | * Données structurées | ||
| + | * Données Hiérarchisées | ||
| + | |||
| + | === Tuples=== | ||
| + | |||
| + | |||
| + | Le **Tuple** est la structure de données de base servant pour le recueil, le transport et le stockage des données. | ||
| + | |||
| + | <note important> | ||
| + | * Un **Tuple** est une liste, **finie**, **ordonnée** et **de taille fixe** contenant une suite de valeurs. | ||
| + | * Chaque valeur peut obéir à un format différent | ||
| + | * On note //m// la taille du tuple (nombre de valeurs) | ||
| + | $$ t = (a_1, ..., a_m) $$ | ||
| + | **Exemple :** | ||
| + | (" | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | === Données brutes === | ||
| + | *Textes, | ||
| + | *comptes rendus, | ||
| + | *série de notes, de valeurs sans format précis : | ||
| + | -> format texte en général. | ||
| + | |||
| + | < | ||
| + | Le format '' | ||
| + | * ASCII (caractères sans accent), | ||
| + | * utf8 (caractères accentués et spéciaux), | ||
| + | * ... | ||
| + | </ | ||
| + | |||
| + | === Données vectorielles=== | ||
| + | * Chaque jeu de valeurs est codé sous la forme d’un **vecteur** | ||
| + | * constitué de grandeurs entières ou réelles : | ||
| + | * toutes les valeurs sont quantitatives (numériques). | ||
| + | * C’est un encodage adapté aux grandeurs physiques : | ||
| + | * chaque champ du formulaire est codé dans un format numérique | ||
| + | * il est possible de représenter les données dans un espace vectoriel | ||
| + | |||
| + | <note important> | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | **Exemple** : | ||
| + | Considérons une station météorologique enregistrant à intervalle réguliers les données de ses capteurs : | ||
| + | * thermomètre, | ||
| + | * baromètre, | ||
| + | * hygromètre | ||
| + | * et anémomètre. | ||
| + | Un jeu de valeurs sera constitué de //5 réels double précision// | ||
| + | * la température, | ||
| + | * la pression, | ||
| + | * l’humidité, | ||
| + | * la vitesse | ||
| + | * et la direction du vent. | ||
| + | </ | ||
| + | |||
| + | |||
| + | === Tuples=== | ||
| + | |||
| + | **NB**: | ||
| + | * Les données sont organisées sous la forme d’une liste de valeurs qualitatives ou quantitatives. | ||
| + | * Le tuple est la structure de base servant pour la transmission des données (simple, facile à coder et à échanger). | ||
| + | --></ | ||
| + | |||
| + | **NB**: un **tuple** est une séquence (ordonnée et finie) de valeurs, chaque valeur pouvant être de type qualitatif ou quantitatif, | ||
| + | |||
| + | |||
| + | <note tip> | ||
| + | **Exemple** : considérons une fiche servant à décrire un étudiant. L’étudiant doit remplir les rubriques nom, prénom et âge, numero de voie, nom de la voie, code postal, ville. Chaque rubrique correspond à un composant d’un 7-tuplet tel que: | ||
| + | * les composants 1, 2, 5 et 7 sont des chaînes de caractères | ||
| + | * les composants 3, 4 et 6 sont des entiers | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | **Le format csv - “Comma Separated Values” ** | ||
| + | |||
| + | Chaque enregistrement est codé sur une ligne, chaque valeur étant séparé par un caractère séparateur (virgule, point-virgule, | ||
| + | |||
| + | Exemple : | ||
| + | Dubois, | ||
| + | |||
| + | Remarques : | ||
| + | * les données sont des chaînes de caractères | ||
| + | * les guillemets sont nécessaires lorsque la valeur contient le caractère séparateur (ici la virgule) | ||
| + | * les noms des attributs sont éventuellement indiqué sur une ligne séparée | ||
| + | </ | ||
| + | |||
| + | |||
| + | === Données indexées === | ||
| + | * Données organisées sous la forme d’une liste d’attributs. | ||
| + | * Chaque attribut est défini par un nom et un format (**type**). | ||
| + | * Chaque valeur est stockée sous la forme d’un couple (attribut : **valeur**). | ||
| + | |||
| + | <note tip> | ||
| + | **Exemple** : | ||
| + | |||
| + | Considérons une fiche servant à décrire un étudiant. L’étudiant doit remplir les rubriques nom, prénom et âge, numero de voie, nom de la voie, code postal, ville. | ||
| + | |||
| + | Chaque rubrique correspond à un attribut, où: | ||
| + | * nom, prenom, voie, et ville sont des attributs de type chaîne de caractères | ||
| + | * age et numero et code_postal sont des attributs de type entier | ||
| + | |||
| + | La structure de données sous-jacente est le **dictionnaire**, | ||
| + | </ | ||
| + | |||
| + | <note important> | ||
| + | Un **dictionnaire** est une liste non ordonnée de valeurs, chaque valeur étant associée à une clé unique (ici la clé est le nom de l’attribut). | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | **Le format json - JavaScript Object Notation** | ||
| + | |||
| + | Exemple : | ||
| + | {" | ||
| + | |||
| + | Remarques : | ||
| + | * reprend la syntaxe vue en Python | ||
| + | * données numériques ou chaînes de caractères | ||
| + | </ | ||
| + | |||
| + | |||
| + | === Données Hiérarchisées=== | ||
| + | |||
| + | * Organisation des données correspondant à une structure d’**arbre**. | ||
| + | * Dans le cas d’un recueil de données, correspond à la définition de rubriques et sous-rubriques. | ||
| + | |||
| + | <note tip> | ||
| + | **Exemples** : | ||
| + | * La rubrique **adresse** peut contenir les sous-rubriques **numero**, **voie**, **code_postal** et **ville**. | ||
| + | * Un document contient des **chapitres**, | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | |||
| + | Pour les données organisées de manière hiérarchique. Des balises servent à séparer les différents attributs. | ||
| + | |||
| + | Ex : | ||
| + | |||
| + | <nom> Dubois </ | ||
| + | < | ||
| + | < | ||
| + | <num> 28 </ | ||
| + | < | ||
| + | <code postal> 45000 </code postal> | ||
| + | < | ||
| + | </ | ||
| + | < | ||
| + | |||
| + | remarque : le format '' | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | === Tableaux de données === | ||
| + | |||
| + | Un tableau de données est une liste (finie et ordonnée) de tuples, chaque tuple obéissant à un même schéma $R$. | ||
| + | |||
| + | {{https:// | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== 2. Schéma et relation ==== | ||
| + | |||
| + | 2 approches en modélisation : | ||
| + | * approche ensembliste (plus général) | ||
| + | * modèle relationnel (plus pratique) | ||
| + | |||
| + | <note important> | ||
| + | Le **Modèle relationnel** sert à représenter logiquement les **tableaux de données**. | ||
| + | </ | ||
| + | < | ||
| + | **Tableau de données** | ||
| + | |||
| + | Un tableau de données est une liste (finie et ordonnée) de tuples, chaque tuple obéissant à un même schéma $R$. | ||
| + | |||
| + | {{https:// | ||
| + | </ | ||
| + | |||
| + | Rappel: | ||
| + | * Un enregistrement est un jeu de valeurs organisé sous forme de **tuple** | ||
| + | * A un tuple on associe | ||
| + | {{public: | ||
| + | |||
| + | * Définir un **schéma** consiste à définir : | ||
| + | * une liste d' | ||
| + | * A chaque **attribut** correspond : | ||
| + | * un // | ||
| + | * un //domaine// de valeurs (type/ | ||
| + | |||
| + | * Soit $R(A_1, ..., A_m)$ un schéma. | ||
| + | * On note $\text{dom}(A_i)$ le domaine associé à l' | ||
| + | * On dit d'un tuple $t$ qu'il //obéit au schéma $R$// si les valeurs qu'il contient correspondent aux domaines des attributs du schéma. | ||
| + | |||
| + | |||
| + | |||
| + | <note important> | ||
| + | **Définition** | ||
| + | |||
| + | Soit $R = (A_1, | ||
| + | |||
| + | Une **relation** $r$ obéissant au schéma $R$ est un // | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | **Corollaire** : une relation est un **ensemble** de tuples : | ||
| + | $$ r = \{t_1, ..., t_n\} = \{ (a_{11}, ..., a_{1m}), ..., (a_{n1}, ..., a_{nm})\}$$ | ||
| + | |||
| + | * avec : | ||
| + | * $\forall (i,j), a_{ij} \in \text{dom}(A_j), | ||
| + | * $\forall i, t_i \in \text{dom}(A_1) \times ... \times \text{dom}(A_m)$ | ||
| + | * $n$ : nombre de tuples | ||
| + | * $m$ : nombre d' | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | **Remarque :** | ||
| + | * Le **schéma** $R$ représente le niveau abstrait (modélisation) | ||
| + | * La **relation** $r$ représente un cas concret de réalisaton (à un schéma $R$ peuvent correspondre une infinité de réalisations possibles : $r$, $r'$, $r'' | ||
| + | </ | ||
| + | |||
| + | |||
| + | < | ||
| + | |||
| + | __[[public: | ||
| + | |||
| + | {{public: | ||
| + | |||
| + | __[[public: | ||
| + | |||
| + | {{public: | ||
| + | |||
| + | __[[public: | ||
| + | |||
| + | **Client**(nom, | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | < | ||
| + | ** __Exemples de schémas relationnels__ :** | ||
| + | |||
| + | **Étudiant**(nom, | ||
| + | |||
| + | **Ouvrage**(titre, | ||
| + | |||
| + | **Véhicule**(immatriculation, | ||
| + | </ | ||
| + | |||
| + | ==== 3. Dépendances fonctionnelles ==== | ||
| + | |||
| + | * Au sein d'un schéma $R$, | ||
| + | * Il peut exister un ensemble de contraintes, | ||
| + | * portant sur les attributs (plus précisément sur les valeurs prises par les attributs). | ||
| + | * L' | ||
| + | * On parle de **contraintes d’intégrité**. | ||
| + | * Ces contraintes s’expriment sous la forme de **dépendances fonctionnelles**. | ||
| + | |||
| + | < | ||
| + | **Rappels d’algèbre de base:** | ||
| + | |||
| + | * **Relation binaire** : une relation binaire $r$ portant sur deux domaines $\text{dom}(A)$ et $\text{dom}(B)$: | ||
| + | * est un sous-ensemble du produit cartésien $\text{dom}(A) \times \text{dom}(B)$. | ||
| + | * si $(a,b) \in r$, on note parfois $a r b$ ce qui signifie “a est en relation avec b”. | ||
| + | * **Fonction** : une fonction $f : \text{dom}(A) \rightarrow | ||
| + | * pour tout $a \in \text{dom}(A)$, | ||
| + | * il existe un unique $b$ tel que $(a,b) \in f$. | ||
| + | * On note $b=f(a)$ , | ||
| + | * ce qui signifie qu'au sein de la relation $f$, $b$ est déterminé de façon unique par le choix de $a$ (autrement dit : “b dépend de a”) | ||
| + | </ | ||
| + | |||
| + | <note important> | ||
| + | **Dépendance fonctionnelle** | ||
| + | |||
| + | * Soit $r$ une relation définie selon $R(A_1, | ||
| + | * Soient $X$ et $Y$ deux sous-ensembles de $R$ | ||
| + | * On dit que la relation $r$ définit une // | ||
| + | * notée $X \stackrel{r}{\rightarrow} Y$ | ||
| + | * si les valeurs de $r$ permettent de définir une fonction de $\text{dom}(X)$ vers $\text{dom}(Y)$. | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | **__Exemple 1__** : | ||
| + | |||
| + | Soit la relation $r$: | ||
| + | ^ A ^ B ^ C ^ | ||
| + | | 1 | a | e | | ||
| + | | 2 | b | f | | ||
| + | | 2 | c | f | | ||
| + | | 3 | d | k | | ||
| + | | 4 | d | k | | ||
| + | |||
| + | * On a les dépendances suivantes : | ||
| + | * $A \rightarrow C$ | ||
| + | * $B \rightarrow C$ | ||
| + | * mais pas : $A \rightarrow B$, $B \rightarrow A$, ni $C \rightarrow A$ | ||
| + | * On a aussi : | ||
| + | * $A,B \rightarrow C$ | ||
| + | * mais pas : $B,C \rightarrow A$, ni $A,C \rightarrow B$, etc. | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | **__Exemple 2__** : | ||
| + | |||
| + | * Soit le schéma : | ||
| + | * **Commande** (num_client, | ||
| + | * et l’ensemble de contraintes | ||
| + | $$ \begin{array}{rl}F &= \{\\ | ||
| + | & \text{num_client, | ||
| + | & \text{num_article, | ||
| + | &\} | ||
| + | \end{array} | ||
| + | $$ | ||
| + | * La première contrainte indique qu'il ne peut y avoir deux factures émises pour un même client à une date donnée. | ||
| + | * La seconde contrainte indique que le prix payé dépend de l’article et de la quantité commandée. | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | **__Exemple 3__** : | ||
| + | * Soit le schéma : | ||
| + | * **Ouvrage** (titre, auteur, éditeur, prix, date_edition) | ||
| + | * et la contrainte : | ||
| + | * {titre, auteur, éditeur → prix, date_édition} | ||
| + | La contrainte signifie : | ||
| + | * “//pour une oeuvre chez un certain éditeur, une seule édition est possible (pas de réédition à une date ultérieure)// | ||
| + | * “// | ||
| + | |||
| + | </ | ||
| + | |||
| + | < | ||
| + | **Exercice :** | ||
| + | Soit le schéma : | ||
| + | |||
| + | * **Réservation**(code_appareil, | ||
| + | |||
| + | Exprimer la dépendance fonctionnelle : | ||
| + | * « //Un appareil ne peut pas être utilisé dans deux locaux différents au même moment //» | ||
| + | </ | ||
| + | |||
| + | * Il importe donc de bien réfléchir, | ||
| + | * du réalisme et du caractère limitant de certaines dépendances fonctionnelles, | ||
| + | * et du caractère éventuellement limitant du choix des attributs. | ||
| + | * Ainsi, le schéma décrivant les commandes (exemple 2) | ||
| + | * ne permet pas de commander des articles de nature différente au sein d'une même commande | ||
| + | * (un client, pour commander deux râteaux et une truelle, doit donc effectuer deux commandes, qui plus est à des dates différentes!). | ||
| + | |||
| + | < | ||
| + | |||
| + | Soit le schéma relationnel suivant : | ||
| + | |||
| + | **Billet**(num_train, | ||
| + | |||
| + | Définir des dépendances fonctionnelles sur cet ensemble d' | ||
| + | </ | ||
| + | |||
| + | ==== 4. Clé d'une relation==== | ||
| + | |||
| + | === 4.1 Définitions === | ||
| + | * Soit un schéma $R(A_1, ..., A_m)$. | ||
| + | <note important> | ||
| + | **Clé** | ||
| + | |||
| + | * Une **clé** $K$ : | ||
| + | * est un ensemble **minimal** d' | ||
| + | * tel que toute relation $r$ de schéma $R$ définit une dépendance fonctionnelle de $dom(K)$ dans $dom(R)$, | ||
| + | * cette dépendance est notée $K \rightarrow R$. | ||
| + | </ | ||
| + | < | ||
| + | * **Remarques** : | ||
| + | * Si un schéma $R$ possède une clé $K$, alors tous les éléments d’une relation $r$ de schéma $R$ sont discernables : la valeur de la clé permet d’identifier de façon unique chaque élément de l’ensemble. | ||
| + | * Au sein d'un schéma, il est souvent possible de définir plusieurs clés à partir des attributs. Le concepteur du modèle choisit une clé parmi les clés possibles. Cette clé est appelée **clé primaire**. | ||
| + | * Graphiquement, | ||
| + | {{public: | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | **__Exemple 1__** : | ||
| + | |||
| + | {{public: | ||
| + | |||
| + | </ | ||
| + | |||
| + | < | ||
| + | **__Exemple 2__** : | ||
| + | |||
| + | {{public: | ||
| + | |||
| + | *Pour certains schémas, | ||
| + | * il est courant de définir comme clé un entier **identifiant de façon unique** chaque élément de l' | ||
| + | * La clé est alors constituée de cet attribut unique. | ||
| + | {{public: | ||
| + | |||
| + | **Représentation [[public: | ||
| + | {{public: | ||
| + | |||
| + | </ | ||
| + | |||
| + | === 4.2 Axiomes d' | ||
| + | |||
| + | Soit $K$ une clé candidate. On démontre que $K \rightarrow R$ à l'aide des //axiomes d' | ||
| + | |||
| + | <note tip> **Axiomes d' | ||
| + | |||
| + | - **Réflexivité** : $$Y \subseteq X | ||
| + | - **Augmentation** : $$X \rightarrow Y \Rightarrow X,Z \rightarrow Y,Z$$ | ||
| + | - **Transitivité** : $$X \rightarrow Y \text{ et } Y \rightarrow Z \Rightarrow X \rightarrow Z$$ | ||
| + | - **Pseudo-transitivité** : $$X \rightarrow Y \text{ et } Y,W \rightarrow Z \Rightarrow X,W \rightarrow Z$$ | ||
| + | - **Union** : $$X \rightarrow Y \text{ et } X \rightarrow Z \Rightarrow X \rightarrow Y,Z$$ | ||
| + | - **Décomposition** : $$X \rightarrow Y, Z \Rightarrow X \rightarrow Y \text{ et } X -> Z$$ | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | |||
| + | Soit le schéma relationnel suivant : | ||
| + | |||
| + | **Billet**(num_train, | ||
| + | |||
| + | Montrer que l' | ||
| + | </ | ||
| + | |||
| + | ==== 4. Normalisation d'un schéma==== | ||
| + | __**Tables mal construites**__ | ||
| + | < | ||
| + | ** Exemple : fournisseurs de composants électroniques: | ||
| + | |||
| + | $$\textbf{Fournisseur}(\underline{\text{nom_f, | ||
| + | |||
| + | * **Problèmes :** | ||
| + | * **Redondance** : l’adresse des fournisseurs est répétée plusieurs fois | ||
| + | * **Inconsistance** : mauvaise mise à jour => adresses différentes pour un même fournisseur. | ||
| + | * **Problème Insertion** : on ne peut pas insérer dans la table un fournisseur qui ne fournit rien | ||
| + | * **Problème suppression** : si un fournisseur ne fournit plus rien, on perd son adresse | ||
| + | * Solution? | ||
| + | |||
| + | * Couper la table en 2? | ||
| + | <note warning> | ||
| + | $$\textbf{Fournisseurs} (\text{nom_f, | ||
| + | $$\textbf{Catalogue}(\text{composant, | ||
| + | </ | ||
| + | --> Impossible de retrouver les prix pratiqués par les différents fournisseurs. | ||
| + | |||
| + | |||
| + | * Nouveau Schéma : | ||
| + | <note tip> | ||
| + | $$\textbf{Fournisseurs} (\text{nom_f, | ||
| + | $$\textbf{Catalogue}(\text{nom_f, | ||
| + | </ | ||
| + | --> Il est possible de reconstruire la table initiale en effectuant une jointure entre ces 2 tables sur l’attribut '' | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | < | ||
| + | **Exercice** : Les tables suivantes sont-elles bien ou mal construites? | ||
| + | |||
| + | * **Enseignement** (__id_enseignant__, | ||
| + | |||
| + | * **Arrêt** (__num_train__, | ||
| + | |||
| + | * **Facture** (__id_client, | ||
| + | </ | ||
| + | |||
| + | ==== 5. Formes Normales ===== | ||
| + | **__Les Formes normales__** | ||
| + | * Restreignent les dépendances admises dans un schéma relationnel | ||
| + | * Permettent d’éviter la duplication de l’information au sein des relations | ||
| + | * Définissent une méthode | ||
| + | * de **décomposition** d’un schéma relationnel redondant | ||
| + | * en plusieurs schémas //liés entre eux//: | ||
| + | |||
| + | === 5.1 2ème forme normale (2FN) === | ||
| + | <note important> | ||
| + | **Dépendance fonctionnelle élémentaire (DFE) ** | ||
| + | * Soit $R$ un schéma relationnel | ||
| + | * Soit $X$ un ensemble d’attributs ⊆ $R$ | ||
| + | * Soit $A$ un attribut de $R$ | ||
| + | * Il existe une DFE entre $X$ et $A$ ssi : | ||
| + | * $X \rightarrow | ||
| + | * Il n’existe aucun sous-ensemble $Y$ ⊆ $X$ tel que $Y \rightarrow A$ | ||
| + | </ | ||
| + | |||
| + | <note important> | ||
| + | **2ème forme normale (2FN) ** | ||
| + | |||
| + | * Un schéma $R$ est en 2FN : | ||
| + | * ssi la clé primaire de $R$ est en DFE avec tous les autres attributs. | ||
| + | * Donc : il n’y a pas d’attributs qui ne dépendent que d’une partie de la clé. | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | **Exemple :** | ||
| + | $$\textbf{Fournisseur}(\underline{\text{nom_f}, | ||
| + | $$\text{nom_f} \rightarrow | ||
| + | $$\text{nom_f}, | ||
| + | ⇒ Pas 2FN!! | ||
| + | </ | ||
| + | |||
| + | === 5.2 Normalisation 2FN === | ||
| + | * Lorsqu’un schéma relationnel n’est pas en deuxième forme normale, __il doit être **normalisé**__: | ||
| + | |||
| + | < | ||
| + | **Normalisation 2FN** : | ||
| + | * Pour obtenir un schéma 2FN: | ||
| + | * on “// | ||
| + | * La normalisation consiste: | ||
| + | * à créer une nouvelle table pour chaque DFE ainsi trouvée. | ||
| + | |||
| + | * Soit : | ||
| + | $$\mathbf{R} (\underline{A_1, | ||
| + | * avec : | ||
| + | $$\color{red}{A_i} \stackrel{DFE}{\rightarrow} \color{red}{B_j}$$ | ||
| + | $$A_1, | ||
| + | * Alors le schéma de table doit être modifié comme suit : | ||
| + | $$\mathbf{R_1} (\underline{A_1, | ||
| + | $$\mathbf{R_2} (\underline{\color{red}{A_i}}, | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | Même si aucun attribut ne dépend plus de la clé primaire initiale, il est important de la conserver dans une table spécifique (elle sert à “lier” les valeurs dispersées dans les différentes tables). | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | **__Exemple__** | ||
| + | * __Avant__: | ||
| + | $$\textbf{Fournisseur}(\underline{\text{nom_f, | ||
| + | $$\text{nom_f} \rightarrow \text{adresse_f}$$ | ||
| + | $$\text{nom_f, | ||
| + | * __Après__: | ||
| + | $$\textbf{Catalogue}(\underline{\text{nom_f, | ||
| + | $$\textbf{Fournisseur}(\underline{\text{nom_f}}, | ||
| + | |||
| + | < | ||
| + | **Remarque :** le schéma est maintenant constitué de deux tables. | ||
| + | * Les tables ont un attribut commun : //nom_f// (clé primaire de la table Fournisseur). | ||
| + | * La clé primaire de la table des Fournisseurs est dupliquée dans la table des prix (appelée ici **Catalogue**). | ||
| + | * On dit que //nom_f// est une **clé étrangère** de la table des prix (l’attribut fait référence à la clé primaire d’une autre table, en l’occurrence la table des fournisseurs - voir [[public: | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | === 5.3 3ème forme normale (3FN) === | ||
| + | |||
| + | <note important> | ||
| + | **Dépendance Fonctionnelle Directe (DFD) :** | ||
| + | |||
| + | La dépendance fonctionnelle entre 2 attributs $A_i$ et $A_j$ est //directe// s’il n’existe pas de $A_k$ tel que : | ||
| + | $$A_i \rightarrow | ||
| + | </ | ||
| + | |||
| + | <note important> | ||
| + | **3ème Forme Normale (3FN)** | ||
| + | |||
| + | Un schéma est 3FN : | ||
| + | * S’il est 2FN | ||
| + | * Si tous les attributs sont en DFD avec la clé. | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | **Exemple :** | ||
| + | |||
| + | $$\textbf{Commande} (\underline{\text{num_commande}}, | ||
| + | $$\text{num_commande} \rightarrow \text{nom_f, | ||
| + | $$\text{nom_f} \rightarrow \text{adresse_f}$$ | ||
| + | |||
| + | Le schéma n’est pas 3FN!! (dépendance transitive entre num_commande et adresse) | ||
| + | </ | ||
| + | |||
| + | |||
| + | === 5.4 Normalisation 3FN === | ||
| + | * Lorsqu’un schéma relationnel n’est pas en troisième forme normale, __il doit être **normalisé**__: | ||
| + | |||
| + | < | ||
| + | **Normalisation 3FN** | ||
| + | * On crée une table pour chaque DFD trouvée au sein des attributs n' | ||
| + | |||
| + | |||
| + | Soit : | ||
| + | $$R (\underline{A_1, | ||
| + | avec : | ||
| + | $$A_1, ..., A_m \stackrel{DFD}{\rightarrow} B_1, ..., | ||
| + | $$\color{red}{B_i} \stackrel{DFD}{\rightarrow} \color{red}{B_j}$$ | ||
| + | Alors : | ||
| + | $$R_1 (\underline{A_1, | ||
| + | $$R_2 (\underline{\color{red}{B_i}}, | ||
| + | |||
| + | <note important> | ||
| + | ** Attention ** | ||
| + | |||
| + | Comme précédemment, | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | < | ||
| + | |||
| + | __Avant__ : | ||
| + | * **Commande** (__num_commande__, | ||
| + | * avec : | ||
| + | * num_commande → nom_f, composant, quantité | ||
| + | * nom_f → adresse_f | ||
| + | |||
| + | __Après__ : | ||
| + | * **Commande** (__num_commande__, | ||
| + | * **Client** (__nom_f__, adresse_f) | ||
| + | |||
| + | L’attribut nom_f est maintenant clé primaire de la table Client et clé étrangère de la table Commande. | ||
| + | </ | ||
| + | |||
| + | ==== 6. Modèle ensembliste ==== | ||
| + | |||
| + | |||
| + | <note tip> | ||
| + | Pour leur conception, les bases de données sont ici vues comme des ensembles constitués de plusieurs populations d' | ||
| + | </ | ||
| + | |||
| + | Une base de donnée est constituée de plusieurs ensembles d' | ||
| + | |||
| + | __Exemple 1 :__ | ||
| + | * Ensembles d' | ||
| + | * Ensembles de commandes | ||
| + | * Ensembles d' | ||
| + | * Ensembles de clients | ||
| + | |||
| + | __Exemple 2 :__ | ||
| + | * Ensembles d' | ||
| + | * Ensembles de séances | ||
| + | * Ensembles de cours | ||
| + | * Ensembles de copies | ||
| + | |||
| + | On parle plus généralement d' | ||
| + | |||
| + | |||
| + | |||
| + | <note tip> | ||
| + | ** Le modèle entité/ | ||
| + | |||
| + | Le modèle entité/ | ||
| + | |||
| + | Le modèle entités/ | ||
| + | |||
| + | </ | ||
| + | |||
| + | === Généralités === | ||
| + | |||
| + | Une **entité** $x$ | ||
| + | * est une représentation d'un objet du monde réel, | ||
| + | * appartenant au système/à l' | ||
| + | * Une entité est décrite par une ou plusieurs valeurs caractéristiques, | ||
| + | |||
| + | Les informations conservées au sujet des entités d'un ensemble sont les **attributs**. | ||
| + | * Chaque **attribut** : | ||
| + | * a un **nom** unique dans le contexte de cet ensemble d' | ||
| + | * Exemples de noms concrets : // | ||
| + | * prend ses valeurs dans un domaine bien spécifié, | ||
| + | * également appelé le **type** de l' | ||
| + | * Le domaine d'un attribut est noté $\text{dom}(Aj)= Dj$. | ||
| + | * Exemples : | ||
| + | * $\text{dom}(couleur)={rouge, | ||
| + | * $\text{dom}(nom) = $ensemble des chaînes de caractères, | ||
| + | * $\text{dom}(salaire) =$ entiers naturels | ||
| + | * etc... | ||
| + | <note important> | ||
| + | * Un attribut $A_j$ est une fonction à valeur sur $D_j$ : | ||
| + | $$A_j : E \rightarrow D_j$$ | ||
| + | $$x \mapsto | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | * Un attribut peut être : | ||
| + | * simple ou composé. | ||
| + | * Exemple : une //adresse// peut être décrite par une simple chaîne de caractères, | ||
| + | * obligatoire ou facultatif ($D_j$ peut ou non contenir la valeur ø ). | ||
| + | * atomique ou non (Un attribut peut posséder 0, 1 voire plusieurs valeurs...) | ||
| + | </ | ||
| + | |||
| + | |||
| + | Un **ensemble d' | ||
| + | $$E = \{x_1, | ||
| + | Il regroupe (ou associe) plusieurs entités ayant des caractéristiques communes (descriptibles à l'aide du même ensemble d' | ||
| + | |||
| + | <note tip> | ||
| + | **Exemples** : | ||
| + | * les employés d'une firme, | ||
| + | * les cours de Centrale Méditerranée, | ||
| + | * une collection de disques, | ||
| + | * etc… | ||
| + | </ | ||
| + | |||
| + | * Les éléments d’un ensemble d’entités sont // | ||
| + | * les attributs $(A_1, | ||
| + | * Le schéma $R$ de l’ensemble $E$ est une // | ||
| + | * Soit : | ||
| + | $$ R : \mathcal{X} \rightarrow D_1 \times ... \times D_m$$ | ||
| + | $$ x_i \mapsto (A_1(x_i), | ||
| + | |||
| + | <note tip> | ||
| + | ** représentation graphique ** : | ||
| + | |||
| + | {{public: | ||
| + | |||
| + | </ | ||
| + | |||
| + | < | ||
| + | ** Exemples **: | ||
| + | |||
| + | {{public: | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | | ||
| + | |||
| + | === Définitions === | ||
| + | |||
| + | Modéliser une base de données, c'est : | ||
| + | * Identifier les différents ensembles en interaction | ||
| + | * Identifier les liens de dépendance entre les différents ensembles | ||
| + | |||
| + | < | ||
| + | {{public: | ||
| + | </ | ||
| + | < | ||
| + | {{public: | ||
| + | </ | ||
| + | < | ||
| + | {{public: | ||
| + | </ | ||
| + | <note tip> | ||
| + | Les liens entre les différents ensembles sont appelés des **associations** | ||
| + | </ | ||
| + | |||
| + | === Association === | ||
| + | |||
| + | <note important> | ||
| + | Une association exprime des relations de dépendance entre deux ou plusieurs ensembles d’entités. | ||
| + | |||
| + | **Définition** : Une **association** entre les ensembles $E_1$, ..., $E_k$ est un sous-ensemble du produit $E_1 \times ... \times E_k$. | ||
| + | |||
| + | Il s'agit donc d'un ensemble de k-uplets $\{..., (x_1, | ||
| + | |||
| + | où $k$ est le degré de l' | ||
| + | * k=2 : association binaire | ||
| + | * k=3 : association ternaire | ||
| + | * etc… | ||
| + | |||
| + | </ | ||
| + | |||
| + | === Rôles des associations === | ||
| + | * // | ||
| + | * // | ||
| + | * // | ||
| + | * // | ||
| + | * ... | ||
| + | |||
| + | |||
| + | === Contraintes de cardinalité === | ||
| + | |||
| + | <note tip> | ||
| + | Pour chaque ensemble participant à une association, | ||
| + | |||
| + | On donne en général un intervalle $[b_\text{inf}, | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | === Représentation graphique === | ||
| + | |||
| + | **Associations binaires** | ||
| + | |||
| + | |{{public: | ||
| + | |{{public: | ||
| + | |{{public: | ||
| + | |||
| + | **Associations ternaires** | ||
| + | |||
| + | | {{public: | ||
| + | |||
| + | |||
| + | === Types d' | ||
| + | |||
| + | **Associations de 1 à plusieurs (fonctionnelle)** | ||
| + | |||
| + | Relation non symétrique entre les deux ensembles : […,1] d'un côté, […,N] de l' | ||
| + | Relation de type contenant/ | ||
| + | Il s'agit du type d' | ||
| + | |||
| + | <note tip> | ||
| + | On dit parfois que l’ensemble dont la participation est unique est dit “à gauche” de l’association fonctionnelle, | ||
| + | |||
| + | “à gauche” → “à droite” | ||
| + | </ | ||
| + | |||
| + | |{{public: | ||
| + | |{{public: | ||
| + | |||
| + | **Associations de plusieurs à plusieurs (croisée)** | ||
| + | |||
| + | Dans une association “croisée”, | ||
| + | |||
| + | |{{public: | ||
| + | |{{public: | ||
| + | |||
| + | === Modèles Entité Associations valués === | ||
| + | |||
| + | <note important> | ||
| + | Dans le cadre du modèle entité/ | ||
| + | * les attributs des ensembles d' | ||
| + | * Soit $A$ un attribut de l' | ||
| + | $$ A : \mathcal{E} \rightarrow \text{dom}(A) $$ | ||
| + | * les attributs des associations sont des // | ||
| + | * Soit $B$ un attribut de l' | ||
| + | $$ B : \mathcal{E}\times \mathcal{F}\rightarrow \text{dom}(B) $$ | ||
| + | </ | ||
| + | |||
| + | ** Mesures ** | ||
| + | * Les mesures sont les données saisies sur les éléments d'un ensemble. Chaque mesure est associée à un attribut. | ||
| + | * Le schéma de l' | ||
| + | * Les éléments de l' | ||
| + | * Une //clé// est un ensemble d' | ||
| + | |||
| + | <note tip> **TODO** | ||
| + | |||
| + | Ensembles discernables / non discernables | ||
| + | </ | ||
| + | ** Opérateurs ** | ||
| + | * On s’intéresse ici aux associations qui représentent une “opération” (inscription, | ||
| + | * Lors d’une mise à jour de la base, certains événements tels que l’emprunt ou le retour d’un ouvrage, l’affectation d’un employé à un poste, | ||
| + | * Il est possible de garder une trace des événements passés en mettant un (ou plusieurs) attributs sur une association. | ||
| + | * Ainsi, certaines associations peuvent être " | ||
| + | * avoir lieu à une date | ||
| + | * ou prendre place sur une durée précise (prêt, | ||
| + | * On peut ainsi mémoriser : | ||
| + | * " | ||
| + | * " | ||
| + | |||
| + | |||
| + | |||
| + | <note tip> | ||
| + | **Exemple** | ||
| + | " | ||
| + | |{{public: | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | **Exemple** | ||
| + | * Chaque coureur est décrit par ses nom, prénom, nationalité et numéro de maillot. | ||
| + | * Chaque coureur appartient à une équipe qui possède un numéro, un sponsor associé. | ||
| + | * Chaque coureur participe à une ou plusieurs étapes. Une étape se caractérise par son numéro, son type (contre la montre/ | ||
| + | * A chaque étape est associée un classement d' | ||
| + | |||
| + | |{{public: | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== 7. Traduction vers le modèle relationnel ==== | ||
| + | |||
| + | Il est possible de traduire un modèle entité/ | ||
| + | |||
| + | <note tip> | ||
| + | Lors de la réalisation d'une base de données, on passe en général par les étapes suivantes: | ||
| + | - Conception de la base sous forme d'un modèle entité/ | ||
| + | - Traduction sous la forme d'un modèle relationnel. | ||
| + | - Normalisation (voir [[https:// | ||
| + | - Mise en œuvre informatique. | ||
| + | </ | ||
| + | |||
| + | Un petit nombre de règles permettent de traduire un modèle entité/ | ||
| + | * Selon ces règles, à la fois les ensembles d' | ||
| + | * Les liaisons et dépendances entre schémas de relation sont assurés par la définition des **clés étrangères** (attributs communs à plusieurs tables). | ||
| + | |||
| + | === Schéma de base et clé étrangère === | ||
| + | |||
| + | <note important> | ||
| + | * Un schéma (ou modèle) de bases de données est un ensemble fini de schémas de relation. | ||
| + | * Une base de données est un ensemble fini de relations. | ||
| + | * Les liens et associations entre relations entre s’expriment sous la forme de **clés étrangères** | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | **Définition** | ||
| + | |||
| + | * Au sein d'un schéma relationnel $R$, Une clé étrangère est un attribut (ou un groupe d' | ||
| + | * La présence d'une clé étrangère au sein d'une relation $r$ de schéma $R$ introduit une contrainte d' | ||
| + | * la valeur des attributs de la clé étrangère d'un tuple de $r$ doit être trouvée dans la table s correspondante. | ||
| + | * On indique la présence d'une clé étrangère à l'aide de pointillés : {…, __C__l__é__ __é__t__r__a__n__g__è__r__e__, | ||
| + | </ | ||
| + | |||
| + | |||
| + | **Exemple ** | ||
| + | < | ||
| + | **Schéma de base relationnelle** : | ||
| + | |||
| + | * **Clients** ( __nom_client__, | ||
| + | * **Commandes** ( __num_Commande__, | ||
| + | * **Fournisseurs** ( __nom_fournisseur__, | ||
| + | * **Catalogue** ( __nom_fournisseur, | ||
| + | </ | ||
| + | |||
| + | === Traduction des associations de plusieurs à plusieurs === | ||
| + | |||
| + | Une association croisée ne contient que des contraintes de cardinalité de type [..,N]. Soit $R$ une telle association et $E_1$, ..., $E_k$ les ensembles participant à l' | ||
| + | |||
| + | <note important> | ||
| + | **Règle de traduction :** | ||
| + | * Chaque ensemble $E_i$ est traduit par un schéma relationnel (contenant les mêmes attributs) | ||
| + | * L' | ||
| + | * les clés primaires des ensembles participant à l’association | ||
| + | * (éventuellement) les attributs propres à l' | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | {{public: | ||
| + | |||
| + | ** Traduction :** | ||
| + | * **Pays** (__nom_pays__, | ||
| + | * **Matière_première** ( __nom_matière__, | ||
| + | * **Exportation** (__n__o__m__ __p__a__y__s, | ||
| + | |||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | {{public: | ||
| + | **Traduction** : | ||
| + | * **Appareil** (__code_appareil__, | ||
| + | * **Séance** (__date, heure, local__) | ||
| + | * **Réservation** (__c__o__d__e __a__p__p__a__r__e__i__l, | ||
| + | |||
| + | </ | ||
| + | |||
| + | === Traduction des associations de un à plusieurs === | ||
| + | |||
| + | Soit une association fonctionnelle $R$. On suppose qu'il existe au moins un ensemble $A$ de cardinalité unique [1,1] participant l’association. | ||
| + | |||
| + | <note important> | ||
| + | **Règle de traduction** | ||
| + | * Chaque ensemble participant est traduit sous forme de schéma relationnel | ||
| + | * L' | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | **Exemple** : | ||
| + | {{public: | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | **Remarque** : lorsque l’association est valuée, les attributs de l’association sont également injectés dans la table représentant l’ensemble de gauche. | ||
| + | {{public: | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | **Exemple** | ||
| + | {{public: | ||
| + | **Traduction** : | ||
| + | * **Groupe_TD**( __num_groupe__, | ||
| + | * **Entreprise** ( __nom_entreprise__, | ||
| + | * **Etudiant** ( __num_etudiant__, | ||
| + | </ | ||
| + | |||
| + | === Exemple complet === | ||
| + | |||
| + | < | ||
| + | **Schéma de base relationnelle** : | ||
| + | |||
| + | * **Clients** ( __nom_client__, | ||
| + | * **Commandes** ( __num_Commande__, | ||
| + | * **Fournisseurs** ( __nom_fournisseur__, | ||
| + | * **Catalogue** ( __nom_fournisseur, | ||
| + | </ | ||
| + | < | ||
| + | ** Réalisation ** : | ||
| + | |||
| + | **Clients** : | ||
| + | ^__nom_client__^adresse_client^solde^ | ||
| + | |Durand|7, rue des Lilas|335, | ||
| + | |Dubois|44, av. du Maréchal Louis|744, | ||
| + | |Duval|5, place du marché|33, | ||
| + | |||
| + | **Commandes** : | ||
| + | ^__num_Commande__^ __n__o__m__ __c__l__i__e__n__t^ composant^ quantité^ | ||
| + | |6674|Dubois|micro controller|55| | ||
| + | |6637|Dubois|radio tuner|2| | ||
| + | |6524|Durand|transistor|4| | ||
| + | |6443|Duval|micro controller|7| | ||
| + | |||
| + | **Fournisseurs** : | ||
| + | ^__nom_fournisseur__^ adresse_fournisseur^ | ||
| + | |Sage|33, College street, London| | ||
| + | |MoxCom|77 Ashley square, | ||
| + | |||
| + | **Catalogue** : | ||
| + | ^__nom_fournisseur__^ __composant__^ prix^ | ||
| + | |Sage|transistor|4, | ||
| + | |MoxCom|micro controller|3, | ||
| + | |MoxCom|radio tuner|7,0| | ||
| + | </ | ||