Bei der Arbeit mit Datenbanken ist es üblich, auf Probleme wie redundante Daten und inkonsistente Updates zu stoßen. Die zweite Normalform ist ein Datenbanknormalisierungsschritt, der auf der ersten Normalform (1NF) aufbaut, um sauberere und effizientere Tabellen zu erstellen.
Das Verständnis der 2NF ist für alle, die im Bereich der Datenbankgestaltung oder Datenverwaltung arbeiten, entscheidend, da sie die Grundlage für höhere Normalisierungsformen wie die dritte Normalform (3NF) bildet. In diesem Artikel werden wir untersuchen, wie die 2NF funktioniert und wie Tabellen transformiert werden können, um die Anforderungen der 2NF zu erfüllen, mit praktischen Beispielen. Wir werden auch über die Vor- und Nachteile der 2NF und die Anwendungsfälle sprechen, für die sie am besten geeignet ist.
Verständnis der zweiten Normalform
Die zweite Normalform ist ein Datenbanknormalisierungsschritt, der darauf abzielt, partielle Abhängigkeiten zu beseitigen. Sie wurde von Edgar F. Codd, dem Pionier der relationalen Datenbanken, im Rahmen seiner Arbeit zur Normalisierung eingeführt.
Bevor eine Tabelle in der 2NF sein kann, muss sie die Regeln der ersten Normalform erfüllen:
- Atomarität: Jede Zelle muss einen einzelnen Wert enthalten (keine sich wiederholenden Gruppen oder Arrays).
- Eindeutige Zeilen: Die Tabelle muss einen klaren Primärschlüssel haben.
2NF geht einen Schritt weiter mit einer zusätzlichen Regel: eliminieren Sie partielle Abhängigkeiten.
Ein partieller Abhängigkeitsfall tritt auf, wenn ein Nicht-Schlüsselattribut (Spalte, die nicht Teil eines Primärschlüssels ist) nur von einem Teil eines zusammengesetzten Schlüssels abhängt, anstatt von dem gesamten Schlüssel. Die 2NF-Regel stellt sicher, dass alle Nicht-Schlüsselattribute vom gesamten Primärschlüssel abhängig sind, nicht nur von einem Teil davon. Das Vorhandensein von partiellen Abhängigkeiten in einer Tabelle bedeutet, dass redundante Daten in die Datenbank gelangen können, was zu Ineffizienz und potenziellen Inkonsistenzen bei Updates oder Löschungen führen kann.
Allein die Theorie kann etwas trocken sein, daher werfen wir einen Blick auf ein praktisches Beispiel.
Unten ist eine Kursanmeldung Tabelle von Datacamp-Studenten.
Student ID | Course ID | Course Name | Instructor Name |
---|---|---|---|
1001 | 201 | SQL-Grundlagen | Ken Smith |
1002 | 202 | Einführung in Python | Merlin O’Donnell |
1001 | 202 | Einführung in Python | Merlin O’Donnell |
Hier ist der Primärschlüssel die Kombination aus Studenten-ID und Kurs-ID. Allerdings hängen die Nichtschlüsselattribute Kursname und Kursgebühr nur von der Kurs-ID ab, nicht vom gesamten Schlüssel. Dies verstößt gegen die 2NF.
Schritte zur Zerlegung von Tabellen zur Erreichung der 2NF
Um sicherzustellen, dass eine Tabelle den Regeln der 2NF folgt, müssen Sie:
- Alle Kandidatenschlüssel identifizieren: Bestimmen Sie die minimalen Attributmengen, die Zeilen in der Tabelle eindeutig identifizieren. Dies sind Ihre Kandidatenschlüssel.
- Funktionale Abhängigkeiten bestimmen: Identifizieren Sie alle funktionalen Abhängigkeiten in der Tabelle. Achten Sie insbesondere auf Abhängigkeiten, bei denen nicht-prime Attribute (die nicht Teil eines Kandidatenschlüssels sind) nur von einem Teil eines zusammengesetzten Schlüssels abhängen.
- Beseitigen Sie partielle Abhängigkeiten: Für jede partielle Abhängigkeit:
- Verschieben Sie die abhängigen Attribute in eine neue Tabelle zusammen mit dem Teil des Schlüssels, von dem sie abhängen.
- Stellen Sie sicher, dass die neue Tabelle einen eindeutigen Primärschlüssel hat.
- Wiederholen Sie, bis keine partiellen Abhängigkeiten mehr bestehen: Bestätigen Sie, dass jedes nicht-prime Attribut in allen Tabellen vollständig vom jeweiligen Primärschlüssel abhängig ist.
Beispiele für die Zweite Normalform in der Praxis
Lassen Sie uns nun zwei Beispiele betrachten.
Beispiel 1: Kursanmeldetabelle
Zuvor haben wir die folgende Kursanmeldetabelle gesehen:
Student ID | Course ID | Course Name | Instructor Name |
---|---|---|---|
1001 | 201 | SQL-Grundlagen | Ken Smith |
1002 | 202 | Einführung in Python | Merlin O’Donnell |
1001 | 202 | Einführung in Python | Merlin O’Donnell |
Lassen Sie uns die Schritte befolgen, die wir im vorherigen Abschnitt skizziert haben.
1. Identifizieren Sie unseren Schlüsselkandidaten.
In diesem Fall ist der Primärschlüssel ein Verbundschlüssel aus Studenten-ID und Kurs-ID. Diese einzigartige Kombination identifiziert jede Zeile in der Tabelle.
2. Bestimmen Sie unsere funktionalen Abhängigkeiten
Kursname und Dozentenname hängen von Kurs-ID ab, nicht vom vollständigen zusammengesetzten Schlüssel (Studenten-ID, Kurs-ID). Dies ist eine partielle Abhängigkeit, da diese Attribute nur von einem Teil des zusammengesetzten Schlüssels abhängen.
3. Teilabhängigkeiten eliminieren
Wir müssen die Attribute, die nur von einem Teil des Schlüssels abhängen (Kursname und Dozentenname), in eine neue Tabelle verschieben, die ausschließlich auf Kurs-ID basiert.
Nach der Dekonstruktion sehen unsere neuen Tabellen folgendermaßen aus:
Kursanmeldetabelle
Student ID | Course ID |
---|---|
1001 | 201 |
1002 | 202 |
1001 | 202 |
Kursdetails Tabelle
Course ID | Course Name | Instructor Name |
---|---|---|
201 | SQL Grundlagen | Ken Smith |
202 | Einführung in Python | Merlin O’Donnell |
Wenn Sie praktisch werden und Ihre eigenen Datenbanken erstellen möchten, werfen Sie einen Blick auf unseren Kurs zu PostgresQL. Wenn Sie etwas fortgeschrittener sind, könnten Sie dieses Einführung in das Datenmodellieren in Snowflake ausprobieren, das Ideen wie das Entity-Relationship und das dimensionale Modellieren abdeckt.
Beispiel 2: Bestellungstabelle
Wir werden mit dieser Orders-Tabelle beginnen. Versuchen Sie, den oben skizzierten Schritten zu folgen und diese Tabelle selbst zu zerlegen!
Order ID | Product ID | Order Date | Product Name | Supplier Name |
---|---|---|---|---|
1 | 201 | 2024-11-01 | Laptop | TechSupply |
1 | 202 | 2024-11-01 | Mouse | TechSupply |
2 | 201 | 2024-11-02 | Laptop | TechSupply |
3 | 203 | 2024-11-03 | Keyboard | KeyMasters |
1. Identifizieren Sie unseren Schlüsselkandidaten
Die Auftrags-ID und Produkt-ID Kombination identifiziert jede Zeile eindeutig, wodurch (Auftrags-ID, Produkt-ID) einen zusammengesetzten Schlüsselkandidaten darstellt. Keine einzelne Spalte kann Zeilen eindeutig identifizieren, weil:
- Bestellnummer allein ist nicht eindeutig, da mehrere Produkte Teil derselben Bestellung sein können.
- Produkt-ID allein ist nicht eindeutig, da dasselbe Produkt in verschiedenen Bestellungen erscheinen kann.
Das bedeutet, dass (Bestell-ID, Produkt-ID) ebenfalls unser Primärschlüssel ist.
2. Bestimmen Sie unsere funktionalen Abhängigkeiten
Bestelldatum hängt von Bestellnummer ab (nicht vom vollständigen Verbundschlüssel). Dies ist eine teilweise Abhängigkeit.
Produktname und Lieferantenname abhängig von Produkt ID (nicht vom gesamten Verbundschlüssel). Diese sind auch partielle Abhängigkeiten.
3. Partielle Abhängigkeiten eliminieren
Wir müssen die Tabelle in kleinere Tabellen aufteilen, die jeweils eine logische Abhängigkeit behandeln.
Zuerst erstellen wir eine Tabelle für Bestellinformationen, die spezifische Informationen zu Bestellnummer enthält.
Bestelltabelle
Order ID | Order Date |
---|---|
1 | 2024-11-01 |
2 | 2024-11-02 |
3 | 2024-11-03 |
Dann erstellen wir eine Tabelle, die spezifische Informationen zu Produkt-ID enthält.
Bestelltabelle
Product ID | Product Name | Supplier Name |
---|---|---|
201 | Laptop | TechSupply |
202 | Maus | TechSupply |
203 | Tastatur | KeyMasters |
Die ursprüngliche Tabelle wurde nun auf den zusammengesetzten Schlüssel und die Beziehungen zwischen Bestellungen und Produkten reduziert.
Order ID | Product ID |
---|---|
1 | 201 |
1 | 202 |
2 | 201 |
3 | 203 |
Jetzt befindet sich unsere Datenbank in 2NF, weil 1) alle partiellen Abhängigkeiten beseitigt wurden, und 2) nicht-prime Attribute vollständig von ihren jeweiligen Primärschlüsseln abhängen.
Wann man die zweite Normalform implementieren sollte
Warum sollten Sie Ihre Datenbank auf 2NF refaktorisieren? Ist es alleine ausreichend oder sollten Sie einen Schritt weiter gehen und auf 3NF abzielen?
Vorteile und Grenzen der zweiten Normalform
Die zweite Normalform bietet mehrere Vorteile und ist ein nützlicher Schritt im Datenbank-Normalisierungsprozess:
- Verbesserte Datenintegrität: Durch die Beseitigung von partiellen Abhängigkeiten minimiert 2NF Einfüge-, Update- und Löschungsanomalien und führt zu einer zuverlässigeren Datenbank.
- Reduzierung von Redundanzen: 2NF verringert die Datenwiederholung, optimiert die Speichernutzung und vereinfacht die Datenwartung.
- Verbesserte Datenstruktur: Sie legt den Grundstein für weitere Normalisierungen, wie den Fortschritt zur dritten Normalform, indem sie ein saubereres und effizienteres Datenbankdesign schafft.
Aber sie hat auch einige Einschränkungen:
- Erhöhte Komplexität: Das Zerlegen von Tabellen zur Erfüllung der 2NF kann den Designprozess komplizierter machen, insbesondere bei der Behandlung von zusammengesetzten Schlüsseln und Abhängigkeiten.
- Zusätzliche Joins: Das Aufteilen von Tabellen kann mehr Joins in Abfragen erfordern, was möglicherweise die Leistung in Systemen mit großen Datensätzen oder komplexen Abfragen beeinträchtigt – mehr dazu unten.
- Restliche Redundanz: Während 2NF teilweise Abhängigkeiten reduziert, behandelt es keine transitiven Abhängigkeiten, was einige Redundanzen bestehen lässt, bis sie in 3NF behandelt werden.
Leistungsüberlegungen mit der zweiten Normalform
Das Zerlegen von Tabellen, um teilweise Abhängigkeiten zu beseitigen, kann sich direkt auf die Leistung der Datenbank auswirken. Einerseits reduziert die Erreichung von 2NF die Datenredundanz und verbessert die Konsistenz, was zu weniger Anomalien während der Einfüge-, Aktualisierungs- oder Löschvorgänge führt. Andererseits kann die Normalisierung die Anzahl der Tabellen erhöhen, was zusätzliche Joins erforderlich macht, um zusammenhängende Daten abzurufen. Dies könnte sich auf die Abfrageleistung bei großen Datensätzen auswirken.
Um sicherzustellen, dass Ihre normalisierte Datenbank leistungsfähig bleibt, sollten Sie diese bewährten Praktiken befolgen:
- Indizierung: Verwenden Sie Indizes, um Joins zwischen zerlegten Tabellen zu beschleunigen.
- Abfrageoptimierung:Optimieren Sie Abfragen, um die Kosten zusätzlicher Joins zu minimieren.
- Hybridansatz:Kombinieren Sie Normalisierung mit Denormalisierung in Bereichen, in denen die Leistung wichtig ist, wie z.B. Berichtstabellen.
- Regelmäßige Überwachung: Bewerten Sie kontinuierlich die Leistung Ihrer Datenbank mit Profiling-Tools, um mögliche Probleme zu erkennen.
Ist die 2NF nur ein Übergangsschritt, um die dritte Normalform zu erreichen?
In den meisten Fällen streben Datenbankdesigner danach, die dritte Normalform zu erreichen, da sie in der Lage ist, Redundanzen weiter zu reduzieren und die Gesamtdatenintegrität zu verbessern. Das Erreichen von 3NF erfordert jedoch oft zusätzliche Arbeit, wie z.B. das Erstellen weiterer Tabellen und Beziehungen, was zu Komplexität und Leistungskompromissen bei der Abfrageausführung führen kann.
Es gibt Fälle, in denen die Verwendung der zweiten Normalform allein ausreichen kann. Wenn Einfachheit und schnelle Implementierung Priorität haben, wie z.B. bei Projekten im kleinen Maßstab, Prototyping oder Situationen, in denen die Datenredundanz minimal ist, kann 2NF ausreichen. Zum Beispiel in Systemen, in denen alle Attribute bereits vollständig von einem einfachen Primärschlüssel abhängig sind, kann das Erreichen von 2NF das Hauptziel der Reduzierung partieller Abhängigkeit erfüllen, ohne die Notwendigkeit für weitere Normalisierung.
Weiterentwicklung über die zweite Normalform hinaus: hin zur dritten Normalform
Wenn Sie Ihre Datenbank weiter normalisieren möchten, können Sie Ihre Tabellen weiter umgestalten, um die dritte Normalform zu erreichen.
3NF baut auf 2NF auf, indem sie transitive Abhängigkeiten behandelt – Situationen, in denen Nicht-Schlüsselattribute von anderen Nicht-Schlüsselattributen abhängen und nicht vom Primärschlüssel. Dieser Fortschritt stellt sicher, dass jedes Attribut direkt vom Primärschlüssel abhängt und von nichts anderem.
Zum Beispiel in einer Tabelle zur Verfolgung von Kursanmeldungen:
- 2NF: Stellt sicher, dass Attribute wie der Kursname und der Studentenname vollständig von ihren jeweiligen Primärschlüsseln abhängen (z.B. Studenten-ID und Kurs-ID). Dies beseitigt partielle Abhängigkeiten, bei denen Nicht-Schlüsselattribute nur von einem Teil des zusammengesetzten Schlüssels abhängen.
- 3NF: Stellt sicher, dass Attribute wie Dozentendetails oder Abteilungsinformationen in separaten Tabellen gespeichert werden, um transitive Abhängigkeiten zu eliminieren.
3NF ist ideal für komplexere Systeme, in denen Datenintegrität und Effizienz besonders wichtig sind, insbesondere wenn das Datenvolumen wächst. Schauen Sie sich unseren Artikel Was ist die dritte Normalform? an, wenn Sie mehr über 3NF und seine restriktivere Form, BCNF, erfahren möchten.
Zusammenfassung
Die zweite Normalform ist ein wesentlicher Schritt bei der Datenbanknormalisierung, der die Lücke zwischen 1NF und höheren Formen wie 3NF schließt. Durch das Entfernen von partiellen Abhängigkeiten reduziert 2NF Redundanzen und verbessert die Zuverlässigkeit Ihrer Daten. Obwohl dies zu einer gewissen Komplexität führen kann, machen die Vorteile einer verbesserten Datenintegrität und vereinfachten Wartung sie zu einem wichtigen Bestandteil eines effektiven Datenbankdesigns.
Wenn Sie bereit sind, Ihre Fähigkeiten weiter zu entwickeln, erkunden Sie unseren Kurs Datenbankdesign, um Ihr Verständnis für Normalisierungstechniken und deren praktische Anwendungen zu vertiefen. Sie können auch Ihre SQL- und Datenbankverwaltungsfähigkeiten validieren und Ihre Expertise potenziellen Arbeitgebern mit unserer SQL Associate-Zertifizierung demonstrieren!
Zu guter Letzt möchte ich sagen, wenn Sie eine Entscheidungsträgerin in einem Unternehmen sind und wissen, dass Sie daran arbeiten müssen, sauberere, effizientere Datenbanken zu erstellen, erwägen Sie, eineDataCamp for Business-Demoanfrage zu stellen. Wir können dazu beitragen, die Fähigkeiten Ihres Teams zu transformieren, sodass Sie skalierbare Datenbanksysteme entwickeln können, die die Effizienz und Innovation im Unternehmen vorantreiben. Wir können sogar maßgeschneiderte Lernpfade und individuelle Tracks erstellen.
Source:
https://www.datacamp.com/tutorial/second-normal-form