- Keine transitiven Abhängigkeiten: Diese Regel ist entscheidend. In einer 3NF-Tabelle muss sich jede Nicht-Primärschlüssel-Spalte ausschließlich vom Primärschlüssel abhängen, nicht indirekt über eine andere Nicht-Schlüssel-Spalte.
Lassen Sie uns einmal schauen, was das praktisch bedeutet.
Tabellen zerlegen, um die 3NF zu erreichen
Lassen Sie uns den Prozess der Zerlegung von Tabellen durchgehen, um die 3NF zu erreichen. Wir werden einige Beispieldaten aus den DataCamp-Kursen verwenden, um jeden Schritt zu veranschaulichen.
Schritt 1: Transitive Abhängigkeiten identifizieren
Zu Beginn suchen wir nach Attributen in einer Tabelle, die indirekt vom Primärschlüssel abhängen. Als Faustregel gilt: Wenn ein Attribut von etwas anderem als dem Primärschlüssel abhängt, deutet dies auf eine transitive Abhängigkeit hin. Das ist ein Zeichen dafür, dass es möglicherweise an der Zeit ist, Ihre Tabelle aufzuteilen.
Werfen Sie einen Blick auf die drei Tabellen unten. Welche hat eine transitive Abhängigkeit?
Tabelle 1: Kurs
Course ID | Course Name | Difficulty |
---|---|---|
201 | SQL Grundlagen | Anfänger |
202 | Einführung in Python | Anfänger |
203 | Verständnis von Datenwissenschaft | Fortgeschritten |
Tabelle 2: Dozent
Instructor ID | Instructor Name | Expertise |
---|---|---|
1 | Sarah Johnson | Datenwissenschaft |
2 | Tom Williams | Machine Learning |
3 | Emily Brown | Python |
Tabelle 3: Einschreibungen
Enrollment ID | Student Name | Course ID | Course Name |
---|---|---|---|
1001 | Alice Smith | 201 | SQL Grundlagen |
1002 | Bob Green | 202 | Einführung in Python |
1003 | Charlie Blue | 201 | SQL Grundlagen |
Die Antwort ist… Tabelle 3!
In dieser Tabelle hängt Kursname von Kurs-ID ab, aber nicht direkt von Einschreibungs-ID (dem Primärschlüssel). Diese indirekte Abhängigkeit macht Kursname zu einer transitiven Abhängigkeit.
Schritt 2: Daten in neue Tabellen aufteilen
Um die transitive Abhängigkeit zu behandeln, werden wir Tabelle 1 in zwei Tabellen aufteilen. Jede Tabelle wird sich auf direkt abhängige Daten konzentrieren.
Überarbeitete Einschreibungenstabelle
Enrollment ID | Student Name | Course ID |
---|---|---|
1001 | Alice Smith | 201 |
1002 | Bob Green | 202 |
1003 | Charlie Blue | 201 |
Kursetabelle
Course ID | Course Name |
---|---|
201 | SQL-Grundlagen |
202 | Einführung in Python |
Jetzt enthält jede Tabelle nur Informationen, die direkt von ihrem Primärschlüssel abhängen: Kurs ID ist jetzt der Primärschlüssel für Kursname in der Tabelle Kurse und Belegungs ID ist der Primärschlüssel in der Tabelle Belegungen.
Mit dieser Dekomposition erfüllen die Tabellen nun die Anforderungen an die Dritte Normalform, eliminieren Redundanzen und stellen sicher, dass jede Tabelle nur direkt relevante Informationen speichert.
Wenn Sie praktische Erfahrungen sammeln und Ihre eigenen Datenbanken erstellen möchten, werfen Sie einen Blick auf unseren Kurs „Erstellung von PostgreSQL-Datenbanken“. Wenn Sie etwas fortgeschrittener sind, könnten Sie „Einführung in die Datenmodellierung in Snowflake“ ausprobieren, das Ideen wie das Entity-Relationship- und das dimensionale Modellieren abdeckt.
Vor- und Nachteile der Verwendung der Dritten Normalform
Also, warum all diese Mühe auf sich nehmen, um die 3NF zu erreichen? Hier sind die Hauptvorteile:
- Verbesserte Datenintegrität: Durch die Beseitigung transitiver Abhängigkeiten hilft der 3NF sicherzustellen, dass Aktualisierungen und Löschungen nicht zu widersprüchlichen oder veralteten Daten in verschiedenen Tabellen führen.
- Reduzierte Redundanz: Weniger Redundanz bedeutet, dass Ihre Datenbank einfacher zu pflegen ist und der Speicherplatz reduziert wird.
- Einfachere Datenwartung: Das Aufbewahren ähnlicher Informationen in dedizierten Tabellen erleichtert das Aktualisieren von Datensätzen, ohne redundante Einträge suchen zu müssen.
Das gesagt, während 3NF-Strukturen die Datenakkuratheit unterstützen, können sie auch zu stärker segmentierten Daten führen, was manchmal komplexe Abfragen aufgrund zusätzlicher Tabellenverknüpfungen langsamer macht. In Fällen, in denen die Notwendigkeit für Geschwindigkeit die Notwendigkeit für Normalisierung übertrumpft, können BCNF oder 4NF praktischere Optionen sein.
Vergleich: Erste, Zweite, Dritte und Boyce-Codd Normalformen
Schauen wir uns die Unterschiede der Formen an.
Vergleichstabelle: erste, zweite und dritte Normalformen
Hier ist eine Vergleichstabelle, die Ihnen hilft, die Anforderungen von 1NF, 2NF und 3NF zu verstehen.
BCNF ist eine „strengere“ Form von 3NF, die zusätzliche Anomalien eliminiert, die bei überlappenden Schlüsselkandidaten auftreten. Es kann besonders nützlich sein in komplexen Fällen, in denen 3NF allein Abhängigkeiten nicht vollständig eliminiert. BCNF gilt, wenn ein Nichtschlüsselattribut von einem Attribut abhängt, das Teil eines zusammengesetzten Schlüsselkandidaten ist. Ich weiß, das klingt komplex, also lasst uns das anhand eines Beispiels aufschlüsseln.
Aktuelle Struktur (in 3NF)
Nach der Dekomposition zur Erreichung von 3NF hatten wir diese zwei Tabellen:
Belegungen Tabelle
Kurse Tabelle
Course ID | Course Name |
---|---|
201 | SQL Grundlagen |
202 | Einführung in Python |
In dieser Struktur befindet sich jede Tabelle in 3NF ohne transitive Abhängigkeiten, und die Daten sind angemessen normalisiert.
Einführung einer neuen Anforderung
Jetzt fügen wir Kursen eine neue Eigenschaft hinzu: den Klassenraum, in dem jeder Kurs stattfindet. Diese neue Eigenschaft könnte zu einem Szenario führen, das BCNF erfordert.
Aktualisierte Kurse Tabelle (3NF)
Course ID | Course Name | Classroom |
---|---|---|
201 | SQL Grundlagen | Raum 101 |
202 | Einführung in Python | Raum 102 |
203 | Verständnis von Data Science | Raum 101 |
Hier ist Kurs-ID immer noch der Primärschlüssel, und alle anderen Attribute hängen direkt davon ab. Aber nehmen wir an, es gibt eine neue Regel, dass jeder Klassenraum immer nur ein Fach gleichzeitig belegen kann. Angenommen, der Kursname „SQL-Grundlagen“ unter verschiedenen Kurs-IDs (wie 201, 204 usw.) angeboten werden könnte, wenn sie zu unterschiedlichen Zeiten geplant wären. In diesem Fall würde jede Durchführung von „SQL-Grundlagen“ unabhängig von der spezifischen Kurs-ID im „Raum 101“ stattfinden. Als Ergebnis bestimmt der Kursname auch eindeutig den Klassenraum.
Dies bedeutet, dass wir jetzt zwei Kandidatenschlüssel haben:
- Kurs-ID
- Kursname
Mit beiden Kandidatenschlüsseln haben wir jetzt ein Problem, das die 3NF nicht anspricht: Klassenraum hängt von Kursname ab, statt nur von Kurs-ID.
Anwendung von BCNF
Um dieses Abhängigkeitsproblem zu beseitigen, müssen wir die Kurse Tabelle weiter in zwei separate Tabellen aufteilen, die besser mit BCNF übereinstimmen:
- Eine neue Kurse Tabelle, die nur die Kurs ID und Kursname enthält.
- Eine Kursdetails Tabelle, die die Kursname und Klassenzimmer Zuordnung speichert.
So sieht es aus:
Überarbeitete Kurse Tabelle (BCNF)
Kursdetails Tabelle (BCNF)
Course Name | Classroom |
---|---|
SQL Grundlagen | Raum 101 |
Einführung in Python | Raum 102 |
Verständnis von Datenwissenschaft | Raum 101 |
- In der Kurse-Tabelle ist die Kurs-ID der Primärschlüssel, und alle Attribute hängen ausschließlich von ihm ab.
- In der Kursdetails Tabelle Kursname ist der Primärschlüssel, und Klassenraum hängt nur von Kursname ab.
Dieses Setup beseitigt alle Abhängigkeitsprobleme, die durch sich überschneidende Kandidatenschlüssel verursacht werden, und gewährleistet eine streng normierte Struktur.
Conclusion
Die dritte Normalform ist ein wertvolles Werkzeug für Datenbankdesigner, die darauf abzielen, Daten sauber, konsistent und frei von problematischen Abhängigkeiten zu halten. Mit der 3NF wird die Datenintegrität verbessert, was das Management erleichtert und Redundanzen reduziert. Denken Sie daran, dass während die 3NF in den meisten Situationen gut funktioniert, komplexere Datenbanken von zusätzlichen Formen wie BCNF oder 4NF profitieren könnten.
Wenn Ihnen dieser Artikel geholfen hat, erwägen Sie den nächsten Schritt, indem Sie unsere SQL Associate Certification erwerben. Es ist eine großartige Möglichkeit, Ihre SQL- und Datenbankverwaltungsfähigkeiten zu validieren und Ihr Fachwissen potenziellen Arbeitgebern zu demonstrieren!