Announcement

Collapse
No announcement yet.

Frage: Normalisierung - richtig durchgeführt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Frage: Normalisierung - richtig durchgeführt

    Hallo!

    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;
    Jetzt habe ich das meiner Meinung nach auf die 3. Normalform gebracht, sodass auch mehr als 4 Halter eintragbar sind.

    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'
    Tabelle Hersteller:
    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'
    Tabelle Modell:
    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
    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)

    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'
    Tabelle 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
    Attached Files
    Zuletzt editiert von Sonix666; 04.03.2009, 15:46.

  • #2
    Ich würde sagen, du hast das gut verstanden und das kann man so als 3. Normalform für Schulungsfragen gelten lassen.

    In der Praxis müßte wahrscheinlich das Kennzeichen mit nach fahrzeug_hat_halter, weil ja meist mit dem Besitzer das Kennzeichen wechselt. Als Primärschlüssel würde ich auch eine ID einführen, oder aber die Fahrgestellnummer verwenden.

    Aus Normalisierungstheoretischer Sicht sollte es aber wie gesagt o.k. sein.

    Grüße
    Tino
    Ich habs gleich!
    ... sagte der Programmierer.

    Comment


    • #3
      Das hört sich schonmal gut an.

      Mangels eines verständlichen Beispiels habe ich mir das mit dem Auto ausgedacht. Deine inhaltlichen Verbesserungen sind richtig und logisch, hätte wohl länger darüber nachdenken müssen.

      Vielen Dank!

      Comment

      Working...
      X