Datenbanken Normalform

derocco

Lt. Junior Grade
Registriert
Nov. 2015
Beiträge
331
War mir bei der Normalisierung nicht ganz klar ist vo wo die schlüssel ausgehen wen es 1 zu 1 beziehungen sind.

Bsp Kunde mit Zahlungsverbindung.
Ich habe das aufgebrochen weil Zahlungsverbindung ja zb auf Ende jahr wechseln kann.

Hat jetzt der Customer einen Eintrag PayConnID auf den Primärschlüssel in der PaymentConnection Tabelle, oder die PaymentConnection Tabelle auf den Primärschlüssel in der KundenTabelle?
 
Ein Kunde ist einn Kunde und bleibt ein kunde (1) er kann aber viele (n) beliebige zahlungsverbindungen haben, also : ´Kunde 1 PK -> PayconID hat Ihren eigenen PK und einen FK auf die Kunden(PK) Tabelle. Falls ich den Text richtig verstehe und ja UML wär enice :)
 
Ich würde mir immer überlegen, von wo aus ich im Zweifel den Löschhammer ansetze, um hübsche Kaskaden aufbauen zu können. Wenn deine Überlegung ist, dass du seine Zahlungsverbindung mit abräumen willst, wenn du einen Kunden löschst, dann würde ich in der Zahlungsverbindung einen FK auf den Kunden vorsehen. Kunde weg -> Kaskade -> Zahlungsverbindung weg.

Wenn das Löschen des Kunden ein Szenario ist und du modellierst es andersrum, dann brauchst du entweder einen Trigger, der dann die Zahlungsverbindung weglöscht oder musst dir im Programmcode die Bankverbindung merken und sie manuell löschen.
 
mental.dIseASe schrieb:
Kunde weg -> Kaskade -> Zahlungsverbindung weg.
Uff.. damit wird aber die Buchhaltung arge Problemme haben, vor allem dann, wenn die Einnahmen gegenüber dem Finanzamt nachvollziehbar gezeigt werden soll und die Daten dafür weg sind :-D
 
derocco schrieb:
War mir bei der Normalisierung nicht ganz klar ist vo wo die schlüssel ausgehen wen es 1 zu 1 beziehungen sind.

Bsp Kunde mit Zahlungsverbindung.
Ich habe das aufgebrochen weil Zahlungsverbindung ja zb auf Ende jahr wechseln kann.

Hat jetzt der Customer einen Eintrag PayConnID auf den Primärschlüssel in der PaymentConnection Tabelle, oder die PaymentConnection Tabelle auf den Primärschlüssel in der KundenTabelle?

Ein Kunde kann mehrere Konten haben, dass zwei Kunden das selbe Konto haben kommt dagegen nicht vor. Also steht im Konto die id des Kunden 😉
 
new Account() schrieb:
Ein Kunde kann nur 1 Konto haben:

"Ich habe das aufgebrochen weil Zahlungsverbindung ja zb auf Ende jahr wechseln kann."

Ein Kunde kann scheints nur ein aktives Konto haben, aber nach 1:1 hört sich das nicht so wirklich an.
 
Wechseln -> durch neue ersetzen -> 1-1 macht wieder Sinn.

Sonst würde die Problemstellung auch keinen Sinn ergeben, und die Frage welche Tabelle die Referenzen enthält, kommt gar nicht auf.
 
Wie jetzt, geht es um die Relation 1:1 oder geht es um die Kontenfrage? :confused_alt:

1:1 macht man normalerweise so, daß man einen gemeinsamen PK definiert. Mit Normalform läßt sich 1:1 nicht darstellen, das ist da ein bißchen Sonderform.

Beispiel, ich hab Mitarbeiter und ich hab Vorgesetzte, aber aus welchem Grund auch immer hab ich für die Vorgesetzten signifikant mehr Attribute, die ich da brauche.
Jetzt kann das natürlich alles in eine Tabelle und sollte gemäß Normalform auch in eine Tabelle. Aber dann hab ich tonnenweise Nullen wegen sehr viel mehr Vorgesetzten als MA und tonnenweise Attributen, die bei den MA leer bleiben.

Dennoch sind Vorgesetzte natürlich auch Mitarbeiter.

Deshalb baue ich
A eine Tabelle für die MA mit allen Attributen für die MA und NUR für die MA, dh ich begreife das Personal pauschal als Mitarbeiter und ignoriere erstmal die Tatsache, daß darunter auch Vorgesetzte existieren. Die nehm ich zwar auch alle mit, aber die Tatsache, daß es V. sind, ist aus der MA-Tabelle nicht ersichtlich.
PK wird die Mitarbeiter-ID. Wie die beschaffen ist, ist egal.

B Eine Tabelle für die Vorgesetzten. In OO und in Postgres könnte man das einfach ableiten, aber in RDBMS nicht, daher kommen hier alle Attribute rein, die die Vorgesetzten zusätzlich brauchen.

PK bleibt die Mitarbeiter-ID.

Dann kann ich das hinterher zusammenfügen über die MA-ID, die den MA eh eindeutig identifiziert, ich kann den Vorgesetzten bestimmen, wenn der MA in der V.Tabelle existiert, bzw kann feststellen, daß der MA kein V. ist, wenn er dort nicht existiert.

1:1 Relationen muß man händisch bauen. Sie sind nicht immer sinnvoll, aber können aus Performancegründen relevant werden, insbesondere, wenn BLOB-Daten ins Spiel kommen.

Aus der NF leiten sie sich aber NICHT her.
 
Zurück
Oben