diff --git a/content/bdd_avancees/3-algebre_relationnelle/index.md b/content/bdd_avancees/3-algebre_relationnelle/index.md index 45d5d24..b7e5973 100644 --- a/content/bdd_avancees/3-algebre_relationnelle/index.md +++ b/content/bdd_avancees/3-algebre_relationnelle/index.md @@ -188,7 +188,7 @@ t[acteur] = "Jay" \land s[acteur] = "Silent Bob" ) \\} \\) \\( \\{ t | \exists s \in p(s[titre] = t[titre] \land s[\text{nom_cinemas}] = "UCG" -\land {\neg} {\exists} u \in p( u[\text{nom_cinemas}] = "Megarama" +\land {\not} {\exists} u \in p( u[\text{nom_cinemas}] = "Megarama" \land u[titre] = t[titre] \\} \\) @@ -200,57 +200,8 @@ t | \exists \in p(\exists u \in f((s[\text{nom_cinemas}] = "UGC" \land t[realisateur] = u[realisateur] \\} \\) -### Retour sur la notion de clé +## Retour sur la notion de clé comme nous lavons abordé précédement, une clé est nécessaire pour identifier des *n_uplets* de façon unique sans pour autant en donner toutes leurs valeurs et respecter leurs unicité. - -Plus formellement - - * \\(X \text{ clé de } R(U) \textit{ avec } X \subseteq U \textit{ ssi } \forall - r:R(U) \\) - * \\(\forall t_1, t_2 \in r \\) - * \\(t_1\[X\] = t_2\[X\] \implies t_1 = t_2 \\) - * \\(\neg \exists Y \subset X \implies t_1[Y] = t_2[Y] \implies t_1 = t_2\\) - -### Expression saine - -Il est possible d'écrire en calcul algébrique des requêtes qui retourne un -relation infinie. Un exemple parlant avec les numéros de comptes : - - * Soit \\(Numcompte(Num)\\)) avec l'instance \\(n\\) - * Et la requête \\(\\{ t | \neg t \in n \\}\\) représentant les numéros de - comptes non rencencés. - * si on considère que \\( Dom(Num) = IN \\) alors la réponse à la question est - infinie. - -Un requête est saine si **quel que soit l'instance de la base** dans laquelle on -l'évalue, elle retourne **une réponse finie**. - -## Calcul relationnel par domaine - -Le calcul relationnel par domaine est un langage de requête non procédural. Il -ne fournit que la description de la requête et pas les méthodes pour la -résoudre. Elle prend la forme suivante: - -\\(\\{ < x_1, x_2, ... , x_n> | P(x_1, x_2, ... , x_n)\\}\\) - - * \\(< x_1, x_2, ... , x_n>\\) représente les variables de domaine résultant - * \\(P(x_1, x_2, ... , x_n)\\}\\) représente la formule similaire à ce que l'on - trouve dans la logique des prédicats - -Si on reprends notre exemple des cinémas, la requête permettant de trouver les -films proposé à l'UGC est - -\\(\\{ \ | \exists \in p(nc = "UGC"\\}\\) - -## Relation entre les trois langages - -Toute requête exprimée en algèbre peut être exprimée par le calcul et toute -requête saine du calcul peut être expriméeapt une requête de l'algèbre. Les -trois langages sont donc **équivalent d'un point de vue de la puissance -d'expression**. - -L'algèbre est un langage procédural (quoi et comment) alors que le calcul ne -l'est pas (seulement quoi). diff --git a/content/bdd_avancees/4-dependances_fonctionnelles/images/fermeture_transitive.svg b/content/bdd_avancees/4-dependances_fonctionnelles/images/fermeture_transitive.svg deleted file mode 100644 index add8943..0000000 --- a/content/bdd_avancees/4-dependances_fonctionnelles/images/fermeture_transitive.svg +++ /dev/null @@ -1,264 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/content/bdd_avancees/4-dependances_fonctionnelles/index.md b/content/bdd_avancees/4-dependances_fonctionnelles/index.md deleted file mode 100644 index 46491f3..0000000 --- a/content/bdd_avancees/4-dependances_fonctionnelles/index.md +++ /dev/null @@ -1,302 +0,0 @@ ---- -title: "Base de données avancées : contraintes d'intégrité: les dépendances -fonctionnelles" -date: 2022-01-17 -tags: ["schema", "algèbre relationnelle", "relation"] -categories: ["Base de données avancées", "Cours"] -mathjax: true ---- - -Une dépendance fonctionnelle entre deux ensemble d'attributs A et B indique une -implication vérifié universellement : à une valeur de A correspond toujours une -même valeur de B. Elle est notée \\(A \to B\\), A est parfois appelé **la -source** et B **Le but**. - -Soit \\(R(a,b,c\\), l'attribut \\(b\\) est dit *fonctionnellement dépendant* de -\\(a\\) si pour deux *n_uplets* \\(\\) et \\(\\) -alors \\( a_1 = a_2 \implies b_1 = b_2 \\). - -Il est important de préciser que'une dependance fonctionnelle est **une -assertion sur les valeurs possible** (domaine des attributs) et **non sur les -valeurs actuelles** (extentipon courante de la relation). Elle caractérise une -intention et non pas une extention d'une relation :invariante au cours du -temps. - -Elle doit être définie à partir d'un schema de relation. Par défaut elle sont -définie sur la relation univerelle. - -## Utilité des dépendances fonctionnelles - -Elles permettent: - - * de vérifier que les extentions \\(r\\) du'un schema \\(R\\) sont conforme - au réel perçu. - * Modéliser les contraintes que devront vérifier toutes les relations d'un - schema. - -Les dépendances fonctionnelles sont des outils permettant de génerer de bon -schemas fonctionnels et valides de façon automatique. - -## Propriété des dépendances fonctionnelles. - -Les propriétés des dependances fonctionnelles sont régies par les règles -d'inférences définie par Armstrong en 1974. Il y en a 3 [axiomes][^n_axiome] : -la réflexivité, l'augmentation et la transitivité. - -[^n_axiome]: En mathématiques,a le mot axiome désignait une proposition qui est - évidente en soi dans la tradition mathématique des Éléments d’Euclide. - L’axiome est utilisé désormais, en logique mathématique, pour désigner une - vérité première, à l'intérieur d'une théorie. source - [Wkipedia](https://fr.wikipedia.org/wiki/Axiome#Math%C3%A9matiques) - - -### La réflexivité. - -Tout groupe d'attributs se détermine lui même et détermine chacun de ses -attributs. - -\\( \text{si } Y \subseteq X \text{ alors } X \to Y \\) - -### L'augmentation - -Si un attribut X détermine un attribut Y, alors tout groupe composé de X enrichi -avec d'autres attributs détermine un groupe composé de Y et enrichi des mêmes -autres attributs. - -\\( \text{Si } X \to Y \text{ et } Y \subset X \text{ alors } XZ \to XY \\) - -### La transitivité - -Si un attribut X détermine un attribut Y et que cet attribut Y détermine un -autre attribut Z, alors X détermine Z. - -\\( X \to Y \text{ et } Y \to Z \implies X \to Z \\) - -### Les règles déduites des trois principales - -#### La pseudo-transitivité - - 1. Augmentation - 2. Transitivité - -\\( \text{Si } X \to Y \text{ et } WY \to Z \text{ alors } WX \to Z \\) - -#### L'union (ou la composition) - -\\( \text{si } X \to Y \text{ et } WY \to Z \text{ alors } WX \to Z \\) - -#### La décomposition - - 1. Réflexivité - 2. Transitivité - -\\( \text{si } X \to Y \text{ et } Z \subset Y \text{ alors } X \to Z \\) - -## Les formes des dépendances fonctionnelles - -### Dépendance fontionnelle triviale - -C'est une simple dependance fonctionnelle obtenue par transitivité/ - -### dépendance fonctionnelle simple / composée. - -Une dependance fonctionnelle qui ne comporte qu'un seul attribut en partie -droite. - -### Dépendance fonctionnelle directe - -Dépendance fonctionnelle non obtenue par transitivité - -### Dépendance fonctionnelle directe - -Dependance fonctionnelle qui ne peux être décomposée (simple en partie gauche, -sans attribut(s) superflu(s)). - -## Fermeture transitive d'un ensemble de dependances fonctionnelles - -La fermeture transitive d'un ensemble \\(F\\) représente le plus grand ensemble -stationnaire \\(F^+\\) de dépendances fonctionnelles valides. Il est obtenu en -appliquant les propriété des dépendances fonctionnelles (axiomes d'Armstrong). - -Cette fermeture est unique et ne depend pas de l'ordre d'utilisation de ses -propriétés. - -Deux ensembles de dependances fonctionnelles sont équivalent si et seulement si -ils ont la même fermeture transitive : - -\\( F_1^+ \equiv F_2^+ \iff F_1^+ = F_2^+ \\) - -## Fermeture transitive d'un ensemble d'attributs - -La fermeture transitive d'un ensemble d'attributs X par rapport à un ensemble de -dépendances fonctionnelles F est l'ensemble des attributs qui peuvent être -inférés à partir de X en utilisant les DF contenues dans F. - -Prenons l'exemple de la relation \\( R \\) avec les dépendances fonctionnelle -suivantes: \\( N \to T, T \to M, T \to P, N \to C \\) : - -![Schéma des dépendances fonctionnelles de N](./images/fermeture_transitive.svg) - - 1. \\( N_{0}^{+} = \{ N \} \\) - 2. \\( N_{1}^{+} = \{ N, T, C \} \\) obtenu par réfexivité - 3. \\( N_{2}^{+} = \{ N, T, C, M, P \} \\) - 4. \\( N_{3}^{+} = \{ N, T, C, M, P \} \\) - -Comme \\( N_{2}^{+} = N_{3}^{+} \\) alors la condition d'arrêt est \\(N_{3}\\). - -## couverture minimale - -La couverture minimale représente un sous-ensemble \\( F_{min} \\) minimum -- -sans redondance -- de dépendance fonctionnelles qui permet de générer toutes des -dépendances fonctionnelles de \\(F^{+}\\) : - -\\( F^{+}(F_{min}) \\) - -\\( \neg \exists F^{'} / F^{'} \subset F_{min} \text{ et } F^{+}(F^{'}) = -F^{+}(F_{min}) \\) - -Contrairement à \\(F^{+}\\), la couverture minimale n'est pas unique. C'est un -ensemble essentiels pour effectuer des décompositions sans perte et ainsi -générer de bon modèles de base de donnees. - -L'algorithme pour arriver à la couverture minimale se décompose en 3 étapes. -L'ordre est à respecter : - - 1. Décomposer les dépendances fonctionnelles : un sel attribut en partie - droite. - 2. Rendre les dépendances fonctionnelles élémentaires : membre gauche non - décomposable - 3. Supprimer les dépendances fonctionnelles redondantes, celles qui sont - obtenues par transitivité. - -### un exemple - -Soit la relation - -\\( F \left \\{ \begin{array}{c} -A \to BC\\\ -AB \to C\\\ -ABC \to D\\\ -C \to D\\\ -D \to E\\\ -E \\to F\\\ -DEF \to G -\end{array} -\right \\} \\) - -Dans un premier temps nous décomposons les relations afin de rendre les -relations élémentaires (un seul élement dans la partie droite) - -\\( F_{1} \left \\{ \begin{array}{c} -A \to B \\\ -A \to C\\\ -AB \to C \\\ -ABC \to D\\\ -C \to D\\\ -D \to E\\\ -E \\to F\\\ -DEF \to G -\end{array} -\right \\} -\begin{array}{l} -\\\ -\\\ -\to \text{ élémentaire? non! augmentation de B sur } A \to C \textbf{: DF inutile}\\\ -\to \text{ idem: augentation de AB sur } C \to D \textbf{: DF inutile}\\\ -\\\ -\\\ -\\\ -\\\ -\end{array} -\\) - -nous obtenons alors notre relation \\(F_{2}\\) : - -\\( F_{2} \left \\{ \begin{array}{c} -A \to B \\\ -A \to C\\\ -C \to D\\\ -D \to E\\\ -E \\to F\\\ -DEF \to G -\end{array} -\right \\} -\begin{array}{l} -\\\ -\\\ -\\\ -\\\ -\\\ -\to \text{ pseudo transitivite car on a } D \to E \text{ et } E \to F \\\ -\end{array} -\\) - -Devellopons le raisonnement autour de \\( DEF \to G \\). \\(D\\) est-il superfu? -En clair y a t-il toujours un chemin pour aller de \\(EF\\) vers \\(G\\). En -calcul relationnel, \\(G\\) appartient-il à la fermeture transitive de \\(EF\\) -En clair il y a toujours un chemin pour aller de \\(EF\\) vers \\(G\\) : \\( G -\in \\{EF\\}_{F2}^{+} \\)?. - - 1. \\( \\{EF\\}_{F2}^{+} = \\{E,F\\} \\) - 2. donc \\( G \notin \\{EF\\}_{F2}^{+} \\). - 3. En clair \\(D\\) **n'est pas superflu**. - -Répétons ce raisonnement pout \\(E\\) : - - 1. \\( \\{DF\\}_{F2}^{+} = \\{D,F,E,G\\} \\) - 2. donc \\( G \in \\{DF\\}_{F2}^{+} \\) - 3. alors \\(E\\) **est superflu** donc on passe de \\(F_{2}\\) à \\(F_{3}\\) - -La méthode est donc la suivante : j'enlève un attribut en partie gauche de ma -dependance foncionnelle et je vois s'il est toujours possible d'attendre la -partie droite en parcourant le graphe des dépendances. - -On repête l'opération pour \\(F\\): - - 1. \\( \\{D\\}_{F3}^{+} = \\{D,E,F,G\\} \\) - 2. donc \\( G \in \\{F\\}_{F3}^{+} \\) - 3. alors \\(G\\) **est superflu** donc on passe de \\(F_{3}\\) et \\(F_{4}\\) - - -\\( F_{4} \left \\{ \begin{array}{c} -A \to B \\\ -A \to C\\\ -C \to D\\\ -D \to E\\\ -E \\to F\\\ -D \to G -\end{array} -\right \\} -\\) - -**Toutes les dépendances fonctionnelles son maintenant élementaires, elles ont -un nombre minimum d'attriuts en partie gauche**. Il nous reste maintenant un -dernier point : avons nous des dépendances obtenues par transitivité. Ici il n'y -a ici aucune dépendance fonctionnelle obtenue de la sorte : aucun attribut -apparaît deux fois en partie gauche (un seul chemin pour aller vers chacun des -attributs. - -Pour vérifier la transitivité, nous pouvons uassi utiliser une méthode -ensembliste. Vérifions pour la dépendance \\( A \to C \\). nous devons vétifier -si \\( C \in \\{A\\}_{F4 - A \to C}^{+} \\) en clair est-ce que \\(C\\) -appartient à \\(A\\) privé de sa relation \\( A \to C \\) - - 1. \\( \\{A\\}_{F4 - A \to C}^{+} = \\{A,B\\} \\) - 2. donc \\( C \notin \\{A\\}_{F4 - A \to C}^{+} \\) - 3. alors \\( A \to C \\) n'est pas redondante - -Il nous suffit de recommencer l'opération pour l'ensemble de dépendances de -notre relation. - -La conclusion : \\(F_{4}\\) représente **la couverture minimale** de notre -relation. - -## Retour sur la notion de clé - -Un sous ensemble \\(X\\) d'un schéma \\(R\\) (\\(U\\) étant l'ensemble -attributs et \\(F\\) une couverture minimale) est une clé si et seulement si : - - 1. \\( \\{X \to U\\} \in F^{+} \\) - 2. \\( \neg \exists X' \subset X / \\{ X' \to U \\} \in F^{+} \\) : minimalité - de la clé - 3.