Announcement

Collapse
No announcement yet.

Frage zu Primary- und Foreign Key

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Frage zu Primary- und Foreign Key

    Hi, hab ne Frage zum Thema Primary key und Foreign key.

    Zur Ausgangslage:
    Ich hab zwei Tabellen die über eine m:n Beziehung verbunden sind. Tabelle A und Tabelle B. Um die m:n Beziehung aufzulösen wurde einedritte Tabelle A_x_B erstellt.
    In allen drei Tabellen wurde jeweils ein Primary Key erstellt, sowie die entsprechenden Foreign Keys verknüpft.

    Zur Frage:
    Wenn ich die Tabellen mit Datensätzen befülle, wie muss dann die Tabelle A_x_B befüllt werden?
    Reicht es aus nur die Spalte mit dem Primary Key zu füllen? Eigentlich sollten die Foreign Key`s ja von den anderen Tabellen übernommen werden.

    Quellcode:

    CREATE TABLE A (
    id_a int,
    Attribut_a VCHAR (30),
    PRIMARY KEY (id_a));

    CREATE TABLE B (
    id_b int,
    Attribut_b VCHAR (30),
    PRIMARY KEY (id_b));

    CREATE TABLE A_x_B (
    id_a_x_b int,
    PRIMARY KEY (id_a_x_b)
    fid_a INT REFERENCES A (id_a)
    fid_b INT REFERENCES B (id_b));

    ALTER TABLE A
    ADD fid_a_x_b INT REFERENCES A_x_B (id_a_x_b);

    ALTER TABLE B
    ADD fid_a_x_b INT REFERENCES A_x_B (id_a_x_b);

    INSERT INTO A
    VALUES (1, 'Audi');

    INSERT INTO A
    VALUES (2,'BMW');

    INSERT INTO B
    VALUES (1,'Schmitt');

    INSERT INTO B
    VALUES (2, 'Schulz');

    INSERT INTO A_x_B
    VALUES (1);

    INSERT INTO A_x_B
    VALUES (2);

    Problem:
    Meiner Meinung nach sollten jetzt die Foreign Key`s in der Tabelle A_x_B die Werte aus der Tabelle A und Tabelle B des jeweiligen Primary Key übernehmen. Wenn ich allerdings eine Abfrage starte zeigt er mit nur die Manuell eingefügten Werte.

    Entweder steh ich total auf dem Schlauch oder ich hab nen Denkfehler drin. Kann es sein das ich vielleicht ne falsche Reihenfolge bei der Erstellung der Keys verwendet hab?
    Wäre nett wenn mir jemand helfen kann. Danke schon mal für die Mühe die ihr euch macht.

    Gruß Stefan

  • #2
    Hallo Stefan,

    siehe Database normalization und Fremdschlüssel-Beziehungen.

    Dann solltest du das selber lösen können.


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      m:n heisst:

      n: 1 Datensatz in Tabelle A kann n Datensätzen in Tabelle B zugeordnet werden
      m: 1 Datensatz in Tabelle B kann m Datensätzen in Tabelle A zugeordnet werden

      Wenn die Datensätze IMMER dieselben PKs haben, dann kannst Du diese im Endeffekt auch in eine Tabelle schreiben die alle Spalten enthält, ausser es gibt performancetechnische Gründe z.B. BLOBs.

      Woher soll denn in deinem Beispiel die DB wissen welche Datensätze verknüpft werden sollen? Es könnte doch sein dass User 1 einen Audi und einen BMW hat und User 2 nur einen BMW. Dann hättest Du in der Zwischentabelle 3 Datensätze:

      Code:
      1 1 1
      2 1 2
      3 2 2
      Sorry Günther wenn ich schon wieder was vorweg nehme

      Pöhses Ich

      Comment


      • #4
        Ok..danke soweit erstmal.
        Das mit der zwischentabelle ist ja genau mein Problem.
        Nur kurz zum Verständnis. Die PK`s aus Tabelle A und Tabelle B werden doch zu den Fremdschlüsseln in der Zwischentabelle und der PK aus der Zwischentabelle der FK in den beiden anderen Tabellen. Oder bin ich da falsch?
        Oder anders gefragt. Mit welchen Datensätzen muss ich die Zwischentabelle füttern damit eine eindeutige Zuordnung zustande kommt?

        Comment


        • #5
          Den PK in der Zwischentabelle könnte man sich eigentlich sparen. Man sollte diesen aber trotzdem immer anlegen, denn kombinierte/zusammengesetzte Primärschlüssel sollten möglichst vermieden (erweiterbarkeit der Datenbank, leichtere Warbarkeit)

          Jeder Datensatz in der Zwischentabelle zeigt per FK auf einen User und eine Automarke.

          Code:
          Id A_ID B_ID
          1  1    1
          2  1    2
          3  2    2
          A_ID entspricht hier dem PK aus Tabelle A - B_ID analog.

          Audi ist nun Schmitt zugeordnet -> 1 1
          Audi ist nun Schulz zugeorndet -> 1 2
          BMW ist nun Schulz zugeorndet -> 2 2

          Comment


          • #6
            Ja genau aber muss ich das so in die Zwischentabelle eingeben oder reicht das wenn ich nur die ID eintrage da die Fremdschlüssel ja die Werte von den PK übernehmen sollten.

            Comment


            • #7
              Natürlich musst Du das da eintragen Ich glaub Du hast das immer noch nicht so ganz verstanden. Die Zwischentabelle referenziert einfach Datensätze. Sie ordnet immer zwei Datensätze einander zu.
              Lass wir mal den PK in der zwischentabelle weg

              Tabelle User:

              Code:
              Id Name
              1  Hans
              2  Sepp
              3  Rudolf
              Tabelle Automarke

              Code:
              Id Name
              1  BMW
              2  Audi
              3  Toyota
              Zwischentabelle

              Code:
              User_Id Automarke_Id
              1       1
              1       2
              2       1
              2       3
              3       1
              3       2
              3       3
              Hier werden nun einfach verschiedenen Benutzern Automarken zugewiesen. Den PK braucht man eigentlich nicht. Man führt ihn aber trotzdem ein, damit man keinen zusammengesetzten Primärschlüssel braucht. Für Dein Problem ist er aber erstmal irrelevant

              Comment


              • #8
                Ahh ok...jetzt...ja gut dann ist mir erst mal viel geholfen. Danke

                Comment


                • #9
                  Jetzt hats wohl klick gemacht

                  Comment

                  Working...
                  X