Leopold-Franzens-Universität Innsbruck Institut für Informatik Datenbanken und Informationssysteme Übungstool zu Normalformen Bachelor-Arbeit Katja Sonderegger betreut von Michael Tschuggnall, MSc Prof. Dr. Günther Specht Innsbruck, 2. Juni 2014 Zusammenfassung Normalformen waren und sind ein wichtiges Thema im Bereich von Datenbanksystemen und werden deshalb auch in Lehrveranstaltungen entsprechend behandelt. Um den Studenten das Verstehen und Erlernen dieses Themengebiets zu erleichtern, ist das Ziel dieser Arbeit, ein Übungstool zur Lernunterstützung zu entwickeln. Dabei sollen sowohl grundlegende Beispiele und Erklärungen zu den einzelnen Normalformen gegeben werden, als auch die Möglichkeit bestehen, sich selbst anhand von Übungsbeispielen zu testen und auf Fehler aufmerksam gemacht zu werden. Das Übungstool wurde webbasiert umgesetzt und kann in gängigen Browsern verwendet werden. Abstract Normal forms have been a very important topic in the area of databases and still are. This is why it still is a topic in many computer science lectures. To simplify the learning and understanding of this subject, the aim of this thesis is to develop a learning tool, which should contain examples and explanations of the different normal forms as well as the possibility to test oneself. The normal form tool is web-based and can be used with common browsers. Inhaltsverzeichnis 1 Einleitung 1 2 Anforderungsspezifikation 2.1 Struktur . . . . . . . . . . . . . 2.1.1 Inhaltliche Ziele . . . . 2.1.2 Funktionale Ziele . . . . 2.2 Technologien . . . . . . . . . . 2.2.1 PHP und PHPUnit . . . 2.2.2 JavaScript bzw JQuery 2.2.3 CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 5 6 6 7 8 3 Systemüberblick 3.1 Warum braucht es Normalformen? . . . 3.2 Atomare Attribute . . . . . . . . . . . . 3.3 Funktionale Abhängigkeiten . . . . . . . 3.4 Schlüssel . . . . . . . . . . . . . . . . . . 3.4.1 Superschlüssel . . . . . . . . . . 3.4.2 Schlüsselkandidaten . . . . . . . 3.4.3 Schlüsselattribut . . . . . . . . . 3.4.4 Voll funktionale Abhängigkeiten 3.5 Transitive Abhängigkeiten . . . . . . . . 3.6 Determinator . . . . . . . . . . . . . . . 3.7 Zerlegung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 10 10 10 11 11 11 11 12 12 12 13 . . . . . . . . 15 15 17 19 19 22 24 26 27 . . . . . . . 4 Systemimplementierung 4.1 Normalformenberechnung . . . . 4.1.1 Schlüsselkandidaten . . . 4.1.2 1. Normalform . . . . . . 4.1.3 2. Normalform (Kemper) 4.1.4 2. Normalform (Specht) . 4.1.5 3. Normalform . . . . . . 4.1.6 Boyce Codd Normalform 4.2 Minimale Überdeckung . . . . . . III . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INHALTSVERZEICHNIS 4.3 4.4 4.5 4.6 4.7 Relationensynthese . . . . . . . . . . . BCNF Dekomposition . . . . . . . . . Übungen . . . . . . . . . . . . . . . . . Automatische Fragebogengenerierung . 4.6.1 Fragebogen generieren . . . . . 4.6.2 Aufgaben generieren . . . . . . Systemtest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 33 36 38 38 39 41 5 Zusammenfassung 43 Literaturverzeichnis 46 IV Katja Sonderegger Kapitel 1 Einleitung In der Informatik sind Datenbanken seit vielen Jahren ein wichtiges und sehr häufig eingesetztes Konzept. Es gibt große Mengen an Daten, die von Programmen verarbeitet, gespeichert und wieder abgerufen werden sollen. Um dies zu ermöglichen, existieren die unterschiedlichsten Datenbanksysteme. Der größte Teil der heute existenten Systeme sind relationale Datenbanksysteme und solche, die darauf aufbauen. Daher ist es sehr wichtig, das relationale Konzept zu verstehen. In einem relationalen Datenbanksystem werden Daten in Tabellen - auch Relationen genannt - abgespeichert, wobei jede Relation aus Attributen besteht und eindeutig identifizierbar ist. Bei der Erstellung von Relationen werden häufig Informationen redundant - also mehrfach - abgespeichert, was eine ineffiziente Speichernutzung zur Folge hat. Auch Anomalien wie die Insert-Anomalie, die Update-Anomalie und die Delete-Anomalie treten häufig auf. Beispiel 1.1. Beispiel einer Tabelle mit redundanten Informationen. Uni IBK IBK SZG SZG IBK IBK MatrNr 123456 123457 123458 123459 123450 124578 StdKennzahl C 033 521 C 033 521 C 033 221 C 033 221 C 033 201 C 033 521 Studium Informatik Informatik Mathematik Mathematik Mathematik Informatik LVnr 703020 703020 733021 733021 703025 703021 LV DBS DBS LA LA M WIS Redundanz: Bei der Tabelle in Beispiel 1.1 werden sehr viele redundante Daten gespeichert. Für jeden Studenten werden erneut die Universität, die Lehrveranstaltungsinformationen und die Studieninformationen gespeichert. 1 KAPITEL 1. EINLEITUNG Delete Anomalie: Sollte die Lehrveranstaltung gelöscht werden, werden damit auch die Studenten gelöscht. Wenn in der Tabelle in Beispiel 1.1 die Lehrveranstaltung DBS (Datenbanksysteme) gelöscht wird, da die Lehrveranstaltung z.B. nicht mehr gehalten wird, dann verschwinden damit auch die Informationen zu den Studenten und der Studienrichtung. Insert Anomalie: Ein neuer Student kann erst dann gespeichert werden, wenn er sich für eine Lehrveranstaltung entschieden hat, da die LVnr Teil des Schlüssels ist. Update Anomalie: Sollte eine Information der Lehrveranstaltung sich ändern, wie zum Beispiel der Lehrveranstaltungsname (LV), dann muss dies für alle Tupel passieren. Das heißt konkret, dass wenn die Vorlesung LA umbenannt wird zu LA2, dann müssen in Beispiel 1.1 bereits zwei Tupel angepasst werden. Nachdem jeder Eintrag separat angepasst werden muss, kann es schnell passieren, dass ein Eintrag übersehen wird. Hier spricht man von einer Update-Anomalie. Um in den Relationen Redundanzen und Anomalien zu vermeiden, wurden von Edgar F. Codd die ersten drei Normalformen vorgeschlagen. Diese wurden weiter ergänzt und kommen heute beim relationalen Datenbankentwurf zum Einsatz [Cod70]. Insgesamt gibt es fünf aufeinander aufbauende Normalformen und eine Erweiterung der dritten Normalform, die sogenannte Boyce-Codd-Normalform (BCNF), welche von Codd nachgereicht wurde [Cod71]. Die vierte Normalform geht auf Fagin [Fag77] zurück und wurde von ihm 1977 als Erweiterung der BCNF eingeführt. Die fünfte Normalform führte Fagin 1979 [Fag79] ein. In dieser Arbeit werden die Normalformen bis inklusive der BCNF behandelt. Auf die vierte und fünfte Normalform wird hier nicht genauer eingegangen. Der interessierte Leser wird auf [KE06] und [Spe13] verwiesen. Die heutige Auslegung der ersten bis fünften Normalform inklusive der BCNF basiert auf der Überarbeitung von Kent [Ken83]. Jede Normalform ist eine Einschränkung der vorhergehenden Normalform. So ist zum Beispiel die zweite Normalform eine Einschränkung der ersten Normalform und somit ist eine Relation, die in zweiter Normalform ist, automatisch auch in der ersten Normalform. Die sich daraus ergebende Hierarchie ist in Abbildung 1.1 grafisch dargestellt. 2 Katja Sonderegger KAPITEL 1. EINLEITUNG Abbildung 1.1: Normalformen-Hierarchie. Um Relationen so darzustellen, dass keine Redundanzen oder Anomalien auftreten, sollte man mindestens die Normalformen von der ersten bis zur dritten Normalform inklusive der BCNF erfüllen. Daher ist es wichtig, dass die Studierenden diese Normalformen beherrschen. Aus diesem Grund wurde im Rahmen dieser Bachelorarbeit ein webbasiertes Übungstool zur Erarbeitung und Erlernung dieser Kernthemen entwickelt. Die genauen Anforderungen an diese Bachelorarbeit und die abgedeckten Themen werden in den folgenden Kapiteln erläutert. Katja Sonderegger 3 Kapitel 2 Anforderungsspezifikation Im Folgenden werden die inhaltlichen und funktionalen Ziele, sowie die grobe Struktur dieser Arbeit beschrieben und die verwendeten Technologien vorgestellt. 2.1 2.1.1 Struktur Inhaltliche Ziele Das Tool behandelt inhaltlich folgende Themengebiete: • Schlüsselkandidaten • funktionale Abhängigkeiten • voll funktionale Abhängigkeiten • 1. Normalform • 2. Normalform • 3. Normalform (inkl. transitive Abhängigkeiten) • BCNF (inkl. Determinatoren) • minimale Überdeckung • Relationensynthese • BCNF-Dekomposition 2.1.2 Funktionale Ziele Das Tool ist webbasiert umgesetzt und läuft ohne Probleme auf den gängigen Browsern1 . Zusätzlich bietet das Tool weitere Funktionen, die im Weiteren genauer erläutert werden. 1 Firefox, Chrome und Internet Explorer 5 KAPITEL 2. ANFORDERUNGSSPEZIFIKATION Normalformerkennung Unter der Normalformerkennung wird verstanden, dass man als Eingabeparameter eine Relation und deren funktionale Abhängigkeiten bereitstellt, und das Tool dann ausgibt in welcher Normalform sich diese Relation befindet. Es werden zwei verschiedene Arten der 2. Normalform (einmal nach Specht und einmal nach Kemper) berücksichtigt. Fragebogen Um den Studenten der Lehrveranstaltung eine Möglichkeit zu geben, sich selbst zu testen und das Erlernte einzuüben, gibt es die Möglichkeit, Fragebögen zu verschiedenen Teilbereichen zu erstellen, beantworten und auswerten zu lassen. Zusatzfunktionen Zusätzlich zu den bereits erwähnten Funktionen bietet das Tool die Möglichkeit, aus einer gegebenen Relation und deren funktionalen Abhängigkeiten eine BCNF-Dekomposition, eine Relationensynthese und die minimale Überdeckung zu berechnen. 2.2 Technologien In diesem Abschnitt werden die verwendeten Technologien vorgestellt. 2.2.1 PHP und PHPUnit Da das Übungstool webbasiert umgesetzt werden sollte, wurde vor allem auf XHTML mit PHP 5.5.9 gesetzt. Zum Testen der in PHP implementierten Algorithmen wurde PHPUnit verwendet. PHPUnit ist ein Tool zum automatisierten Testen von PHP Code. <?php // require all files containing the code to test require_once ’../functions/helperFunctions.php’; class FunctionsTest extends PHPUnit_Framework_TestCase { public function testGetMinimalKeys() { // Arrange $relation = array( 6 Katja Sonderegger KAPITEL 2. ANFORDERUNGSSPEZIFIKATION ’A’,’B’,’C’,’D’,’E’ ); // A,B,C->D;B->E;E->A $fd = array( array( array(’A’, ’B’, ’C’), array(’D’), ), array( array(’B’), array(’E’), ), array( array(’E’), array(’A’), ), ); // Act $possibleKeys = getMinimalKeys($relation, $fd); // Assert $expectedKeys = array(array(’B’, ’C’)); $this->assertEquals($expectedKeys, $possibleKeys); } } ?> Codebeispiel 2.1: PHPUnit Codebeispiel. In Codebeispiel 2.1 wird die Funktion “getMinimalKeys” getestet, die die minimalen Schlüsselkandidaten zu einer gegebenen Relation und deren funktionalen Abhängigkeiten berechnet. Mit Hilfe von Assertions können die Ergebnisse verglichen werden. Wie im Codebeispiel ersichtlich, muss in PHPUnit jede Funktion, die getestet werden soll, ihren Namen mit “test” beginnen. Im Beispielcode oben heißt daher die Funktion testGetMinimalKeys(). 2.2.2 JavaScript bzw JQuery JavaScript ist eine Skriptsprache, die oft verwendet wird, um auf die Eingabe des Benutzers zu reagieren. JQuery ist eine freie JavaScriptBibliothek, die die Verwendung von JavaScript erleichtert. Katja Sonderegger 7 KAPITEL 2. ANFORDERUNGSSPEZIFIKATION 2.2.3 CSS CSS (Cascading Style Sheets) ist eine deklarative Sprache und wird in dieser Arbeit verwendet, um die vorhandenen XHTML Elemente visuell darzustellen. Der Großteil der Arbeit wurde mit Hilfe von Bootstrap2 gestaltet. 2 8 [http://getbootstrap.com/] - 10. Mai 2014 Katja Sonderegger Kapitel 3 Systemüberblick Abbildung 3.1: Menü des Übungstools. Wie man in Abbildung 3.1 sieht, besteht das Tool aus verschiedenen Bereichen: Startseite Auf der Startseite gibt es einige einleitende Worte. Fakten und Regeln In den Fakten und Regeln werden alle Begriffe anhand von Beispielen erklärt. Normalformberechnung Hier ist der Kern des Normalformen-Tools: die Normalformberechnung, als auch die zusätzlichen Algorithmen (minimale Überdeckung, Relationensynthese, BCNF-Dekomposition). Übungen Hier können die von den Übungsleitern hochgestellten Übungsaufgaben bearbeitet werden. Tools Bei Tools kann ein Fragebogen generiert werden oder explizit eine Aufgabe generiert werden, die in einer bestimmten Normalform ist. 9 KAPITEL 3. SYSTEMÜBERBLICK Hilfe Diese Arbeit, sowie weitere Hilfestellungen, werden unter diesem Punkt verlinkt. Referenzen Alle Referenzen befinden sich hier. Um die Funktion des webbasierten Normalformen-Übungstools genauer erklären zu können, benötigt es zuerst die Definition und Erläuterung einiger Begriffe. Falls nicht anders angemerkt, sind die folgenden Definitionen und Erklärungen aus [Spe13] entnommen. 3.1 Warum braucht es Normalformen? In relationalen Datenbanksystemen werden Daten mit Hilfe von Tabellen (Relationen) gespeichert. Bei der Erstellung dieser Relationen ist es wichtig, bestimmte Punkte zu beachten, damit man später nicht redundante Informationen abspeichert und nicht mehr Datenbankzugriffe als unbedingt nötig machen muss, um einen Datensatz zu speichern, zu bearbeiten oder zu löschen. Um die Erstellung von “guten” Tabellen zu erleichtern und die oben genannten Probleme zu verhindern, wurden bereits in den frühen 50er Jahren erste Versuche gestartet, Regeln zu definieren, nach denen man sich richten konnte. Diese Regeln wurden im Laufe der Zeit immer wieder abgeändert und erweitert, bis schlussendlich die heute bekannten Normalformen entstanden sind. Von den derzeit fünf Normalformen (+ BCNF) sind vor allem die ersten drei und die BCNF entscheidend. Die vierte und fünfte Normalform werden eher selten gebraucht. 3.2 Atomare Attribute Die einzelnen Spaltenelemente der Tabelle werden auch Attribute genannt. Wenn diese atomar sind, bedeutet das, dass das Element weder ein Array, eine Liste, eine Struktur noch eine Menge ist. Anders gesagt: die Attribute sind nicht weiter zerlegbar. 3.3 Funktionale Abhängigkeiten In Relationen kann es funktionale Abhängigkeiten geben. Funktionale Abhängigkeiten sind wie folgt definiert: Gegeben sei die Relation R(A1 , ..., An ) und X,Y ⊆ A1 , ..., An 10 Katja Sonderegger KAPITEL 3. SYSTEMÜBERBLICK Eine Attributkombination Y heißt funktional abhängig von X, wenn in jedem möglichen Tupel von R die Werte von Y durch die von X eindeutig bestimmt sind. In Zeichen: X → Y ( X bestimmt Y“) ” 3.4 Schlüssel Grundsätzlich sind hier verschiedene Begriffe zu unterscheiden, welche im Folgenden näher erläutert werden. 3.4.1 Superschlüssel Ein Superschlüssel ist eine Kombination von Attributen, über deren funktionale Abhängigkeiten (FA) alle restlichen Attribute der Relation erreicht werden können. Der einfachste Weg einen Superschlüssel zu finden, ist die Berechnung der Attributhülle. Sind alle Elemente der Relation auch in der Attributhülle enthalten, so ist diese Attributkombination ein Superschlüssel. Hier ist anzumerken, dass ein Superschlüssel beliebig viele Elemente enthalten kann und es in einer Relation viele verschiedene Superschlüssel geben kann. Beispiel 3.1. Superschlüssel. Relation FA {A,B,C,D,E} {A → BC, D → E} Hier gibt es folgende Superschlüssel: AD, ADE, ADB, ADC, ..., ABCDE 3.4.2 Schlüsselkandidaten Ein Schlüsselkandidat ist ein Superschlüssel mit der zusätzlichen Anforderung, dass der Superschlüssel minimal sein soll. Die minimalen Superschlüssel aus Beispiel 3.1 sind: AD. Somit ist AD in diesem Beispiel der einzige Schlüsselkandidat. 3.4.3 Schlüsselattribut Schlüsselattribute sind alle Elemente, die im Schlüsselkandidat enthalten sind. In Beispiel 3.1 sind die Schlüsselattribute: A,D und folglich alle Nicht-Schlüsselattribute: B,C,E. Katja Sonderegger 11 KAPITEL 3. SYSTEMÜBERBLICK 3.4.4 Voll funktionale Abhängigkeiten Funktionale Abhängigkeiten wurden bereits erklärt. Allerdings gibt es noch eine Verfeinerung der funktionalen Abhängigkeit - die voll funktionale Abhängigkeit: Gegeben sei die Relation R(A1 , ..., An ) und X,Y ⊆ A1 , ..., An Eine Attributkombination Y heißt voll funktional abhängig von X, wenn Y funktional abhängig von X ist, aber nicht funktional abhängig von einer echten Teilmenge von X ist. In Zeichen X → ˙ Y Gibt es nur einelementige Schlüssel, dann sind alle funktionalen Abhängigkeiten auch voll funktional abhängig von jedem Schlüssel. 3.5 Transitive Abhängigkeiten Transitive Abhängigkeiten werden wie folgt definiert: In einer Relation R ist eine Attributkombination Z transitiv abhängig von X, wenn Z funktional abhängig von Y und Y funktional abhängig von X ist. Dabei muss zusätzlich gelten, dass X nicht auch funktional ? abhängig von Y ist. In Zeichen: X → − Z. ? Formal ist X → − Z gleichbedeutend zu: 1. X → Y und Y → Z 2. X, Y, Z verschieden 3. Es darf nicht gelten: Y → X 3.6 Determinator Ein Determinator ist wie folgt definiert: Gegeben sei die Relation R(A1 , ..., An ) und X,Y ⊆ A1 , ..., An X heißt Determinator von Y, wenn Y von X voll funktional abhängig ist. D.h. Det(Y) = X ist gleichbedeu? tend zu X → − Y 12 Katja Sonderegger KAPITEL 3. SYSTEMÜBERBLICK 3.7 Zerlegung Eine Zerlegung ist die Aufteilung einer Relation in mehrere kleine Relationen. Hierbei kann man verlustfreie, abhängigkeitsbewahrende Zerlegungen erhalten. Gegeben sei eine Relation R, die in die Relationen R1 ,..., Rn zerlegt wird. Verlustfreiheit Diese Zerlegung ist verlustfrei, wenn alle zerlegten Relationen R1 ,..., Rn wieder zusammengefügt werden können und das Ergebnis wieder die Anfangsrelation R ist. Kurz: R:= R1 ∪...∪ Rn Abhängigkeitsbewahrung Die Zerlegung ist abhängigkeitsbewahrend, wenn alle in R geltenden funktionalen Abhängigkeiten (F) erhalten bleiben, das heißt, dass gefordert wird, dass FR := FR1 ∪...∪ FRn Katja Sonderegger 13 Kapitel 4 Systemimplementierung Nachdem die wichtigsten Begriffe im vorhergehenden Kapitel erklärt wurden, befasst sich der folgende Teil mit der Funktionalität des Normalformentools und den verwendeten Algorithmen. 4.1 Normalformenberechnung Die Normalformenberechnung ist der Kern des Normalformen-Tools. Hier wird aus einer gegebenen Relation und deren funktionalen Abhängigkeiten berechnet, in welcher Normalform sich die Relation befindet. Abbildung 4.1: Normalformen-Tool Eingabe. Abbildung 4.1 zeigt die Eingabe der Normalformberechnung. Hier können die Elemente, die in der Relation enthalten sind, im Feld “Relationsschema” angegeben werden. Die zugehörigen funktionalen Abhängigkeiten 15 KAPITEL 4. SYSTEMIMPLEMENTIERUNG werden im Feld “funktionale Abhängigkeiten” angegeben, wobei einzelne funktionale Abhängigkeiten mit einem Strichpunkt getrennt werden, während die Elemente innerhalb der Abhängigkeiten mit einem Beistrich getrennt werden. Beispielsweise ist eine mögliche Eingabe: A, B → C; C → A; C → D; C → E; D → B Abbildung 4.2: Normalformen-Tool Ausgabe. Die Ausgabe der Normalformberechnung ist in Abbildung 4.2 zu sehen. In diesem Fall wurde ausgewählt, dass die Berechnung nicht in der zweiten Normalform laut Specht erfolgen soll, sondern in der zweiten Normalform laut Kemper. In Abbildung 4.3 ist die Ausgabe der Normalformberechnung laut Specht zu sehen. In den Abbildungen 4.2 und 4.3 ist die Normalformberechnung des Tools ersichtlich und wird hier nun genauer erklärt. Bevor die Berechnung der einzelnen Normalformen durchgeführt wird, werden die Eingabedaten auf ihre Korrektheit überprüft. Anschließend werden die Schlüsselkandidaten berechnet - also jene Attribute, mit denen man alle anderen Attribute der Relation erreichen kann. 16 Katja Sonderegger KAPITEL 4. SYSTEMIMPLEMENTIERUNG Abbildung 4.3: Normalformen-Tool Ausgabe inkl. Specht. 4.1.1 Schlüsselkandidaten Für die Berechnung der Schlüsselkandidaten wird ein rekursiver Algorithmus verwendet, der schlussendlich alle minimalen Schlüsselkandidaten zurückgibt. Input: R FA K Relation R mit ihren Attributen alle funktionalen Abhängigkeiten (FA) der Relation R Attribute (K), die später der minimale Schlüsselkandidat werden sollen (zu Beginn ist K = {x |x ∈ R}) Output: Array von minimalen Schlüsselkandidaten Algorithmus: 1. überprüfe, ob die Attribute K bereits einen Superschlüssel darstellen 2. ist K bereits ein Superschlüssel, wird ein kleinerer Superschlüssel gesucht, indem jeweils ein Attribut (a) von K entfernt wird und überprüft wird, ob (K − a) immer noch ein Superschlüssel ist 3. wenn (K − a) ein Superschlüssel ist, wurde ein kleinerer Schlüsselkandidat gefunden und die Funktion wird erneut mit dem neuen minimalen Schlüssel (K − a) aufgerufen Katja Sonderegger 17 KAPITEL 4. SYSTEMIMPLEMENTIERUNG 4. wenn kein neuer minimaler Schlüssel gefunden wurde, wird K zu den minimalen Schlüsselkandidaten hinzugefügt Die Überprüfung, ob eine Kombination von Attributen ein Schlüsselkandidat ist, wird mit Hilfe der Attributhülle berechnet. Die Attributhülle ist die Menge aller Elemente, die über die funktionalen Abhängigkeiten von einer Attributkombination erreicht werden kann. Diese Menge wird mit den Relationselementen verglichen. Wenn die Hülle alle Elemente der Relation enthält, ist die Attributkombination ein Superschlüssel. Erläuterung der verwendeten Funktionen: • isKey(relation, fd, attributes) Die Funktion isKey berechnet mit Hilfe der Attributhülle, ob eine Menge von Attributen (attributes) ein Superschlüssel zur gegebenen Relation und ihren funktionalen Abhängigkeiten ist. Die Funktion gibt einen Wahrheitswert zurück. • arrayContains(minimalKeys, newMinimalKey) Die Funktion arrayContains vergleicht zwei Arrays miteinander, und überprüft, ob der neue minimale Superschlüssel im derzeitigen minimalen Superschlüssel enthalten ist und gibt dementsprechend einen Wahrheitswert zurück. attributes = relation; getMinimalKeysRecursive(relation, fd, attributes) { if isKey(relation, fd, attributes) then foundSmallerKey = false; foreach attribute in attributes do reducedAttributes = attributes - attribute; if isKey(relation, fd, reducedAttributes) then foundSmallerKey = true; newMinimalKeys = getMinimalKeysRecursive(relation, fd, reducedAttributes); foreach newMinimalKey in newMinimalKeys do if !arrayContains(minimalKeys, newMinimalKey) then minimalKeys[] = newMinimalKey; if !foundSmallerKey then if !arrayContains(minimalKeys, attributes) minimalKeys[] = attributes; return minimalKeys; } then Codebeispiel 4.1: Berechnung der Schlüsselkandidaten. Nachdem die Schlüsselkandidaten berechnet wurden, werden die einzelnen Normalformen berechnet. Das Normalformen-Tool deckt die erste 18 Katja Sonderegger KAPITEL 4. SYSTEMIMPLEMENTIERUNG Normalform, zweite Normalform, dritte Normalform, sowie die BCNF ab, welche im Folgenden erläutert werden:1 4.1.2 1. Normalform Eine Relation R ist in der ersten Normalform, wenn all ihre Domänen nur elementare Werte enthalten. Die erste Normalform wird in diesem Tool schon von den gegebenen Relationen vorausgesetzt und wird daher nicht überprüft. Beispiel 4.1. Negativbeispiel für die erste Normalform und Lösung. MatrNr. 123456 234567 Nachname Sonderegger Stricker Vorname Katja Benedikt LV DBS, Funktionale Prog. WebInfoSys, LinAlg Die oben dargestellte Relation enthält Matrikelnummer und Namen von Studenten und die Lehrveranstaltungen die sie besuchen. Hier ist die erste Normalform verletzt, weil das Attribut LV eine Liste von Lehrveranstaltungen enthält, was in der ersten Normalform nicht erlaubt ist. In der ersten Normalform sieht die Relation wie folgt aus: MatrNr. 123456 123456 234567 234567 Nachname Sonderegger Sonderegger Stricker Stricker Vorname Katja Katja Benedikt Benedikt LV Datenbanksysteme Funktionale Prog. Webinformationssysteme Lineare Algebra Hier werden die Lehrveranstaltungen nicht gemeinsam als Struct, Liste oder Menge gespeichert, und somit erfüllt diese Relation die erste Normalform. Im Folgenden wird die zweite Normalform erläutert. Hierbei sei erwähnt, dass im Normalformen-Tool zwei verschiedene Definitionen der zweiten Normalform implementiert wurden. Für genauere Informationen zu den einzelnen Normalformen wird auf [KE06] für die zweite Normalform laut Kemper und auf [Spe13] für die zweite Normalform laut Specht verwiesen. 4.1.3 2. Normalform (Kemper) Die zweite Normalform laut Kemper ist wie folgt definiert: 1 Auch hier gilt wieder, dass alle Definitionen, wenn nicht anders angegeben aus den Unterlagen der Vorlesung entnommen sind [Spe13]. Katja Sonderegger 19 KAPITEL 4. SYSTEMIMPLEMENTIERUNG Eine Relation R mit zugehörigen FA F ist in zweiter Normalform, falls jedes Nichtschlüssel-Attribut A ∈ R voll funktional abhängig ist von jedem Kandidatenschlüssel der Relation. [KE06] Die Berechnung der zweiten Normalform laut Kemper ist in folgendem Algorithmus angegeben und wird wie folgt durchgeführt: Input: R FA K Relation R mit ihren Attributen alle funktionalen Abhängigkeiten (FA) der Relation R Array mit allen minimalen Schlüsselkandidaten Output: Wahrheitswert, der mitteilt, ob die Relation in zweiter Normalform laut Kemper ist oder nicht Algorithmus: 1. zuerst wird überprüft, ob es nur einelementige Schlüsselkandidaten gibt, wenn ja, dann ist die Relation bereits in zweiter Normalform und der Algorithmus ist beendet. 2. ist dies nicht der Fall, werden alle Nichtschlüsselattribute ermittelt und für jeden Schlüsselkandidaten wird überprüft, ob alle Nichtschlüsselattribute voll funktional abhängig vom gesamten Schlüsselkandidaten sind. Ist dies nicht der Fall, ist die Relation nicht in zweiter Normalform laut Kemper. Erläuterung der verwendeten Funktionen: • getFullFunctionalDependency(nonKeyAttribute, key, fd) Die Funktion getFullFunctionalDependency gibt einen Wahrheitswert zurück, der mitteilt, ob eine funktionale Abhängigkeit zu einem Schlüsselkandidaten (key) besteht. checkSecondLikeKemper(relation, fd, keys){ inKemper = false; if all keys have only one attribute then inKemper = true else nonKeyAttributes = relation; foreach key in keys do nonKeyAttributes = nonKeyAttributes - key; if nonKeyAttribute is empty then inKemper = true; else 20 Katja Sonderegger KAPITEL 4. SYSTEMIMPLEMENTIERUNG inKemper = true; foreach key in keys do foreach nonKeyAttribute in nonKeyAttributes do if !getFullFunctionalDependency(nonKeyAttribute, key , fd) do inKemper = false; return inKemper; } Codebeispiel 4.2: Berechnung der zweiten Normalform nach Kemper. Beispiel 4.2. Negativbeispiel für die zweite Normalform nach Kemper und Lösung. MatrNr 123456 234567 StudentNachname Sonderegger Stricker Dozent Specht Gassler LV Datenbanksysteme WebInfoSys Die oben dargestellte Relation enthält Matrikelnummer und Nachname von Studenten und den Namen des Dozenten, bei dem sie eine Lehrveranstaltung besuchen. Die funktionalen Abhängigkeiten sind folgende: MatrNr → StudentNachname Dozent → LV Daraus ergibt sich der zusammengesetzte Schlüsselkandidat: (MatrNr, Dozent). Hier ist die zweite Normalform verletzt, da LV von einem Teil des Schlüsselkandidaten (Dozent) abhängig ist. Selbiges gilt für den StudentNachname, der von MatrNr abhängig ist. Um die zweite Normalform nach Kemper zu erfüllen, kann die Relation in folgende Relationen aufgeteilt werden: MatrNr 123456 234567 Dozent Specht Gassler StudentNachname Sonderegger Stricker LV Datenbanksysteme Webinformationssysteme Katja Sonderegger 21 KAPITEL 4. SYSTEMIMPLEMENTIERUNG MatrNr 123456 234567 4.1.4 Dozent Specht Gassler 2. Normalform (Specht) Eine Relation R ist in 2NF, wenn gilt: 1. R ist in 1NF, und 2. Für jeden Schlüsselkandidaten SK gilt: alle Attribute im Komplement von SK sind voll funktional abhängig vom SK. Die Berechnung der zweiten Normalform laut Specht2 ist in folgendem Algorithmus angegeben und wird wie folgt durchgeführt: Input: R FA K Relation R mit ihren Attributen alle funktionalen Abhängigkeiten (FA) der Relation R Array mit allen minimalen Schlüsselkandidaten Output: Wahrheitswert, der mitteilt, ob die Relation in zweiter Normalform laut Specht ist oder nicht Algorithmus: 1. zuerst wird überprüft, ob es nur einelementige Schlüsselkandidaten gibt, wenn ja, dann ist es bereits in zweiter Normalform und der Algorithmus ist beendet. 2. ist dies nicht der Fall, werden für jeden Schlüssel alle Nichtschlüsselattribute ermittelt und überprüft, ob alle Nichtschlüsselattribute voll funktional abhängig vom gesamten Schlüsselkandidaten sind. Ist dies nicht der Fall, ist die Relation nicht in zweiter Normalform laut Specht. checkSecondLikeSpecht(relation, fd, keys){ inSpecht = false; if all keys have only one attribute then inSpecht = true; 2 Diese strengere Definition geht laut Specht bis auf eine Vorlesungsmitschrift aus dem Jahr 1986 der Vorlesung von Professor R. Bayer, Datenbanksysteme I, gehalten an der TU München, zurück. 22 Katja Sonderegger KAPITEL 4. SYSTEMIMPLEMENTIERUNG else foreach key in keys do nonKeyAttributes = relation; nonKeyAttributes = nonKeyAttributes - key; if nonKeyAttributes is empty then inSpecht = true; else inSpecht = true; foreach nonKeyAttribute in nonKeyAttributes do if !getFullFunctionalDependency(nonKeyAttribute, key, fd) do inSpecht = false; return inSpecht; } Codebeispiel 4.3: Berechnung der zweiten Normalform nach Specht. Beispiel 4.3. Negativbeispiel für die zweite Normalform nach Specht. Gegeben sei eine Relation, in der die Matrikelnummer und das Studium eines Studenten abgespeichert wird. Zusätzlich wird auch noch die Universität, an der er dieses Studium absolviert, abgespeichert. Dann ergeben sich folgende funktionale Abhängigkeiten: MatrNr, Studium → Universität Universität → Studium Schlüsselkandidaten: (MatrNr, Studium) und (MatrNr, Universität) MatrNr 123456 789012 456789 Studium Informatik Informatik Biologie Universität Universität Innsbruck Universität Wien Universität Innsbruck In der Definition nach Kemper wird hier kein Attribut überprüft, da alle Attribute Teil eines Schlüsselkandidaten sind. Daher ist diese Relation in der zweiten Normalform nach Kemper. In der Definition nach Specht hingegen werden mehrere Attribute überprüft, da die Überprüfung bezüglich jedes Schlüssels separat durchgeführt wird: • Universität wird für Schlüsselkandidat (MatrNr, Studium) geprüft und • Studium wird für Schlüsselkandidat (MatrNr, Universität) geprüft. – Bei der Überprüfung von Studium bezüglich des Schlüsselkandidaten (MatrNr, Universität) ist die zweite Normalform Katja Sonderegger 23 KAPITEL 4. SYSTEMIMPLEMENTIERUNG nach Specht durch die funktionale Abhängigkeit Universität → Studium verletzt, da hier das Studium von einem Teil des Schlüsselkandidaten abhängig ist. 4.1.5 3. Normalform Die dritte Normalform ist wie folgt definiert: Ein Relationsschema R ist in dritter Normalform, wenn für jede für R geltende funktionale Abhängigkeit der Form α → B mit α ⊆ R und B ∈ R mindestens eine von drei Bedingungen gilt: • B ∈ α, d.h. die FA ist trivial. • Das Attribut B ist in einem Kandidatenschlüssel von R enthalten - also B ist prim. • α ist Superschlüssel von R. [KE06, Seite 188] Eine alternative Definition der dritten Normalform ist wie folgt definiert: Eine Relation R ist in 3NF, wenn gilt 1. R ist in 2NF, und 2. R enthält keine transitiven Abhängigkeiten[Spe13] Die Berechnung der dritten Normalform basiert auf der Definition nach [KE06, Seite 188] und wird wie folgt durchgeführt: Input: R FA K Relation R mit ihren Attributen alle funktionalen Abhängigkeiten (FA) der Relation R Array mit allen minimalen Schlüsselkandidaten Output: Wahrheitswert, der mitteilt, ob die Relation in dritter Normalform ist oder nicht Algorithmus: 1. für jede funktionale Abhängigkeit wird überprüft, ob sie: • trivial ist 24 Katja Sonderegger KAPITEL 4. SYSTEMIMPLEMENTIERUNG • die rechte Seite der funktionalen Abhängigkeit aus Schlüsselattributen besteht • ob die linke Seite ein Superschlüssel ist 2. trifft für jede der funktionalen Abhängigkeiten eine der oben genannten Eigenschaften zu, ist die Relation in der dritten Normalform. Erläuterung der verwendeten Funktionen: • checkConditionsForThird(nonKeyAttributes, keyAttributes, fd, relation) Die Funktion checkConditionsForThird gibt einen Wahrheitswert zurück, der true zurück gibt, wenn alle funktionalen Abhängigkeiten mindestens eine der drei Bedingungen der Definition erfüllen. Ansonsten wird false zurückgegeben. checkThird(relation, fd, keys) { inThird = false; nonKeyAttributes = relation; foreach key in keys do nonKeyAttributes = nonKeyAttributes - key; foreach attribute in relation do if attribute is in keys then keyAttributes[] = attribute; if nonKeyAttributes is empty then inThird = true; else if checkConditionsForThird(nonKeyAttributes, keyAttributes, fd, relation) then inThird = true; return inThird; } Codebeispiel 4.4: Berechnung der dritten Normalform. Beispiel 4.4. Negativbeispiel für die dritte Normalform und Lösung. Gegeben sei folgende Situation: Ein Student nimmt an einer Prüfung teil. Für diese Prüfung existiert nachfolgende Relation in der man nachsehen kann, in welchem Hörsaal die Prüfung abgehalten wird. Es stehen zwei Hörsäle zur Verfügung. Alle Studenten deren Anfangsbuchstabe des Nachnamen zwischen A und L liegt, schreiben in HS A - alle anderen in HS B. Daraus ergeben sich folgende funktionale Abhängigkeiten: MatrNr. → Vorname, Nachname Nachname → Prüfungshörsaal Katja Sonderegger 25 KAPITEL 4. SYSTEMIMPLEMENTIERUNG MatrNr 123456 234567 789020 Nachname Sonderegger Stricker Amann Vorname Katja Benedikt Franz Prüfungshörsaal HS B HS B HS A Diese Relation ist nicht in dritter Normalform, weil die funktionale Abhängigkeit Nachname → Prüfungshörsaal die dritte Normalform verletzt. In der dritten Normalform würde die Relation in folgende Relationen aufgeteilt werden: MatrNr 123456 234567 789020 Nachname Sonderegger Stricker Amann Nachname Sonderegger Stricker Amann 4.1.6 Vorname Katja Benedikt Franz Prüfungshörsaal HS B HS B HS A Boyce Codd Normalform Die Boyce Codd Normalform (BCNF) ist wie folgt definiert: Ein Relationsschema R mit FAs F ist in BCNF, falls für jede funktionale Abhängigkeit α → β mindestens eine der folgenden zwei Bedingungen gilt: • β ⊆ α, d.h. die Abhängigkeit ist trivial oder • α ist Superschlüssel von R[KE06, Seiten 190,191] Die Berechnung der BCNF ist in folgendem Algorithmus angegeben und wird wie folgt durchgeführt: Input: R FA K Relation R mit ihren Attributen alle funktionalen Abhängigkeiten (FA) der Relation R Array mit allen minimalen Schlüsselkandidaten Output: Wahrheitswert, der mitteilt, ob die Relation in BCNF ist oder nicht Algorithmus: 26 Katja Sonderegger KAPITEL 4. SYSTEMIMPLEMENTIERUNG 1. für jede funktionale Abhängigkeit wird überprüft, ob die linke Seite ein Superschlüssel ist. Ist dies nicht der Fall, so ist die Relation nicht in BCNF. checkBCNF(relation, fd, keys) { foreach dependency in fd do check = false; left = left side of dependency; if isKey(relation, fd, left) then check = true; if !check then return false; return true; } Codebeispiel 4.5: Berechnung der BCNF. Beispiel 4.5. Negativbeispiel für die BCNF. Gegeben sei eine Relation, in der die Matrikelnummer und das Studium eines Studenten abgespeichert wird. Zusätzlich wird auch noch die Universität, an der er dieses Studium absolviert, abgespeichert. Dann ergeben sich folgende funktionale Abhängigkeiten: MatrNr, Studium → Universität Universität → Studium Schlüsselkandidaten: (MatrNr, Studium) und (MatrNr, Universität) MatrNr 123456 789012 456789 Studium Informatik Informatik Biologie Universität Universität Innsbruck Universität Wien Universität Innsbruck Diese Relation ist nicht in BCNF, da das Studium von der Universität abhängig ist und die Universität kein Superschlüssel ist. 4.2 Minimale Überdeckung Die minimale Überdeckung3 ist die Reduktion der funktionalen Abhängigkeiten, sodass die überflüssigen funktionalen Abhängigkeiten entfernt werden und eine minimale Version der funktionalen Abhängigkeiten entsteht. Es gibt immer eine minimale Überdeckung, allerdings ist sie 3 in der Literatur wird die minimale Überdeckung auch kanonische Überdeckung genannt Katja Sonderegger 27 KAPITEL 4. SYSTEMIMPLEMENTIERUNG nicht immer eindeutig, das heißt, es kann mehrere unterschiedliche minimale Überdeckungen geben. Definition:[KE06, Seite 177] Zu einer gegebenen Menge F von FA nennt man Fc eine minimale Überdeckung, falls folgende drei Eigenschaften erfüllt sind: 1. Fc ≡ F, d.h. Fc + = F+ 2. In Fc existieren keine FA α → β, bei denen α oder β überflüssige Attribute enthalten. D.h. es muss folgendes gelten: (a) ∀ A ∈ α: (Fc - (α → β) ∪ ((α - A) → β)) 6≡ Fc (b) ∀ B ∈ β: (Fc - (α → β) ∪ ((α → (β - B))) 6≡ Fc 3. Jede linke Seite einer funktionalen Abhängigkeit in Fc ist einzigartig. Dies kann durch sukzessive Anwendung der Vereinigungsregel auf FA der Art α → β und α → γ erzielt werden, so dass die beiden FA durch α → βγ ersetzt werden. Der folgende Algorithmus wurde aus [KE06, Seite 177-178] übernommen: Algorithmus: Zu einer gegebenen Menge F von FA kann man eine minimale Überdeckung wie folgt bestimmen: 1. Führe für jede FA α → β ∈ F die Linksreduktion durch, also: • Überprüfe für alle A ∈ α, ob A überflüssig ist, d.h. ob β ⊆ AttrHülle(F, α − A) gilt. Falls dies der Fall ist, ersetze α → β durch α − A → β. 2. Führe für jede (verbliebene) FA α → β die Rechtsreduktion durch, also: • Überprüfe für alle B ∈ β, ob B ∈ AttrHülle(F − (α → β) ∪ (α → (β − B)), α) gilt. In diesem Fall ist B auf der rechten Seite überflüssig und kann eliminiert werden, d.h. α → β wird durch α → (β − B) ersetzt. 3. Entferne die FA der Form α → ∅, die im 2. Schritt entstanden sind. 28 Katja Sonderegger KAPITEL 4. SYSTEMIMPLEMENTIERUNG 4. Fasse mittels der Vereinigungsregel4 FA der Form α → β 1 , ..., α → β n zusammen, so dass α → (β 1 ∪ ... ∪ β n ) verbleibt. Erläuterung der verwendeten Funktionen: • reduceLeftSide(relation, fd) Die Funktion reduceLeftSide reduziert die linke Seite aller gegebenen funktionalen Abhängigkeiten (fd), sodass nur die notwendigen Attribute auf der linken Seite stehen. • reduceRightSide(relation, fd) Die Funktion reduceRightSide reduziert die rechte Seite aller gegebenen funktionalen Abhängigkeiten (fd), sodass nur die notwendigen Attribute auf der rechten Seite stehen. getMinimalCover(relation, fd) { fd = reduceLeftSide(relation, fd); fd = reduceRightSide(relation, fd); foreach dependency in fd do if dependency -> right is empty then remove dependency from fd; if there are fds with same left side in fd then summarize into one dependency; return fd; } Codebeispiel 4.6: Berechnung der minimalen Überdeckung. In Abbildung 4.4 sieht man die Ausgabe der Berechnung der minimalen Überdeckung anhand eines Beispiels. Beispiel 4.6. Berechnung der minimalen Überdeckung. Relation R = A, B, C, D, E, F A → BC C → AD E → ABC F → CD Schlüsselkandidaten (EF) 1. zuerst wird die Linksreduktion durchgeführt: • A → BC - kann nicht reduziert werden • C → AD - kann nicht reduziert werden • E → ABC - kann nicht reduziert werden 4 Wenn α → β und α → γ gelten, dann gilt auch α → βγ.[KE06, Seite 176] Katja Sonderegger 29 KAPITEL 4. SYSTEMIMPLEMENTIERUNG Abbildung 4.4: Ausgabe der Berechnung der minimalen Überdeckung. • F → CD - kann nicht reduziert werden Da alle linken Seiten bereits minimal sind, bleibt nach der Linksreduktion das Ergebnis das selbe. 2. Rechtsreduktion: • A → BC - kann nicht reduziert werden • C → AD - kann nicht reduziert werden • E → ABC - da wir mit C über C → AD bereits A erreichen, kann A entfernt werden. Auch B erreichen wir anschließend durch A mit A → BC. ⇒ Reduktion der FA auf: E → C • F → CD - da wir mit C über C → AD bereits D erreichen, kann D entfernt werden. ⇒ Reduktion der FA auf: F → C Ergebnis nach der Rechtsreduktion: A → BC, C → AD, E → C, F → C 3. da keine der neuen FA in der Form X → ∅ ist, kann keine FA entfernt werden. 4. da keine der neuen FA die selbe linke Seite hat, und somit nichts zusammengefügt werden kann, ist hiermit die Berechnung fertig. 30 Katja Sonderegger KAPITEL 4. SYSTEMIMPLEMENTIERUNG Ergebnis: A → BC, C → AD, E → C, F → C 4.3 Relationensynthese Die Relationensynthese ist ein Algorithmus, um aus einer Relation und deren funktionalen Abhängigkeiten eine verlustlose, abhängigkeitsbewahrende Zerlegung zu finden, mit der sich alle neuen Relationen in der dritten Normalform befinden. Der Algorithmus wurde von Biskup, Dayal und Bernstein [BDB79] eingeführt. Algorithmus: 1. Bestimme die minimale Überdeckung G zur Menge der funktionalen Abhängigkeiten F. 2. Erzeuge eine eigene Relation für Attribute, die in keiner FA vorkommen. 3. Für jedes X in funktionalen Abhängigkeiten X → A1 ,..., X → An ∈ G: • Erzeuge eine Relation RX := X ∪ A1 ∪ ... ∪ An • Ordne der Relation alle FA zu, von denen alle Attribute in RX enthalten sind. 4. Falls keine der erzeugten Relationen einen Schlüsselkandidaten enthält, wähle einen Schlüsselkandidaten SK und erzeuge eine zusätzliche Relation RSK := SK. Erläuterung der verwendeten Funktionen: • getMinimalCover(relation, fd) Die Funktion getMinimalCover berechnet die minimale Überdeckung der funktionalen Abhängigkeiten (fd). • getMinimalKeys(relation, fd) Die Funktion getMinimalKeys berechnet die minimalen Schlüsselkandidaten zur gegebenen Relation und ihren funktionalen Abhängigkeiten. getRelationSynthese(relation, fd){ fd = getMinimalCover(relation, fd); keys = getMinimalKeys(relation, fd); /*if one attribute is not in any functional dependency*/ foreach attribute in relation do inRelation = false; Katja Sonderegger 31 KAPITEL 4. SYSTEMIMPLEMENTIERUNG foreach dependency in fd do if attribute is in dependency then inRelation = true; if !inRelation then newRelation[] = attribute; allRelations[] = newRelation; foreach dependency in fd do elements = attributes of dependency; foreach dependency2 in fd do if (leftSide is in dependency) && (rightSide is not in dependency) then if rightSide is not in elements then elements[] = rightSide; allRelations[] = elements; newRelationFDs[][] = get all functional dependencies for elements; /*one more relation if no key is part of a relation*/ boolean = false; foreach relation in allRelations do if key is in relation then boolean = true; if !boolean then allRelations[] = key; return allRelations; } Codebeispiel 4.7: Berechnung der Relationensynthese. In Abbildung 4.5 sieht man die Ausgabe der Berechnung der Relationensynthese anhand eines Beispiels. Beispiel 4.7. Berechnung der Relationensynthese. Relation R = A, B, C, D, E, F A → BC C → AD E → ABC F → CD Schlüsselkandidaten (EF) 1. minimale Überdeckung: A → BC, C → AD, E → C, F → C 2. alle Attribute sind in den funktionalen Abhängigkeiten enthalten 3. für alle funktionalen Abhängigkeiten • Relation R1 = A, B, C • Relation R2 = A, C, D 32 Katja Sonderegger KAPITEL 4. SYSTEMIMPLEMENTIERUNG Abbildung 4.5: Ausgabe der Berechnung der Relationensynthese. • Relation R3 = C, E • Relation R4 = C, F 4. da kein Schlüsselkandidat vorhanden ist, wird eine zusätzliche Relation erstellt. Relation R5 = E, F Ergebnis: • Relation R1 = A, B, C mit A → BC • Relation R2 = A, C, D mit C → AD • Relation R3 = C, E mit E → C • Relation R4 = C, F mit F → C • Relation R5 = E, F 4.4 BCNF Dekomposition Die BCNF Dekomposition ist ein Algorithmus, der eine Relation R zerlegt, sodass die Zerlegung verlustlos und in der BCNF ist. Dies ist für jede Relation verlustlos möglich, allerdings ist hier die Bewahrung der Abhängigkeiten nicht immer gegeben. Katja Sonderegger 33 KAPITEL 4. SYSTEMIMPLEMENTIERUNG Die BCNF Dekomposition wird wie im folgenden Algorithmus angegeben berechnet [KE06, Seiten 191,192]: Input: R FA Relation R mit ihren Attributen alle funktionalen Abhängigkeiten (FA) der Relation R Output: Z die verlustlose, Zerlegung Z = R1 ,...,Rn in BCNF Algorithmus: 1. starte mit Z = R 2. Solange es noch ein Relationsschema Ri ∈ Z gibt, das nicht in BCNF ist, mache folgendes: • Finde eine für Ri geltende nicht-triviale FA (a → b) mit a ∩ b = ∅ UND a 6→ Ri • Zerlege Ri in Rn := a ∪ b und Ri2 := Ri - b • Entferne Ri aus Z und füge Ri1 und Ri2 ein, also Z := (Z - Ri ) ∪ Ri1 ∪ Ri2 Erläuterung der verwendeten Funktionen: • checkNormalforms(relation, fd, keys) Die Funktion checkNormalforms berechnet für die Relation und ihren funktionalen Abhängigkeiten, in welcher Normalform sie sich befindet, und gibt das Ergebnis zurück. • getAllViolatingFDs(relation, fd, keys) Die Funktion getAllViolatingFDs sucht alle funktionalen Abhängigkeiten, die die BCNF verletzen, und gibt diese in einem Array zurück. BCNFDecomposition(relation, fd) { keys = getMinimalKeys(relation, fd); /*nf Array contains numbers (21-Specht, 22-Kemper, 3-third NF , 31-BCNF)*/ nf = checkNormalforms(relation, fd, keys); if 31 is in nf then "Already in BCNF"; return relation; else boolean = false; dependencies = getAllViolatingFDs(relation, fd, keys); 34 Katja Sonderegger KAPITEL 4. SYSTEMIMPLEMENTIERUNG foreach dependency in dependencies do elements = dependency -> right; FDs[] = dependency; R[] = elements; relation = relation - elements; R[] = relation; FDs[] = get dependencies for relation; return R; } Codebeispiel 4.8: Berechnung der BCNF-Dekomposition. In Abbildung 4.6 sieht man die Ausgabe der Berechnung der BCNF Dekomposition anhand eines Beispiels. Abbildung 4.6: Ausgabe der Berechnung der BCNF Dekomposition. Beispiel 4.8. Berechnung der BCNF Dekomposition. Relation R = A, B, C, D, E A→B C→D Schlüsselkandidaten (A, C, E) 1. Z:= R 2. für jede funktionale Abhängigkeit, die die BCNF verletzt, wird eine neue Relation erstellt. Die ursprüngliche Relation verliert alle Katja Sonderegger 35 KAPITEL 4. SYSTEMIMPLEMENTIERUNG Elemente, die in der rechten Seite der funktionalen Abhängigkeit vorkommen: • für funktionale Abhängigkeit: A → B Relation R2 = A, B Z ist nun: {R1 = A, C, D, E; R2 = A, B} • für funktionale Abhängigkeit: C → D Relation R3 = C, D Z ist nun: {R1 = A, C, E; R2 = A, B; R3 = C, D} Ergebnis: • Relation R1 = A, C, E • Relation R2 = A, B mit A → B • Relation R3 = C, D mit C → D Das Normalformen-Tool bietet dem Benutzer zusätzlich zu den oben genannten Algorithmen die Möglichkeit, sich selbst zu testen. Dies kann auf zwei verschiedene Arten gemacht werden. 4.5 Übungen Die Übungen im Normalformen-Tool können von den LV-Leitern auf den Server gestellt werden, und stehen anschließend den Studenten zur Verfügung. Hier besteht für den LV-Leiter die Möglichkeit, beliebige Fragen und deren Antwortmöglichkeiten einzutragen. So können alle möglichen Übungsaufgaben zur Verfügung gestellt werden. Abbildung 4.7: Übungsfiles, die auf dem Server liegen und von den LVLeitern zur Verfügung gestellt wurden. 36 Katja Sonderegger KAPITEL 4. SYSTEMIMPLEMENTIERUNG In Abbildung 4.7 ist die Liste der zur Verfügung gestellten Übungen zu sehen. Abbildung 4.8: Übungsfiles werden vom Server geladen und können beantwortet werden. Sobald man eine Übung ausgewählt hat, ist es möglich, die Aufgaben zu beantworten und abzuschicken, was in Abbildung 4.8 ersichtlich ist. Anschließend erhält man eine Auswertung, wo dem Benutzer bei falscher Beantwortung mitgeteilt wird, was die richtige Antwort gewesen wäre. Die Auswertung ist in Abbildung 4.9 ersichtlich. Abbildung 4.9: Validierung des ausgefüllten Fragebogen. Katja Sonderegger 37 KAPITEL 4. SYSTEMIMPLEMENTIERUNG 4.6 Automatische Fragebogengenerierung Mit dem Normalformen-Tool können auch Übungsbeispiele und ganze Fragebögen generiert werden. 4.6.1 Fragebogen generieren Bei der Generierung eines Fragebogens werden vom Benutzer die Anzahl der Relationselemente eingegeben und die Anzahl der Übungsaufgaben, die er im Fragebogen haben möchte. Zusätzlich kann ausgewählt werden, ob man die zweite Normalform nach der Definition von Specht oder nach der Definition von Kemper enthalten haben möchte. Die Generierung eines Fragebogen und der generierte Fragebogen ist in den Abbildungen 4.10 und 4.11 zu sehen. Generierung eines Fragebogens: Input: R F Anzahl der Elemente der Relation Anzahl der Fragen, die generiert werden sollen Output: Fragebogen, der ausgefüllt werden kann Algorithmus: 1. es werden zufällig funktionale Abhängigkeiten generiert 2. mit diesen Abhängigkeiten wird überprüft, in welcher Normalform die Relation mit den funktionalen Abhängigkeiten ist, woraus schlussendlich der Fragebogen zusammengesetzt wird 3. zuletzt werden alle Fragen und Antworten dargestellt Abbildung 4.10: Generierung eines Fragebogens. 38 Katja Sonderegger KAPITEL 4. SYSTEMIMPLEMENTIERUNG Abbildung 4.11: Ausgabe des generierten Fragebogens. 4.6.2 Aufgaben generieren Bei der Generierung von Aufgaben werden vom Benutzer die Anzahl der Relationselemente eingegeben und die Anzahl der Aufgaben, die er haben möchte. Zusätzlich kann ausgewählt werden, ob man die zweite Normalform nach der Definition von Specht oder nach der Definition von Kemper enthalten haben möchte, und in welcher Normalform sich die Aufgaben befinden sollen.5 Abbildung 4.12: Generieren von Aufgaben. Generierung von Aufgaben: 5 Die angegebene Normalform ist die “höchste” Normalform, die noch gültig ist. Katja Sonderegger 39 KAPITEL 4. SYSTEMIMPLEMENTIERUNG Input: R F N Anzahl der Elemente der Relation Anzahl der Aufgaben, die generiert werden sollen die Normalform in der die Aufgaben sein sollen Output: funktionale Abhängigkeiten, die sich in der gegebenen Normalform befinden Algorithmus: 1. es werden zufällig funktionale Abhängigkeiten generiert 2. mit diesen Abhängigkeiten wird überprüft in welcher Normalform die Relation mit den funktionalen Abhängigkeiten ist. Ist die Relation in der gewünschten Normalform, wird sie für die spätere Ausgabe gespeichert, wenn nicht wird wieder ab Schritt 1 wiederholt. 3. zuletzt werden alle Aufgaben wie in Abbildung 4.12 dargestellt. Sowohl bei der Generierung der Fragebögen, als auch bei der Generierung von Aufgaben, besteht die Möglichkeit, sich die Aufgaben als Latexcode ausgeben zu lassen. Diese Ausgabe ist in Abbildung 4.13 zu sehen. Abbildung 4.13: Ausgabe des Latexcode. 40 Katja Sonderegger KAPITEL 4. SYSTEMIMPLEMENTIERUNG 4.7 Systemtest Insgesamt wurde mit Hilfe von PHPUnit ein Großteil der Funktionen, die nicht auf Eingaben basieren mit Testdaten aus verschiedenen Übungsblättern getestet. Die daraus resultierende Code Coverage ist in den Screenshots in 4.14 und 4.15 ersichtlich: Abbildung 4.14: Code Coverage der Algorithmen ohne Generierung. In Abbildung 4.14 ist die Code Coverage der Funktionen zu sehen, die das Projekt ausmachen. Abbildung 4.15: Codecoverage der Normalformenalgorithmen. Die Abbildung 4.15 zeigt die Code Coverage der Normalformenberechnung. Die linke Seite der Abbildung zeigt an, welche Funktionen direkt aufgerufen werden. Die mit 0.00% angeführten Funktionen werden von anderen Funktionen aufgerufen. Dies ist auch auf der rechten Seite der Abbildung ersichtlich, da hier die Testabdeckung anhand der Codezeilen angegeben wird. Katja Sonderegger 41 Kapitel 5 Zusammenfassung Das Normalformen-Übungstool ist ein webbasiertes Übungstool, das den Studenten das Erlernen und Einüben der Normalformen erleichtern soll. Das Tool bietet Beispiele und Erklärungen zu allen Begriffen, die die Studenten im Zusammenhang mit den Normalformen kennen sollten. Außerdem erklärt es auch wichtige Algorithmen wie die minimale Überdeckung, Relationensynthese und BCNF Dekomposition. Einer der Kernbereiche des Übungstools ist die Normalformerkennung. Diese ermöglicht ein schnelles Feststellen, in welcher Normalform sich eine Relation befindet und bietet mit Hilfe der oben genannten Algorithmen auch die Möglichkeit, die Relationen in die dritte Normalform beziehungsweise BCNF zu bringen. Die Lehrveranstaltungsleiter können Fragebögen zur Verfügung stellen, die die Studenten dann beantworten und validieren lassen können. Außerdem ist es möglich, Fragebögen automatisch generieren zu lassen. Das Tool kann funktionale Abhängigkeiten generieren, die in einer bestimmten Normalform sind, und diese dann als Latexcode ausgeben. Dies ermöglicht unter anderem den LV-Leitern eine schnellere Erstellung von Übungsblättern. 43 Literaturverzeichnis [BDB79] J. Biskup, U. Dayal and P. A. Bernstein: Synthesizing Independent Database Schemas, Proceedings of the 1979 ACM SIGMOD International Conference on Management of Data, SIGMOD ’79, ACM, New York, NY, USA, pages 143–151, URL http://doi.acm.org/10.1145/582095.582118. [Cod70] E. F. Codd: A Relational Model of Data for Large Shared Data Banks, Commun. ACM, volume 13(6), (1970), pages 377–387, URL http://doi.acm.org/10.1145/362384.362685. [Cod71] E. F. Codd: Further Normalization of the Data Base Relational Model, IBM Research Report, San Jose, California, volume RJ909. [Fag77] R. Fagin: Multivalued Dependencies and a New Normal Form for Relational Databases, ACM Trans. Database Syst., volume 2(3), (1977), pages 262–278, URL http://doi.acm. org/10.1145/320557.320571. [Fag79] R. Fagin: Normal Forms and Relational Database Operators, Proceedings of the 1979 ACM SIGMOD International Conference on Management of Data, SIGMOD ’79, ACM, New York, NY, USA, pages 153–160, URL http://doi.acm.org/10. 1145/582095.582120. [KE06] A. Kemper and A. Eickler: Datenbanksysteme: eine Einführung, Oldenbourg, 2006, URL http://books. google.at/books?id=YezXpIacjkgC. [Ken83] W. Kent: A Simple Guide to Five Normal Forms in Relational Database Theory, Commun. ACM, volume 26(2), (1983), pages 120–125, URL http://doi.acm.org/10.1145/358024. 358054. [Spe10] G. Specht: Vorlesung Datenbanksysteme, 2010, URL http://dbis-informatik.uibk.ac.at/files/ext/ 45 LITERATURVERZEICHNIS lehre/ws10-11/vo-datenbanksysteme/skript/ dbs-kap06.pdf, [Online; accessed 14-April-2014]. [Spe13] 46 G. Specht: Vorlesung Datenbanksysteme, 2013, URL http:// dbis-informatik.uibk.ac.at/files/ext/lehre/ ws13-14/VO-DBS/DBS-Kap06-NF-MUC-NEU.pdf, [Online; accessed 19-February-2014]. Katja Sonderegger