Überprüft

Synthesealgorithmus

aus Wikipedia, der freien Enzyklopädie

Seitenversionsstatus

Dies ist eine gesichtete Version dieser Seite

Dies ist die gesichtete Version, die am 17. August 2024 markiert wurde. Es existieren 3 ausstehende Änderungen, die noch gesichtet werden müssen.
Zur Navigation springen Zur Suche springen

Der Synthesealgorithmus beschreibt, wie aus einem relationalen Datenbankschema ein Relationenschema der dritten Normalform wird. Das besondere an diesem Algorithmus ist, dass er im Gegensatz zu der intuitiven Zerlegung des Schemas in die dritte Normalform die Abhängigkeitserhaltung in jedem Fall garantiert.

Ein alternativer Algorithmus ist der Zerlegungsalgorithmus, welcher in die Boyce-Codd-Normalform (BCNF) transferiert. Dabei können allerdings Abhängigkeiten verloren gehen (nicht abhängigkeitstreu). Er ist insofern eine Alternative, als jedes relationale Schema, welches in BCNF transformiert wird, dann auch automatisch in dritter Normalform vorliegt.

Es müssen alle funktionalen Abhängigkeiten F {\displaystyle {\mathcal {F}}} {\displaystyle {\mathcal {F}}} der zu zerlegenden Relation R {\displaystyle R} {\displaystyle R} unter den Attributen bekannt sein.

Beispiel:

  • R = Relation ( A , B , C , D , E , F ) {\displaystyle R=\operatorname {Relation} (A,B,C,D,E,F)} {\displaystyle R=\operatorname {Relation} (A,B,C,D,E,F)}
  • F = { { A } { B , E } , { A , E } { B , D } , { F } { C , D } , { C , D } { B , E , F } , { C , F } { B } } {\displaystyle {\mathcal {F}}=\left\{\left\{A\right\}\to \left\{B,E\right\},\left\{A,E\right\}\to \left\{B,D\right\},\left\{F\right\}\to \left\{C,D\right\},\left\{C,D\right\}\to \left\{B,E,F\right\},\left\{C,F\right\}\to \left\{B\right\}\right\}} {\displaystyle {\mathcal {F}}=\left\{\left\{A\right\}\to \left\{B,E\right\},\left\{A,E\right\}\to \left\{B,D\right\},\left\{F\right\}\to \left\{C,D\right\},\left\{C,D\right\}\to \left\{B,E,F\right\},\left\{C,F\right\}\to \left\{B\right\}\right\}}

Der Synthesealgorithmus besteht dann aus vier Schritten:

  1. Reduktion von F {\displaystyle {\mathcal {F}}} {\displaystyle {\mathcal {F}}}, d. h. die Bestimmung der kanonischen Überdeckung.
  2. Erzeugen der neuen Relationenschemata aus der kanonischen Überdeckung.
  3. Ggf. die Hinzunahme einer Relation, die nur den Ursprungsschlüssel enthält.
  4. Elimination der Schemata, die in einem anderen Schema enthalten sind.

Dies wird auch die Berechnung der kanonischen Überdeckung genannt.

1. Schritt: Linksreduktion

[Bearbeiten | Quelltext bearbeiten ]

Für alle ψ Ψ {\displaystyle \psi \in \Psi } {\displaystyle \psi \in \Psi } ersetze Ψ Γ {\displaystyle \Psi \rightarrow \Gamma } {\displaystyle \Psi \rightarrow \Gamma } durch Ψ { ψ } Γ {\displaystyle \Psi \setminus \{\psi \}\rightarrow \Gamma } {\displaystyle \Psi \setminus \{\psi \}\rightarrow \Gamma } , falls Γ {\displaystyle \Gamma } {\displaystyle \Gamma } schon durch Ψ { ψ } Γ {\displaystyle \Psi \setminus \{\psi \}\rightarrow \Gamma } {\displaystyle \Psi \setminus \{\psi \}\rightarrow \Gamma } determiniert ist.

Die obige Bedingung lässt sich testen, indem man überprüft, ob Γ A t t r i b u t H u ¨ l l e ( F , Ψ { ψ } ) {\displaystyle \Gamma \subseteq \mathop {\mathrm {AttributH{\ddot {u}}lle} } (F,\Psi \setminus \{\psi \})} {\displaystyle \Gamma \subseteq \mathop {\mathrm {AttributH{\ddot {u}}lle} } (F,\Psi \setminus \{\psi \})} ist,[1] wobei F die Menge der funktionalen Abhängigkeiten bezeichnet. Falls dies zutrifft, kann ψ {\displaystyle \psi } {\displaystyle \psi } aus Ψ {\displaystyle \Psi } {\displaystyle \Psi } entfernt werden.

Beispiel: R e l a t i o n ( A , B , C , D , E , F ) {\displaystyle \mathop {\mathrm {Relation} } \left(A,B,C,D,E,F\right)} {\displaystyle \mathop {\mathrm {Relation} } \left(A,B,C,D,E,F\right)}

  • A B , E {\displaystyle A\rightarrow B,E} {\displaystyle A\rightarrow B,E}
  • A E _ B , D {\displaystyle A{\underline {E}}\rightarrow B,D} {\displaystyle A{\underline {E}}\rightarrow B,D}
  • F C , D {\displaystyle F\rightarrow C,D} {\displaystyle F\rightarrow C,D}
  • C D B , E , F {\displaystyle CD\rightarrow B,E,F} {\displaystyle CD\rightarrow B,E,F}
  • C _ F B {\displaystyle {\underline {C}}F\rightarrow B} {\displaystyle {\underline {C}}F\rightarrow B}

In der zweiten funktionalen Abhängigkeit fällt E weg, da sich B und D in der Attributhülle von A ( A + = { A , B , D _ , E } {\displaystyle A^{+}=\{A,{\underline {B,D}},E\}} {\displaystyle A^{+}=\{A,{\underline {B,D}},E\}}) befinden. In der letzten funktionalen Abhängigkeit fällt C weg, wegen F + = { B _ , C , D , E , F } {\displaystyle F^{+}=\{{\underline {B}},C,D,E,F\}} {\displaystyle F^{+}=\{{\underline {B}},C,D,E,F\}}. Man kann es auch so formulieren: E wird in A E B , D {\displaystyle AE\rightarrow B,D} {\displaystyle AE\rightarrow B,D} nicht benötigt, um B , D {\displaystyle B,D} {\displaystyle B,D} zu erreichen.

Lösung:

  • A B , E {\displaystyle A\rightarrow B,E} {\displaystyle A\rightarrow B,E}
  • A B , D {\displaystyle A\rightarrow B,D} {\displaystyle A\rightarrow B,D}
  • F C , D {\displaystyle F\rightarrow C,D} {\displaystyle F\rightarrow C,D}
  • C D B , E , F {\displaystyle CD\rightarrow B,E,F} {\displaystyle CD\rightarrow B,E,F}
  • F B {\displaystyle F\rightarrow B} {\displaystyle F\rightarrow B}

2. Schritt: Rechtsreduktion

[Bearbeiten | Quelltext bearbeiten ]

Für alle γ Γ {\displaystyle \gamma \in \Gamma } {\displaystyle \gamma \in \Gamma } ersetze Ψ Γ {\displaystyle \Psi \rightarrow \Gamma } {\displaystyle \Psi \rightarrow \Gamma } durch Ψ Γ { γ } {\displaystyle \Psi \rightarrow \Gamma \setminus \{\gamma \}} {\displaystyle \Psi \rightarrow \Gamma \setminus \{\gamma \}}, falls γ {\displaystyle \gamma } {\displaystyle \gamma } schon transitiv durch Ψ {\displaystyle \Psi } {\displaystyle \Psi } bestimmt ist.

Die obige Bedingung lässt sich überprüfen, indem man für jedes γ Γ {\displaystyle \gamma \in \Gamma } {\displaystyle \gamma \in \Gamma } testet, ob γ AttributHuelle ( ( F ( Ψ Γ ) ) ( Ψ ( Γ { γ } ) ) , Ψ ) {\displaystyle \gamma \in {\text{AttributHuelle}}((F\setminus (\Psi \rightarrow \Gamma ))\cup (\Psi \rightarrow (\Gamma \setminus \{\gamma \})),\Psi )} {\displaystyle \gamma \in {\text{AttributHuelle}}((F\setminus (\Psi \rightarrow \Gamma ))\cup (\Psi \rightarrow (\Gamma \setminus \{\gamma \})),\Psi )} ist. Falls dies zutrifft, kann γ {\displaystyle \gamma } {\displaystyle \gamma } aus Γ {\displaystyle \Gamma } {\displaystyle \Gamma } entfernt werden. Hierbei handelt es sich um ein iteratives Verfahren, d. h. F {\displaystyle F} {\displaystyle F} enthält in jedem Schritt die bereits in vorherigen Schritten aktualisierten Abhängigkeiten.

An obigem Beispiel:

  • A B _ , E {\displaystyle A\rightarrow {\underline {B}},E} {\displaystyle A\rightarrow {\underline {B}},E}
  • A B , D {\displaystyle A\rightarrow B,D} {\displaystyle A\rightarrow B,D}
  • F C , D {\displaystyle F\rightarrow C,D} {\displaystyle F\rightarrow C,D}
  • C D B _ , E , F {\displaystyle CD\rightarrow {\underline {B}},E,F} {\displaystyle CD\rightarrow {\underline {B}},E,F}
  • F B {\displaystyle F\rightarrow B} {\displaystyle F\rightarrow B}

In der ersten funktionalen Abhängigkeit fällt B weg, da A F + = { A , B _ , D , E } {\displaystyle A_{F'}^{+}=\{A,{\underline {B}},D,E\}} {\displaystyle A_{F'}^{+}=\{A,{\underline {B}},D,E\}}. In der vierten funktionalen Abhängigkeit fällt ebenfalls das B weg, wegen C D F + = { B _ , C , D , E , F } {\displaystyle CD_{F'}^{+}=\{{\underline {B}},C,D,E,F\}} {\displaystyle CD_{F'}^{+}=\{{\underline {B}},C,D,E,F\}}.

  • A E {\displaystyle A\rightarrow E} {\displaystyle A\rightarrow E}
  • A B , D {\displaystyle A\rightarrow B,D} {\displaystyle A\rightarrow B,D}
  • F C , D {\displaystyle F\rightarrow C,D} {\displaystyle F\rightarrow C,D}
  • C D E , F {\displaystyle CD\rightarrow E,F} {\displaystyle CD\rightarrow E,F}
  • F B {\displaystyle F\rightarrow B} {\displaystyle F\rightarrow B}

3. Schritt: Leere Klauseln

[Bearbeiten | Quelltext bearbeiten ]

Eliminiere Klauseln der Form Ψ {\displaystyle \Psi \rightarrow \varnothing } {\displaystyle \Psi \rightarrow \varnothing }

Im Beispiel aus Schritt 2 gibt es keine Abhängigkeiten mit leerer rechter Seite. Also gibt es in diesem Fall hier nichts zu tun.

4. Schritt: Zusammenfassen

[Bearbeiten | Quelltext bearbeiten ]

Fasse Formeln a b 0 , a b 1 {\displaystyle a\rightarrow b_{0},a\rightarrow b_{1}\dots } {\displaystyle a\rightarrow b_{0},a\rightarrow b_{1}\dots } zu a b 0 b 1 {\displaystyle a\rightarrow b_{0}\cup b_{1}\dots } {\displaystyle a\rightarrow b_{0}\cup b_{1}\dots } zusammen.

Im Beispiel fassen wir nun Ausdrücke mit gleicher linker Seite zusammen:

  • A E , B , D {\displaystyle A\rightarrow E,B,D} {\displaystyle A\rightarrow E,B,D}
  • F C , D , B {\displaystyle F\rightarrow C,D,B} {\displaystyle F\rightarrow C,D,B}
  • C D E , F {\displaystyle CD\rightarrow E,F} {\displaystyle CD\rightarrow E,F}

Neues Relationenschema

[Bearbeiten | Quelltext bearbeiten ]

Aus allen Ψ Γ {\displaystyle \Psi \to \Gamma } {\displaystyle \Psi \to \Gamma } wird R ( Ψ , Γ ) {\displaystyle R(\Psi ,\Gamma )} {\displaystyle R(\Psi ,\Gamma )}.

Zusätzlich muss ein neuer Schlüssel gefunden werden. Gegebenenfalls muss eine neue Relation erzeugt werden. Überflüssige Relationen können gestrichen werden, wenn diese in anderen enthalten sind.

Am Beispiel:

  • R 1 ( A _ , B , D , E ) {\displaystyle R_{1}({\underline {A}},B,D,E)} {\displaystyle R_{1}({\underline {A}},B,D,E)} # A {\displaystyle A} {\displaystyle A} ist Primärschlüssel
  • R 2 ( B , C , D , F _ ) {\displaystyle R_{2}(B,C,D,{\underline {F}})} {\displaystyle R_{2}(B,C,D,{\underline {F}})} # F {\displaystyle F} {\displaystyle F} ist Primärschlüssel
  • R 3 ( C , D _ , E , F ) {\displaystyle R_{3}({\underline {C,D}},E,F)} {\displaystyle R_{3}({\underline {C,D}},E,F)} # C D {\displaystyle CD} {\displaystyle CD} ist Primärschlüssel (Die Elemente dieser Relation sind zwar schon durch R 1 {\displaystyle R_{1}} {\displaystyle R_{1}} und R 2 {\displaystyle R_{2}} {\displaystyle R_{2}} gegeben, jedoch muss zur Abhängigkeitserhaltung diese weiterhin aufgeführt werden, es dürfte nur entfernt werden, wenn eine Relation vollends in einer anderen enthalten wäre. Dies ist jedoch nicht möglich, da diese Fälle vorher durch die Links- und Rechtsreduktion entfernt wurden.)

Hinzufügen einer Relation

[Bearbeiten | Quelltext bearbeiten ]

Nun muss durch Hinzunahme einer Relation eine Beziehung zwischen R 1 {\displaystyle R_{1}} {\displaystyle R_{1}}, R 2 {\displaystyle R_{2}} {\displaystyle R_{2}} und R 3 {\displaystyle R_{3}} {\displaystyle R_{3}} hergestellt werden. Das wird durch eine Relation R 4 {\displaystyle R_{4}} {\displaystyle R_{4}} ermöglicht, die nur den Ursprungsschlüssel A F {\displaystyle AF} {\displaystyle AF} enthält (beachte, dass A F + = { A , B , C , D , E , F } {\displaystyle AF^{+}=\{A,B,C,D,E,F\}} {\displaystyle AF^{+}=\{A,B,C,D,E,F\}} ist). Wir erhalten ein Schema in der 3. Normalform wie folgt:

  • R 1 ( A _ , B , D , E ) {\displaystyle R_{1}({\underline {A}},B,D,E)} {\displaystyle R_{1}({\underline {A}},B,D,E)}
  • R 2 ( B , C , D , F _ ) {\displaystyle R_{2}(B,C,D,{\underline {F}})} {\displaystyle R_{2}(B,C,D,{\underline {F}})}
  • R 3 ( C _ , D _ , E , F ) {\displaystyle R_{3}({\underline {C}},{\underline {D}},E,F)} {\displaystyle R_{3}({\underline {C}},{\underline {D}},E,F)}
  • R 4 ( A _ , F _ ) {\displaystyle R_{4}({\underline {A}},{\underline {F}})} {\displaystyle R_{4}({\underline {A}},{\underline {F}})}, wobei A {\displaystyle A} {\displaystyle A} und F {\displaystyle F} {\displaystyle F} jeweils Fremdschlüssel darstellen und zusammengenommen den Primärschlüssel von R 4 {\displaystyle R_{4}} {\displaystyle R_{4}} erzeugen.

Formaler Algorithmus

[Bearbeiten | Quelltext bearbeiten ]

Eingabe: universelles Schema R = ( U , F ) {\displaystyle R=(U,F)} {\displaystyle R=(U,F)}
Ausgabe: 3. Normalform D {\displaystyle D} {\displaystyle D} von R {\displaystyle R} {\displaystyle R}

B := reduction ( F ) {\displaystyle B:=\operatorname {reduction} (F)} {\displaystyle B:=\operatorname {reduction} (F)}
R := {\displaystyle R:=\emptyset } {\displaystyle R:=\emptyset }
i := 0 {\displaystyle i:=0} {\displaystyle i:=0}
f o r e a c h Y U w h e r e A U . ( Y A ) B {\displaystyle \mathbf {for,円each} \;Y\subseteq U\;\mathbf {where} \;\exists A\in U.(Y\rightarrow A)\in B} {\displaystyle \mathbf {for,円each} \;Y\subseteq U\;\mathbf {where} \;\exists A\in U.(Y\rightarrow A)\in B}
i := i + 1 {\displaystyle i:=i+1} {\displaystyle i:=i+1}
X i := Y { A U | ( Y A ) B } {\displaystyle X_{i}:=Y\cup \{,円A\in U,円|,円(Y\rightarrow A)\in B,円\}} {\displaystyle X_{i}:=Y\cup \{,円A\in U,円|,円(Y\rightarrow A)\in B,円\}}
R i := ( X i , Π X i ( B ) ) {\displaystyle R_{i}:=(X_{i},\Pi _{X_{i}}(B))} {\displaystyle R_{i}:=(X_{i},\Pi _{X_{i}}(B))}
R := R { R i } {\displaystyle R:=R\cup \{R_{i}\}} {\displaystyle R:=R\cup \{R_{i}\}}
i f R i R . ( X i U ) B + {\displaystyle \mathbf {if} \;\forall R_{i}\in R.(X_{i}\rightarrow U)\notin B^{+}} {\displaystyle \mathbf {if} \;\forall R_{i}\in R.(X_{i}\rightarrow U)\notin B^{+}}
i := i + 1 {\displaystyle i:=i+1} {\displaystyle i:=i+1}
R := R { R i } {\displaystyle R:=R\cup \{R_{i}\}} {\displaystyle R:=R\cup \{R_{i}\}}
D := ( R , ) {\displaystyle D:=(R,\emptyset )} {\displaystyle D:=(R,\emptyset )}

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten ]
  1. A. Kemper, A. Eickler: Datenbanksysteme, ISBN 3-486-57690-9.
Abgerufen von „https://de.wikipedia.org/w/index.php?title=Synthesealgorithmus&oldid=247769760"