Hallo!
Ich versuche die Normalisierung von Datenbanken zu verstehen, daher hab ich mal mit Hilfe von dieser Seite ein Beispiel zusammengestellt.
Struktur der Ausgangstabelle:
Jetzt habe ich das meiner Meinung nach auf die 3. Normalform gebracht, sodass auch mehr als 4 Halter eintragbar sind.
Haupttabelle:
Tabelle Hersteller:
Tabelle Modell:
Tabelle fahrzeug_hat_halter - löst die n:m Verbindung zwischen Halter und Fahrzeug auf, da ein Fahrzeug mehrere Halter haben kann und mehrere Fahrzeuge einen Halter haben kann!? (zeitlich gesehen)
Tabelle Halter
Ich hoffe das ist nicht zuviel Code. Dachte ein paar Tabellen sagen mehr als tausend Worte.
Stimmt das überführen in die 3. Normalform, wenn nicht, wo sind meine Fehler?
Ich habe noch die Tabellen als SQL-Export angehängt.
Mit freundlichen Grüßen
Sonix
Ich versuche die Normalisierung von Datenbanken zu verstehen, daher hab ich mal mit Hilfe von dieser Seite ein Beispiel zusammengestellt.
Struktur der Ausgangstabelle:
Code:
CREATE DATABASE `autos` DEFAULT CHARACTER SET latin1 COLLATE latin1_german2_ci; CREATE TABLE `fahrzeug` ( `Kennzeichen` varchar(11) collate latin1_german2_ci NOT NULL COMMENT 'Form xxx+xx+yyyy', `Fahrgestellnummer` varchar(30) collate latin1_german2_ci NOT NULL COMMENT 'Variabel - max 30 Zeichen', `Hersteller` varchar(20) collate latin1_german2_ci NOT NULL, `Modell` varchar(20) collate latin1_german2_ci NOT NULL, `aktuellerHalter` varchar(20) collate latin1_german2_ci NOT NULL COMMENT 'Namen des aktuellen Halters', `Datum1` date NOT NULL COMMENT 'Datum des aktuellen Halters', `Halter2` varchar(20) collate latin1_german2_ci NOT NULL COMMENT 'letzter Halter', `Datum2` date NOT NULL COMMENT 'Datum des 2. Halters', `Halter3` varchar(20) collate latin1_german2_ci NOT NULL COMMENT 'vorletzter Halter', `Datum3` date NOT NULL COMMENT 'Datum des 2. Halters', `Halter4` varchar(20) collate latin1_german2_ci NOT NULL COMMENT 'vorvorletzter Halter', `Datum4` date NOT NULL COMMENT 'Datum des 4. Halters', `Bemerkung` text collate latin1_german2_ci NOT NULL COMMENT 'Bemerkung zum Fahrzeug', PRIMARY KEY (`Kennzeichen`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;
Haupttabelle:
Code:
CREATE TABLE `autos`.`fahrzeug_neu` ( `Kennzeichen` VARCHAR( 11 ) CHARACTER SET latin1 COLLATE latin1_german2_ci NOT NULL COMMENT 'Form xxx+xx+yyyy', `Fahrgestellnummer` VARCHAR( 30 ) CHARACTER SET latin1 COLLATE latin1_german2_ci NOT NULL COMMENT 'Variabel - max 30 Zeichen', `ID_Hersteller` SMALLINT NOT NULL COMMENT 'Fremdschlüssel zu Tabelle Hersteller', `ID_Modell` SMALLINT NOT NULL COMMENT 'Fremdschlüssel zu Tabelle Modell', `Bemerkung` TEXT CHARACTER SET latin1 COLLATE latin1_german2_ci NOT NULL COMMENT 'Bemerkung zum Fahrzeug', PRIMARY KEY ( `Kennzeichen` ) , INDEX ( `ID_Hersteller` , `ID_Modell` ) ) ENGINE = InnoDB CHARACTER SET latin1 COLLATE latin1_german2_ci COMMENT = 'Haupttabelle'
Code:
CREATE TABLE `autos`.`hersteller` ( `ID_hersteller` SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY , `Hersteller` VARCHAR( 20 ) CHARACTER SET latin1 COLLATE latin1_german2_ci NOT NULL ) ENGINE = InnoDB CHARACTER SET latin1 COLLATE latin1_german2_ci COMMENT = 'Herstellertabelle'
Code:
CREATE TABLE `autos`.`modell` ( `ID_modell` SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY , `Modell` VARCHAR( 20 ) CHARACTER SET latin1 COLLATE latin1_german2_ci NOT NULL ) ENGINE = InnoDB CHARACTER SET latin1 COLLATE latin1_german2_ci
Code:
CREATE TABLE `autos`.`fahrzeug_hat_halter` ( `ID_fahrzeug_Kennzeichen` VARCHAR( 11 ) NOT NULL COMMENT 'Fremdschlüssel zu Tabelle Fahrzeug->Feld Kennzeichen', `ID_halter` SMALLINT NOT NULL COMMENT 'Fremdschlüssel zu Tabelle Halter->Feld ID_halter', PRIMARY KEY ( `ID_fahrzeug_Kennzeichen` , `ID_halter` ) ) ENGINE = InnoDB CHARACTER SET latin1 COLLATE latin1_german2_ci COMMENT = 'n:m Auflösung zwischen Tabelle fahrzeug und halter'
Code:
CREATE TABLE `halter` ( `ID_halter` smallint(6) NOT NULL auto_increment, `Halter` varchar(20) collate latin1_german2_ci NOT NULL, `Anmeldung` date NOT NULL COMMENT 'Datum der Anmeldung des Fahrzeugs', `Abmeldung` date NOT NULL, COMMENT 'Datum der Abmeldung des Fahrzeugs oder 0000-00-00 wenn noch angemeldet' PRIMARY KEY (`ID_halter`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci COMMENT='Tabelle Halter' AUTO_INCREMENT=1 ;
Ich hoffe das ist nicht zuviel Code. Dachte ein paar Tabellen sagen mehr als tausend Worte.
Stimmt das überführen in die 3. Normalform, wenn nicht, wo sind meine Fehler?
Ich habe noch die Tabellen als SQL-Export angehängt.
Mit freundlichen Grüßen
Sonix
Comment