Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

zusammengesetzter Primärschlüssel





Frage

Hallo Leute, ich schlage mich hier mit einem - hoffentlich - kleinen Problem in Access 2000 herum! Es geht dabei um folgendes: ich habe ein Tabelle HERSTELLER mit u.a. den Attributen MANDANT, HERSTELLERNR, HERSTELLERNAME etc. Dann habe ich noch eine Tabelle ARTIKEL mit u.a. den Attributen MANDANT, ARTIKELNR, ARTIKELNAME, HERSTELLERNR etc. Wie vielleicht zu erkennen ist, sind die beiden Tabellen (nach meinem Datenbankschema!) über den Schlüssel HERSTELLERNR verbunden. Mein Problem ist nun, dass jede Tabelle einen zusammengesetzten Primärschlüssel haben muss, nämlich MANDANT und xxx. Den Mandanten brauche ich, da die Datenbank zwei Datenverwaltungen (deren Aufbau identisch ist!) beinhalten soll. Wenn ich jetzt versuche, bei den Beziehungen das HERSTELLERNR-Attribut der beiden Tabellen zu verbinden, meckert Access, dass die Beziehung undefiniert ist, obwohl es eine einfache 1:n-Beziehung sein müsste! Sobald ich in der Tabelle HERSTELLER den Primärschlüssel auf HERSTELLERNR beschränke, kann Access die Beziehung auflösen! Falls hier jetzt noch jemand mitgekommen ist und 'nen Tipp hat, wie ich das Problem lösen kann, wäre ich sehr dankbar für jede Hilfe. Grüße, Dennis

Antwort 1 von mblank

mit deinen tabellen kann ich dir ja bis zu einem bestimmten punkt folgen. aber warum ist mandant ein attribut des herstellers???

ist mandant gleich kunde (nur für mein verständis???
(da ich wie wohl jeder standardmäßig gelernt hat
Kunde Artikel Hersteller)

kannst das mit den mandaten nochmal erklären ?
du hast zwei mandanten-tabellen ? die identisch sind / sein sollen??? (das soll doch eigentlich in einer Datenbank verhindert werden ? oder irre ich mich da)

andré

Antwort 2 von Dennis Galander

hi,

nochmal das mandanten-konzept:

stell dir vor, dass zwei unternehmen eine absolut identische datenbank nutzen würden, also jedes unternehmen für sich. (oftmals passiert das auch innerhalb eines unternehmens z.b. mit verschiedenen zweigstellen!). damit man aber nicht gezwungen ist, zwei identische datenbanken pflegen zu müssen, kann man eine art mandanten-konzept einführen und somit eine gemeinsame datenbank nutzen!

das würde dann so funktionieren, dass man am anfang (also bei datenbankstart) einen mandanten auswählt, also quasi, für welchen bereich man jetzt anfangen möchte in der datenbank zu arbeiten. und nur für diesen ausgewählten mandanten werden dann die daten verarbeitet, d.h. der mandant "100" (firmenbereich a) hat andere hersteller und artikel, wie der mandant "200" (firmenbereich b)!

in der reinen tabelle würde aber z.b. stehen:

mandant herstellernr herstellername ...
100 1 müller
200 1 schulz
100 2 mayer
200 2 geier
200 3 ...

lass dich aber von dem mandantenproblem nicht ablenken. das problem existiert generell:

zwei tabellen -> tabelle a mit zusammengesetztem primärschlüssel -> tabelle b soll fremdschlüssel in 1:n-beziehung zur EINEM attribut von tabelle a haben! und access (2000) kann diesen wunsch nicht auflösen!

ich hoffe, es ist jetzt ein klein wenig klarer...

danke für die hilfe,
dennis

Antwort 3 von El Bobbele

Hallo Dennis,

für einen zusammengesetzten Primärschlüssel besteht in deinem Fall eigentlich keine Notwendigkeit. Deinen Ausführungen entnehme ich, dass jeder Mandant nur seine eigenen Hersteller mit deren Artikeln pflegt. Dann wären das ganz normale 1:n-Beziehungen:

Primärschlüssel          Fremdschlüssel
tblMandant.MandantID  -> tblHersteller.MandantID
tblHersteller.HerstID -> tblArtikel.HerstID


Wenn du aber dennoch auf den Schlüsselbund bestehst, dann musst du in der Tat in jeder Beziehung alle Felder des aktuellen Primärschlüssels angeben, das Zerlegen in Einzelteile gilt nicht!

Beispiel:

tblMandant.MandantID    -> tblHersteller.MandantID

tblHersteller.HerstID   -> tblArtikel.HerstID
tblHersteller.MandantID -> tblArtikel.MandantID

tblArtikel.ArtikelID    -> tblIrgendwas.ArtikelID
tblArtikel.HerstID      -> tblIrgendwas.HerstID
tblArtikel.MandantID    -> tblIrgendwas.MandantID


In dem Fall wüsstest du in jeder Tabelle, wer der dazugehörige Mandant ist. Das rückwärtige Abklappern der Tabellen bis zum Mandanten entfällt.

Vor ca. sieben Jahren war ich in einem Projekt eingebunden, in dem die letzte Tabelle am Ende der Hierarchie einen Primärschlüssel mit fünf Feldern lieferte. Es musste eben nur konsequent alles mitgeschleift werden. Das Beziehungsfenster war am Ende fast schwarz vor lauter Beziehungen.

Gruss
El Bobbele



Antwort 4 von testfix4711

Das Problem hatte ich auch schonmal und dann folgendermassen gelöst:

- eine Tabelle mit dem Mandantenstamm aufgebaut und dem Schlüssel "Mandant" (wegen der Redundanzen)
- die anderen Tabellen ebenfalls angelegt mit dem Feld "Mandant" und dann "Hersteller"
- hier ein Feld namens "PrimaryKey" (nur so geht das!) angelegt, welches aus den Feldern "Mandant" und "Hersteller" besteht
- eine 1:N Verknüpfung vom Mandantenstamm auf die anderen Tabellen
- fertig!

(Übrigens viel Spass beim Filtern der Daten!)

Antwort 5 von Dennis Galander

ei caramba,

@bobbele: hmm, deine erste ausführung würde ja funktionieren, allerdings ja nur dann, wenn z.b. die hersteller-id sich bei keinem mandantan wiederholt, also mandant "100" hat die hersteller mit den nummern 1, 2, 5 und 6; die kann dann mandant "200" nicht haben! (oder habe ich da was falsch verstanden?)

und diese problematik würde sich weiter durchziehen, denn BEIDE mandanten sollen artikel mit gleicher artikelnummer (z.b. 1900, 1910, 1920 ...) ggf. auch vom gleichen hersteller (der eine feste nummer hat: z.b. 32, 35, 36 ...)

das "ei caramba" bezieht sich auf deine zweite lösung; die muss ich mir mal in ner "hellen" stunde nochmal anschauen, denn sie sieht nach ziemlich viel aufwand aus.

@testfix: deine ausführungen kann ich noch nicht ganz nachvollziehen?! wie sah die tabelle "mandantenstamm" nochmal aus? mit welchen attributen/schlüssel? und was ist mit der anderen tabelle und dem primary key gemeint? seit mal bitte ein wenig genauer.

euch für eure (bisherige) hilfe dankend,
dennis

p.s. wenn jemand einen besseren vorschlag, als dieses "mandanten-konzept" hat, um mein generelles problem lösen zu können, wäre ich sehr dankbar. ich habe mir die idee nur vom aufbau einer "sap"-datenhaltung abgeschaut!