3. Normalform bei einer Realtion 'Person'

Hi,

ich bin gerade dabei einen Terminkalender mit Hilfe von MySQL und PHP zu erzeugen, nun bin ich auf ein kleines Problem gestoßen:

Und zwar habe ich folgende Relation erzeugt:

CREATE TABLE Person
(
PersNr INT(6) UNSIGNED NOT NULL AUTO_INCREMENT,
Name VARCHAR(50) NOT NULL,
Vorname VARCHAR(50) NOT NULL,
Plz VARCHAR(5) NOT NULL,
Ort VARCHAR(50) NOT NULL,
Strasse VARCHAR(50) NOT NULL,
Email VARCHAR(50) NULL,
TelNr VARCHAR(20) NULL,
PRIMARY KEY(PersNr)
);

Mir ist aufgefallen das Ort und Straße die Postleitzahl bestimmt (Ort,Strasse-&gt:stuck_out_tongue_winking_eye:LZ). Die 3. Normalform besagt doch, dass kein Attribut von einem Nicht-Schlüssel-Attribut abhängig sein darf, oder?

Nun stell ich mir die Frage, ob das in diesem Fall überhaupt sinnvoll ist eine weitere Relation (Ort) zu erstellen, was sagt ihr dazu?

Mit freundlichen Grüßen

Chriss

Nun stell ich mir die Frage, ob das in diesem Fall überhaupt
sinnvoll ist eine weitere Relation (Ort) zu erstellen, was
sagt ihr dazu?

– Ich würdee eine Tabelle ORT definieren und eine weitere Tabelle Adressen, da es ja auch möglich sein wird, dass eine Person mehrere Adressenbesitzt

Eine separate Tabelle Adressen ist vermutlich recht sinnvoll.

Die Beziehung Adresse - Ort - PLZ in irgendeiner Form zu normalisieren macht in den allermeisten Fällen keinen Sinn. Helfen würde es wenn man diese Zuordnung aktualisiert bekommen würde (Testweg 24 in Musterbach ist jetzt nicht mehr PLZ 31245, sondern 4711) und dadurch implizit alle Adressen aktualisiert werden würden.

Das ist aber eigentlich nur für Leute relevant, die Adressbereinigung betreiben.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Chriss,

Nun stell ich mir die Frage, ob das in diesem Fall überhaupt
sinnvoll ist eine weitere Relation (Ort) zu erstellen, was
sagt ihr dazu?

wie fast meistens: Es kommt drauf an, nämlich was die Anwendung an Fehlermöglichkeiten zulassen soll. Ein Adressverlag würde das sicher ausmodellieren und in Kauf nehmen, dass in wenigen Fällen, nämlich in Großstädten, sogar die Straße mit in die PLZ eingeht. Für alle andern Zwecke sollte es genügen, hinter den PLZ die Ortsnamen abzulegen, damit wenigstens die richtig gedruckt werden.

Gruß Ralf

Hi!

wenn „Ort, Strasse -> PLZ“, ist es dann sinnvoll eine Relation mit dieser Form {PLZ varchar(5), Ort varchar(50)} zu erstellen?

Aber wie gestalte ich dann die Eingabe eines Benutzers?
Mal angenommen ein Benutzer gibt 12345 Musterstadt ein dann muss ich, bzw. das DBMS, erstmal überprüfen, ob bereist ein Eintrag in der Tabelle PLZ mit PLZ=12345 vorhanden ist. Ist dies nicht der Fall, dann wird ein neues Tupel {12345, Musterstadt} hinzugefügt.

Wenn ich das so gestalte (ich weiß nicht ob das der richtige Weg ist), dann ergibt sich aber ein Problem: wenn die PLZ 12345 noch nicht in der Tabelle steht, kann der Benutzer ja irgend eine Stadt dazu angeben, ob die nun stimmt oder nicht (z. B. Müüncen anstatt München), dieser Fehler steht dann bei jedem weiteren Nutzer der diese PLZ verwendet.

Gibt es einen anderen Weg um soetwas zu verhindern?

Mfg Chriss

Hi Chriss,

nimm Dir ein Postleitzahlenbuch und schau nach, wie viele PLZ nicht von der Straße abhängen - das sind die weitaus meisten. Falls Du eine Adressprüfung vornehmen musst, also nur korrekte Postleitzahlen benutzt werden dürfen, dann bleibt nichts übrig, als voll auszumodellieren: Zwei disjunkte Teilmengen an PLZ, von denen eine den Ort liefert, die zweite Ort und Straße.

Wenn die Eingabe falscher PLZ verhindert werden soll, darf gar keine Eingabe möglich sein, sondern nur die Auswahl aus einem Verzeichnis, das Du bereitstellst.

Gruß Ralf

Achtung: Straße, Haus-Nr. und Ort ergeben die PLZ
ein Beispiel:
Schwabacher Straße 10 in Fürth/Bay. --> 90762
Schabachter Straße 510 in Fürth/Bay. --> 90762

Das gleiche mit der Hanauer Landstraße in Frankfurt/Main

ich meinte natürlich:

ein Beispiel:
Schwabacher Straße 10 in Fürth/Bay. --> 90762
Schabachter Straße 510 in Fürth/Bay. --> 9076 3

Das gleiche mit der Hanauer Landstraße in Frankfurt/Main