Betreuer, Kunde, Verträge

exzel

SQL-Guru
Beiträge
170
Hallo zusammen,

ich möchte in einer Datenbank Betreuer, die zugehörigen Kunden und deren Verträge erfassen.

Doch leider komme ich nicht ganz durch mit dem Design.

Ich habe die Tabellen betreuer, kunde und vertrag erstellt. In betreuer werden die Daten wie id-betreuer, Telefon, Geburtsdatum, Name oder Vorname des Betreuers festgehalten. In kunden werden id_kunde, Vorname, Name, Ort etc. festgehalten. Und in Verträge natürlich die Vertragsdaten mit der id_vertrag als Primärschlüssel, was in den anderen Tabellen ebenfalls so ist.

Die Verknüpfung sollte jeweils 1:n sein. Ein Betreuer hat viele Kunden, ein Kunde hat viele Verträge.

Also wäre für mich der Fall eigentlich klar. Ich erstelle zusätzlich in den Tabellen kunden eine Spalte id_betreuer, um damit die Tabellen betreuer und kunde zu verknüpfen. Und in der Tabelle vertrag eine Spalte id_kunde um die Tabellen vertrag und kunde zu verknüpfen.

Dann komme ich zwar vom Betreuer auf dessen Kunden und auf deren Verträge, aber wie kann ich direkt vom Betreuer auf die Verträge kommen, die er vermittelt hat?

Muss ich da eine zusätzliche Tabelle anlegen oder genügt das Datenbankdesign soweit?

Wie muss ich das machen, damit ich die Normalisierung etc. einhalte?


Danke und Gruß
 
Werbung:

Charly

Datenbank-Guru
Beiträge
306
Hallo exzel,

Dann komme ich zwar vom Betreuer auf dessen Kunden und auf deren Verträge, aber wie kann ich direkt vom Betreuer auf die Verträge kommen, die er vermittelt hat?

Code:
SELECT

  B.BetreuerID,
  V.VertragID

 FROM Betreuer as B

JOIN Kunde AS K ON K.KundeID=B.KundeID

JOIN Vertrag AS V ON V.VertragID=K.VertragID

WHERE B.BetreuerID = 123

Die Abfrage zeigt dir alle Verträge des Betreuers.

Zur Normalisierung schreibe ich Dir heute Abend noch was.
Jetzt fahre ich erst mal nach hause
smile.png


Gruß Charly
 

exzel

SQL-Guru
Beiträge
170
Schon einmal vielen Dank für die Antwort!
Und bitte sag mir, ob die Idee mit den drei Tabellen dann auch so passt :)

Gruß
 

ukulele

Datenbank-Guru
Beiträge
4.579
Von der Logik her einwanfrei.

Geht auch über
Code:
SELECT    *
FROM    betreuer b,
        kunde k,
        vertraege v
WHERE    b.id_betreuer = k.id_betreuer
AND        k.id_kunde = v.id_kunde
 

exzel

SQL-Guru
Beiträge
170
Na, da bin ich ja beruhigt.

Angenommen ich würde jetzt noch zusätzlich eine Verbindung zwischen Betreuer und Verträge schaffen, indem ich eine Spalte id_betreuer in der Tabelle vertrag erstelle. Dann hätte ich in der Tabelle vertrag die id_vertrag, id_kunde, id_betreuer. Wäre das dann evtl. ein Verstoß gegen eine Normalform?
Die Frage ist nur zum besseren Verständnis.

Gruß
 

ukulele

Datenbank-Guru
Beiträge
4.579
Jo wäre es, auch wenn ich jetzt in der Theorie kein Meister bin. Es wäre auf jedenfall eine redundante Information, folglich überflüssig. Natürlich kann sowas technisch hilfreich sein aber notwendig ist es nicht.
 

Charly

Datenbank-Guru
Beiträge
306
Hallo exzel,

ich schließe mich ukulele an und erkläre Dir noch warum.

die 3. Normalform sagt das ein Attribut nur vom Schlüssel funktional Abhängig sein darf.
Wenn Du jetzt noch Betreuer_id in die Vertrag-Tabelle mit aufnimmst ist Betreuer_id funktional abhängig von Kunde_id und dem Schlüssel.

Du kannst das ganz einfach überprüfen.
Wenn Du Daten in der Vertrag-Tabelle hast und die Daten nach Kunde_id sortierst und Du jetzt doppelte einträge bei Betreuer_id findest
hast Du eine funktionale Abhängigkeit von Beteruer_id zu Kunde_id und Betreuer_id muss wieder raus.

Gruß Charly
 

exzel

SQL-Guru
Beiträge
170
Hallo nochmal,

mir sind doch nochmals Fragen eingefallen.

Angenommen ich würde die Tabelle kunde und betreuer ohne vertrag verknüpfen und würde folgenden Aufbau in Erwägung ziehen.

Code:
Tabelle: Kunden
id_kunde | name_kunde | vorname_kunde
1        | meier      | hans
2        | huber      | fred
3        | steiger    | alfons


Tabelle: Betreuer
id_betreuer | name    | id_kunde
1           | großer  | 1
1           | großer  | 2
1           | großer  | 3


Da haben wir auch wieder Datenredundanz, da pro neuem Kunde in der Tabelle Betreuer eine neue Zeile angelegt werden müsste. Gegen welche Normalform verstößt das?
Ich hab' dieses Beispiel aus einem anderem Forum und da war die Antwort, das es gegen keine Normalform verstößt, sondern die Beziehung in den Tabellen falsch wäre. Richtig wäre die Beziehung 1:n, also ein Betreuer auf viele Kunden. In dieser Beziehung handelt es sich aber um eine n:m Beziehung.

Wie seht ihr das?

Gruß und Dank
 

Charly

Datenbank-Guru
Beiträge
306
Hallo exzel,

In dieser Beziehung handelt es sich auch um eine 1:N aber die Richtung ist falsch. Der Betreuer ist der Fremdschlüssel im Kunden und nicht der Kunde ist der Fremdschlüssel im Betreuer.

Also so:

Tabelle Kunden
Code:
id_kunde | id Betreuer | Name_kunde
1        | 1          | meier
2        | 1          | huber
3        | 1          | steiger

Gruß Charly
 

exzel

SQL-Guru
Beiträge
170
Nochmals danke für die Antwort.

Was wäre den jetzt, wenn ich Kunden gruppieren müsste? Also z.B. wenn zwei Kunden verheiratet sind. Könnte ich da einfach die Spalte gruppe in der Tabelle kunde hinzufügen und bei den zusammengehörigen Kunden die gleiche Ziffer hinterlegen? Meiner Meinung nach ja, weil ich keinen Verstoß gegen die ersten drei Normalformen sehe. Und die anderen Tabellen können soweit unberührt bleiben, oder?

Gruß
 

Charly

Datenbank-Guru
Beiträge
306
Hallo exzel,

Könnte ich da einfach die Spalte gruppe in der Tabelle kunde hinzufügen und bei den zusammengehörigen Kunden die gleiche Ziffer hinterlegen?
Ja

Und die anderen Tabellen können soweit unberührt bleiben, oder?
Ja

weil ich keinen Verstoß gegen die ersten drei Normalformen sehe.

Die Spalte Gruppe dürfte ein Verstoß gegen die 3.NF sein.
Wenn Du allerdings Adressdaten in Deiner Tabelle hast liegt die Tabelle sowieso nicht mehr in der 3.NF vor.

Mach Dir deswegen aber keinen Kopf. Die 3.NF ist nicht immer Praxistauglich.

Gruß Charly
 
Werbung:
Oben