4 Tabellen beziehungsmäßig verknüpfen ?

Hallo,

ich habe hier 4 Tabellen:
1 Mastertabelle: Aufträge

3 Detailtabellen: Kunden, da es 3 Kundenarten mit verschiedene Einträge gibt.

##############

Jeder Auftrag wird einem Kunden zugeordnet, dieser Kunde wird aus einem der 3 Kundenstämme auserwählt.

Mir ist noch nicht so ganz klar wie ich hier die Verknüpfung auf Beziehungsebene herstelle.

Zwischen Kunde und Auftrag besteht eine 1:1 Beziehung.
Aber Kunden können aus 3 Kundenstämme bestehen, wie stelle ich da die Beziehung her ?

Muss ich für die Kundenstämme noch eine 5. Tabelle erstellen ? Und die 5 Tabelle mit der Auftragstabelle verbinden ?

Danke im voraus.
Gruß, marsi

Hallo, Marsi!

ich habe hier 4 Tabellen:
1 Mastertabelle: Aufträge
3 Detailtabellen: Kunden, da es 3 Kundenarten mit verschiedene
Einträge gibt.
Jeder Auftrag wird einem Kunden zugeordnet, dieser Kunde wird
aus einem der 3 Kundenstämme auserwählt.
Mir ist noch nicht so ganz klar wie ich hier die Verknüpfung
auf Beziehungsebene herstelle.

Zwischen Kunde und Auftrag besteht eine 1:1 Beziehung.

Das glaube ich nicht. Denn generell könntest Du eine 1:1-Beziehung ohne Redundanz (höchstens mit leeren Feldern) auch in einer Tabelle abbilden. Ich denke, dass ein Kunde auch mehrere Aufträge vergeben kann. Also 1:n von Kunde nach Auftrag.

Insofern scheint mir auch die Bezeichnung „Mastertabelle“ für Aufträge nicht wirklich korrekt zu sein, denn man hat in der Regel einen Kunden, bevor es zu einem Auftrag kommt.

Aber Kunden können aus 3 Kundenstämme bestehen, wie stelle ich
da die Beziehung her ?
Muss ich für die Kundenstämme noch eine 5. Tabelle erstellen ?
Und die 5 Tabelle mit der Auftragstabelle verbinden ?

Hmmmmm. Hier wäre es sinnvoll, etwas genaueres über den Aufbau Deiner 3 Kundentabellen zu wissen. Ich denke, Du wirst es hier mit zumindest teilweiser „Vererbung“ zu tun haben. Ich nehme mal an, jeder Kunde, ganz gleich aus welchem Kundenstamm, hat z. B. einen Namen und eine in Deiner DB eindeutige ID.

Ich würde also eine Gesamttabelle „Kunden“ mit den übergreifend gleichen Attributen anlegen, z. B. mit:

Id
Name
Adresse

KundenstammNr (als „Verweis“ auf die Kundenstamm-Art; „Verweis“ klingt übertrieben, ist nur eine Zahl oder so, die Dir sagt, wo ggf. weitere Details zum Datensatz zu finden sind. Wird nicht über eine reale Beziehung oder so verknüpft.)

Dann würde ich, wenn Du wirklich die Kundenstämme wegen mehrerer verschiedener Felder hast, diese Details in zusätzliche Tabellen eintragen, die 1:1 mit der obigen Tabelle verknüpft sind:

Kundenstamm1

Id (1:1 mit obiger Tabelle verknüpft, ebenfalls Schlüssel in dieser Tabelle)
Rabattstaffel (nur diese Kunden haben eine Rabattstaffel)

Kundenstamm2

Id (1:1 mit obiger Tabelle verknüpft, ebenfalls Schlüssel in dieser Tabelle)
Mitarbeiter (nur bei diesen Kunden ist die Mitarbeiterzahl wichtig)

Kundenstamm3 analog.

Und die Auftragstabelle verknüpfst Du dann mit der Kundentabelle. Im Klartext sähe das bei mir ungefähr so aus:

Auftraege Kunden KdStamm1
========= ====== ========
KdId (Fremdschl.)n1KdId (Key)11KdId (Key)
AuftrId (Key) Name \ Mitarbeiter
 Adresse \
... \ KdStamm2:
 -KdId (Key)
 Rabatt

Ansonsten beschreib mal die zugrundeliegende Semantik genauer, falls ich mit obigem so falsch liegen sollte.

Gruß, Manfred

Hallo Manfred,

danke für deine Hilfe, die man gut nachverfolgen kann.
In dieser Richtung habe ich auch schon ein bißchen denken können,
habe in 1 Hinsicht aber noch ein Gedankenproblem.

Und die Auftragstabelle verknüpfst Du dann mit der
Kundentabelle. Im Klartext sähe das bei mir ungefähr so
aus:

Auftraege Kunden KdStamm1
========= ====== ========
KdId (Fremdschl.)n1KdId (Key)11KdId (Key)
AuftrId (Key) Name \ Mitarbeiter
Adresse
… \ KdStamm2:
-KdId (Key)
Rabatt

Soweit so gut. Ich werde die 3 Kundenstämme mit einer Extra-Tabelle Kunden verknüpfen.Bloss, wenn ich die KdID nehme , habe ich das Problem, dass die Keys von KdId´s in den einzelnen Kundenstämme sich überschneiden können ?
Bsp:
Kundenstamm 1:
KundID: 1
Rabatt: 5%
KundID: 2
Rabatt: 3%

Kundenstamm 2:
KundID: 1
Mitarbeiterzahl: 10
KundID: 2
Mitarbeiterzahl: 100

Wenn ich beide in dieser Form zufügen möchte:

Kunden KdStamm1
====== ========
1KdId (Key)11KdId (Key)
Name \ Mitarbeiter
Adresse \
 \ KdStamm2:
 -KdId (Key)
 Rabatt

Dann habe ich doch das Problem, dass hier bei den Kundenstämme 2 mal KundID 1 udn 2 auftauchen würde und ich in der Tabelle Kunden 2 mal die glecih Zahl hätte, was dann nicht als eindeutiger Schlüssel zu identifizieren wäre.

Wie könnte ich dieses Problem lösen ?

Danke und Gruß, Marsi

Hallo Marsi,

danke für deine Hilfe, die man gut nachverfolgen kann.
In dieser Richtung habe ich auch schon ein bißchen denken
können,
habe in 1 Hinsicht aber noch ein Gedankenproblem.

Denke ich mir. Ist ja auch nicht ganz trivial.

Soweit so gut. Ich werde die 3 Kundenstämme mit einer
Extra-Tabelle Kunden verknüpfen.Bloss, wenn ich die KdID nehme
, habe ich das Problem, dass die Keys von KdId´s in den
einzelnen Kundenstämme sich überschneiden können ?
Bsp:
Kundenstamm 1:
KundID: 1
Rabatt: 5%
KundID: 2
Rabatt: 3%

Kundenstamm 2:
KundID: 1
Mitarbeiterzahl: 10
KundID: 2
Mitarbeiterzahl: 100

Hier wäre die Frage: Kann ein Kunde gleichzeitig in mehreren Kundenstämmen sein? Datenbanktechnisch sicherlich. Falls semantisch nicht, musst Du das per Programm verbieten. (Oder kann Access am Ende sogar Gültigkeitsüberprüfungen in anderen Tabellen? Keine Ahnung…)

Wenn ich beide in dieser Form zufügen möchte:

Kunden KdStamm1
====== ========
1KdId (Key)11KdId (Key)
Name \ Mitarbeiter
Adresse
\ KdStamm2:
-KdId (Key)
Rabatt

Dann habe ich doch das Problem, dass hier bei den Kundenstämme
2 mal KundID 1 udn 2 auftauchen würde und ich in der Tabelle
Kunden 2 mal die glecih Zahl hätte, was dann nicht als
eindeutiger Schlüssel zu identifizieren wäre.

Hier wäre eher das Problem, dass bei meinem komischen Feld „Kundenstamm“ in der Kundentabelle keine eindeutige Zuordnung zu treffen wäre. Wäre aber auch egal.

Also: Wenn Du in Stamm1 und Stamm2 die gleiche ID hast, heißt das im Klartext, dass es sich um den gleichen Kunden handelt. Hier ist die „Mastertabelle“ die Tabelle Kunden:

1 - Hubermaier
2 - Schmittmüller
3 - Meier
4 - Schulze

Wenn nun die ersten beiden dem Stamm1 angehören, die anderen nicht, so gibt es in Stamm1:

1 - 5%
2 - 3%

Wenn Kunde Meier dem Stamm2 UND Stamm3 angehört (Wie gefragt, kann das sein?), Kunde Schulze nur Stamm2, dann sähen diese Tabellen wie folgt aus:

Stamm2
3 - 50
4 - 100

Stamm3
3 - irgendwasanderes

Wenn Du nun die Kunden NUR aus Stamm1 willst, machst Du das ganz einfach mit einer Equi-Join-Abfrage: SELECT Kunden.*, Stamm1.* FROM Kunden INNER JOIN Stamm1 ON Kunden.Id=Stamm.Id (nicht getestet, musst noch mal genau schauen…). Für die anderen Kundenstämme analog.

Wenn Du alle Kunden haben willst, nimmst Du einen Outer Join (beim Abfrageentwurf Rechtsklick auf die Beziehung, dann „Alle aus Kunden und nur die aus Stamm x, bei denenInhalte gleich sind…“). Dann sähe die Tabelle (ungefiltert) ungefähr so aus:

Id Name Rabatt MA Sonstiges
1 Hubermaier 5% NULL NULL
2 Schmittmüller 3% NULL NULL
3 Meier NULL 50 irgendwas
4 Schulze NULL 100 NULL

Also noch mal zusammenfassend:

Eindeutig ist die Id in der Tabelle Kunden.

Es kann in der Tabelle Stamm x KEINEN Datensatz geben, den es nicht in der Tabelle Kunden gibt. Zuerst muss also der Datensatz in der Tabelle Kunden angelegt sein.

Zu jedem Datensatz aus Kunden KANN es einen Datensatz in einer Stamm-Tabelle geben, muss es aber nicht. Die inhaltliche Bedeutung musst Du programmtechnisch umsetzen (z. B. in GENAU EINER Stammtabelle muss die Id vorhanden sein, nicht in zwei, drei oder keiner).

Daten aus einem Stamm holst Du am einfachsten mit einem Equi Join.

Alle Kundendaten stammübergreifend holst Du mit einem Outer Join.

Ist es nun ein bisschen klarer? Ich hoffe mal… Falls nicht, melde Dich wieder…

Gruß, Manfred