DatenbankenSchlüssel, Normalform | |
Definition: Eine Menge von Attributen einer Tabelle heißt Schlüsselkandidat, wenn jede Zeile der Tabelle sich durch die Werte dieser Attribute eindeutig identifizieren lässt.
Stets ist die Menge aller Attribute der Tabelle ein Schlüsselkandidat.
Beispiel: In folgender Tabelle KONTO ist die Attributmenge {Kontonr, Bank, Blz} ein Schlüsselkandidat, da sich durch Angabe von Werten für diese Attribute jede Zeile eindeutig identifizieren lässt. So lässt sich etwa durch die Angabe der Werte (414141, Commerzbank Kiel, 210 400 10) die zweite Zeile der Tabelle identifizieren. Hier könnte man jetzt etwa den Kontoinhaber feststellen.
| KONTO | Inhaber | Kontonr | Bank | Blz |
| Meyer | 602201 | Postbank Hamburg | 200 100 20 | |
| DRK | 414141 | Commerzbank Kiel | 210 400 10 | |
| Meyer | 190032 | Sparkasse Kiel | 210 501 70 | |
| Schmidt | 175060 | Sparkasse Kiel | 210 501 70 |
In diesem Beispiel ist die Attributmenge {Inhaber, Kontonr} kein Schlüsselkandidat. Zwar lässt sich in der aktuell vorliegenden Tabelle jede Zeile durch diese Attribute eindeutig identifizieren. Es ist jedoch nicht ausgeschlossen, dass das DRK unter der leicht zu merkenden Nummer 414141 auch noch ein Konto bei der Deutschen Bank einrichtet.
Die Eigenschaft "Schlüsselkandidat" bezieht sich also nicht auf die aktuellen Einträge in der Tabelle, sondern auf sämtliche möglichen Einträge - unter Berücksichtigung der Gegebenheiten der realen Welt.
In obigem Beispiel gehen wir etwa davon aus, dass zwei verschiedene Inhaber nicht dasselbe Konto haben können, sonst wäre die Attributmenge {Kontonr, Bank, Blz} kein Schlüsselkandidat.
Definition: Ein Schlüsselkandidat S heißt Schlüssel, wenn keine echte Teilmenge von S Schlüsselkandidat ist.
Schlüssel sind also minimale identifizierende Attributmengen. Eine Tabelle kann unterschiedliche Schlüssel haben. Ein Schlüssel wird als Primärschlüssel ausgezeichnet; die anderen möglichen Schlüssel heißen alternative Schlüssel.
Beispiel: In obiger Tabelle KONTO ist die Attributmenge {Kontonr, Blz} ein Schlüssel. Aber auch {Kontonr, Bank} wäre ein Schlüssel.
Wiederum bezieht sich die Eigenschaft "Schlüssel" nicht auf die aktuellen Einträge in der Tabelle, sondern auf sämtliche möglichen Einträge. Hier gehen wir davon aus, dass durch Angabe von Kontonr und Blz ein Konto eindeutig identifizierbar ist.
Ist {Kontonr, Blz} als Primärschlüssel ausgezeichnet, so sorgt das Datenbanksystem dafür, dass keine neuen Zeilen eingetragen werden können, wenn die Primärschlüsselattributwerte schon belegt sind. So würde das Datenbanksystem etwa verhindern, dass die Zeile (Müller, 190032, Kieler Sparkasse, 210 501 70) aufgenommen wird.
Definition: Wir nennen einen Schlüssel echt, wenn er nicht aus allen Attributen der Tabelle besteht.
Jede Tabelle hat einen Schlüssel, aber nicht unbedingt einen echten Schlüssel.
Beispiel: Folgende Tabelle PERSON hat keinen echten Schlüssel, sondern es sind alle Attribute notwendig, um die Zeilen eindeutig zu identifizieren.
| PERSON | Name | Vorname | GebDat |
| Meyer | Heinz | 12.03.1962 | |
| Schmidt | Heinz | 21.05.1948 | |
| Meyer | Anna | 12.03.1962 | |
| Meyer | Heinz | 21.05.1948 |
Schlüssel, die aus mehreren Attributen bestehen, sind problematisch. So ist für die Darstellung der Beziehung VERWANDT untenstehende Tabelle erforderlich, in der die Schlüssel der beteiligten Personen als Fremdschlüssel (Attribute, die in einer anderen Tabelle Schlüssel sind) auftreten. Ändert sich der Name einer Person, etwa durch Heirat, so ist eine entsprechende Änderung nicht nur in der Tabelle PERSON, sondern auch in der Tabelle VERWANDT nötig.
| VERWANDT | Name1 | Vorname1 | GebDat1 | Name2 | Vorname2 | GebDat2 |
| Meyer | Heinz | 12.03.1962 | Meyer | Anna | 12.03.1962 |
Es ist daher sinnvoll, ein weiteres Attribut Nummer als künstlichen Schlüssel einzuführen. Nummer dient also quasi als Zeiger auf eine bestimmte Person. Die Person wird also durch diesen Zeiger eindeutig identifiziert und nicht durch ihre Eigenschaften wie Name, Vorname und Geburtsdatum, die sich möglicherweise ändern können oder die auch möglicherweise für zwei verschiedene Personen übereinstimmen können. Dies ist der Grund dafür, dass wir Personalnummern, Matrikelnummern, Sozialversicherungsnummern, Mitgliedsnummern, Kundennummern usw. haben, über die wir in den unterschiedlichen Datenbanken identifiziert werden.
| PERSON | Nummer | Name | Vorname | GebDat |
| 101 | Meyer | Heinz | 12.03.1962 | |
| 102 | Schmidt | Heinz | 21.05.1948 | |
| 103 | Meyer | Anna | 12.03.1962 | |
| 104 | Meyer | Heinz | 21.05.1948 |
Die Beziehung VERWANDT reduziert sich dadurch auf folgende Tabelle:
| VERWANDT | Person1 | Person2 |
| 101 | 103 |
Tabellen können zunächst beliebig aufgebaut sein. Ein Ziel im Datenbankkonzept ist es jedoch, die Daten frei von Redundanz zu speichern. Dies ist gewährleistet, wenn sich die Tabellen in der sogenannten Boyce-Codd-Normalform befinden.
Die Boyce-Codd-Normalform lässt sich mithilfe der Begriffe Projektion und Schlüssel charakterisieren.
Zur Erinnerung: Durch Projektion können Spalten einer Tabelle ausgewählt werden. Das Ergebnis dieser Operation ist wieder eine Tabelle. Mehrfach auftretende Zeilen dieser Tabelle werden nur einmal aufgeführt, denn die Zeilen der Tabelle müssen eine Relation bilden. Eine Relation ist aber eine Menge, und eine Menge kann nur unterschiedliche Elemente enthalten.
Definition: Eine Tabelle ist in Boyce-Codd-Normalform (BCNF), wenn keine Projektion der Tabelle einen eigenen echten Schlüssel hat.
Zu beachten ist, dass es sich um einen echten Schlüssel handeln muss. Als eigenen Schlüssel einer Projektion bezeichnen wir eine Attributmenge, die nicht auch Schlüssel der ganzen Tabelle ist.
Als Beispiel betrachten wir die Tabelle KONTO.
| KONTO | Inhaber | Kontonr | Bank | Blz |
| Meyer | 602201 | Postbank Hamburg | 200 100 20 | |
| DRK | 414141 | Commerzbank Kiel | 210 400 10 | |
| Meyer | 190032 | Sparkasse Kiel | 210 501 70 | |
| Schmidt | 175060 | Sparkasse Kiel | 210 501 70 |
Diese Tabelle ist nicht in Boyce-Codd-Normalform. Um dies zu zeigen, müssen wir also eine Projektion der Tabelle finden, die einen eigenen echten Schlüssel hat.
Folgende Tabelle ist die Projektion der Tabelle KONTO auf die Spalten {Bank, Blz}. Mehrfach auftretende Zeilen werden nur einmal aufgeführt.
| KONTO[Bank, Blz] | Bank | Blz |
| Postbank Hamburg | 200 100 20 | |
| Commerzbank Kiel | 210 400 10 | |
| Sparkasse Kiel | 210 501 70 |
Das Attribut {Blz} ist offenbar ein Schlüssel dieser Projektion, und sogar ein echter Schlüssel, denn er besteht nicht aus allen Attributen der Projektion. Das Attribut {Blz} ist aber kein Schlüssel der gesamten Tabelle KONTO, sondern ein eigener Schlüssel der Projektion. Damit ist die Tabelle nicht in Boyce-Codd-Normalform.
Immer wenn eine Projektion vorhanden ist, die einen eigenen echten Schlüssel hat, ist dies ein Indiz dafür, dass beim Datenbankentwurf die Entities nicht klar identifiziert wurden. In dem Beispiel ist "Bank" eine eigene Entity.
Um eine redundanzfreie Speicherung der Daten zu erzielen, wird die Tabelle KONTO wie folgt in zwei Tabellen zerlegt. Die ursprüngliche Tabelle kann dann durch einen Verbund der beiden Tabellen wieder zurückgewonnen werden.
|
|
Der Verbund dieser beiden Tabellen wird durch folgendes SQL-Kommando realisiert; Ergebnis ist die ursprüngliche Tabelle:
| SELECT | Inhaber, Kontonr, Name AS Bank, Blz |
| FROM | KONTO, BANK |
| WHERE | BankId=BANK.Id |
Durch SELECT Name AS Bank wird die Spalte Name ausgewählt und in der Ergebnistabelle mit der Bezeichnung Bank versehen (so wie es in der ursprünglichen Tabelle KONTO war).
Weiter mit: [Literatur] oder 