Ankündigung

Einklappen
Keine Ankündigung bisher.

2 Foreign Keys einer Tabelle auf einen Primary Key

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 2 Foreign Keys einer Tabelle auf einen Primary Key

    Hallo,

    ich noch nicht so viel Erfahrung mit Datenbanken und habe mit My SQL Workbench ein SQL Schema erstellt.. In der Tabelle Autoliste refferenzieren 2 FOREIGN KEYS (`Automodel_id` , `Automodel_Autohersteller_id`) auf einen Primary Key,. Bisher dachte ich immer, dass nur ein Foreign Key auf einen Primary Key refferenzieren kann? Vielleicht kann mir das jemand erklären?
    Danke.

    Code:
    -- MySQL Script generated by MySQL Workbench
    -- Sat Mar  7 00:03:48 2020
    -- Model: New Model    Version: 1.0
    -- MySQL Workbench Forward Engineering
    
    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
    SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
    
    -- -----------------------------------------------------
    -- Schema mydb
    -- -----------------------------------------------------
    
    -- -----------------------------------------------------
    -- Schema mydb
    -- -----------------------------------------------------
    CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
    USE `mydb` ;
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Autohersteller`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `mydb`.`Autohersteller` (
      `idAutohersteller` INT NOT NULL,
      `Autoherstellercol` VARCHAR(45) NULL,
      PRIMARY KEY (`idAutohersteller`))
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Automodel`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `mydb`.`Automodel` (
      `idAutomodel` INT NOT NULL,
      `Automodelcol` VARCHAR(45) NULL,
      `Autohersteller_id` INT NOT NULL,
      PRIMARY KEY (`idAutomodel`, `Autohersteller_id`),
      INDEX `fk_Automodel_Autohersteller_idx` (`Autohersteller_id` ASC),
      CONSTRAINT `fk_Automodel_Autohersteller`
        FOREIGN KEY (`Autohersteller_id`)
        REFERENCES `mydb`.`Autohersteller` (`idAutohersteller`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Autoliste`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `mydb`.`Autoliste` (
      `idAutoliste` INT NOT NULL,
      `Autolistecol` VARCHAR(45) NULL,
      `Automodel_id` INT NOT NULL,
      `Automodel_Autohersteller_id` INT NOT NULL,
      PRIMARY KEY (`idAutoliste`, `Automodel_id`, `Automodel_Autohersteller_id`),
      INDEX `fk_Autoliste_Automodel1_idx` (`Automodel_id` ASC, `Automodel_Autohersteller_id` ASC),
      CONSTRAINT `fk_Autoliste_Automodel1`
        FOREIGN KEY (`Automodel_id` , `Automodel_Autohersteller_id`)
        REFERENCES `mydb`.`Automodel` (`idAutomodel` , `Autohersteller_id`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

  • #2
    wo genau ist denn dein Problem? Das ist ein FK mit 2 Spalten.

    Code:
    test=# create table bla(c1 int, c2 int, c3 int, c4 int, c5 int, primary key(c1,c2,c3,c4,c5));
    CREATE TABLE
    test=*# create table bla2 (a1 int, a2 int, a3 int, a4 int, a5 int, foreign key (a1,a2,a3,a4,a5) references bla);
    CREATE TABLE
    Hier sind es sogar 5 Spalten. Werden wir nun alle störben?
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Ich vermute, Dein Problem liegt möglicherweise in dem Gefühl begründet, dass Du nicht sauber modelliert hast.
      Dein Automodell enhält schon selbst den Verweis auf den Hersteller.
      Es macht keinen Sinn, diesen Verweis ebenfalls in der Autoliste aufzunehmen, da er sich aus dem Automodell ergibt.

      Kommentar


      • #4
        Zitat von Perry Staltic Beitrag anzeigen
        Ich vermute, Dein Problem liegt möglicherweise in dem Gefühl begründet, dass Du nicht sauber modelliert hast.
        Dein Automodell enhält schon selbst den Verweis auf den Hersteller.
        Es macht keinen Sinn, diesen Verweis ebenfalls in der Autoliste aufzunehmen, da er sich aus dem Automodell ergibt.
        der Code wurde von Workbench nach meinem Model generiert, für mich macht es eben auch keinen Sinn das ein weiterer FK `Automodel_Autohersteller_id` generiert wird, wenn ich eine 1:m Beziehung zwischen den Tabellen mache. Ist das mein Fehler oder der Fehler von Workbench?
        @akretschmer wo genau ist denn dein Problem? Das ist ein FK mit 2 Spalten.
        Gibt es eine gute Quelle wo man darüber etwas lesen kann, ich verstehe das nich ganz, dass ein FK mehrere Spalten hat?

        Kommentar


        • #5
          stell dir einfach vor, daß die Kombination der N Spalten zusammen den FK bilden, so wie auch die Kombination der N Spalten den PK.
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            Dein Model(eigentlich mit 2 L), wie du es nennst ist halt nicht gut durchdacht. du brauchst doch bloss 2 Tabellen. Modell und Hersteller, wenn ich das richtig sehe.

            Zu "SQL zusammengesetzter Fremdschlüssel" einfach mal eine Suchmaschine bedienen.

            Kommentar


            • #7
              @akretschmer stell dir einfach vor, daß die Kombination der N Spalten zusammen den FK bilden.
              Ich kann also nicht, wenn ich den den einen Teil des FK `Automodel_id` direkt auf anderen Teil des FK `Automodel_Autohersteller_id` schließen, weil der FK zusammengesetzt ist?


              Zitat von protestix Beitrag anzeigen
              Dein Model(eigentlich mit 2 L), wie du es nennst ist halt nicht gut durchdacht. du brauchst doch bloss 2 Tabellen.
              Ich möchte mehrere Listen, aufgrund von Auftragsnummern, erstellen.


              .

              Kommentar


              • #8
                Zitat von andy1975 Beitrag anzeigen
                Ich kann also nicht, wenn ich den den einen Teil des FK `Automodel_id` direkt auf anderen Teil des FK `Automodel_Autohersteller_id` schließen, weil der FK zusammengesetzt ist?
                Gut, wie hättest Du es gern und überleg, was davon Sinn macht.
                Code:
                Autoliste
                .
                > Automodel
                .
                > Autohersteller .
                Autoliste
                .
                > Automodel
                .
                > Autohersteller
                . > Autohersteller
                Autoliste
                . > Automodel . > Autohersteller .
                Zitat von andy1975 Beitrag anzeigen
                Ich möchte mehrere Listen, aufgrund von Auftragsnummern, erstellen.
                Diese Anforderung ist so unspezifisch, da kann man nichts zu sagen.

                Kommentar


                • #9
                  Zitat von Perry Staltic Beitrag anzeigen
                  Diese Anforderung ist so unspezifisch, da kann man nichts zu sagen.
                  Ich wollte das ungefähr so machen,
                  , hatte ich auch geschrieben....
                  Ich möchte mehrere Listen, aufgrund von Auftragsnummern, erstellen.

                  Kommentar


                  • #10
                    Was hat das Erstellen von Listen mit der Datenhaltung zu tun.
                    Das Eine ist, wie du deine Daten ablegst, das Andere, wie du sie auswertest.

                    Kommentar


                    • #11
                      Ok, die bilder-upload links sind bei mir ausgeblendet, hab ich nicht gesehen. Ist auch uncool, sowas in einem Forum externe Links einzusetzen.

                      Aber zum "Problem":
                      Was bitte soll der doppelte FK, der ja meiner 2. Darstellung entspricht?
                      Und nur zur Klarheit, das ist kein FK mit 2 Spalten, sondern es sind 2 FK.

                      Die Aussage, das hat das Tool so gemacht, bringt auch nicht viel. Denn es geht weder um das Toolergebnis, noch um die Vielzahl der Möglichkeiten, sondern um Deine Anforderung. Schreib die doch mal auf, so richtig, mit (Deinen eigenen) Worten.

                      Ein Screenshot mit dem Auftragsnummer -Kästchen ist auch keine Erklärung Deines Vorhabens. Ob mehrere Listen haben willst oder nur eine, und dass Du weiterhin offen lässt, was für Dich eine Liste ist und ob Du es mehrfach schreibst oder nicht, macht Dein Anliegen nicht transparenter.

                      Kommentar


                      • #12
                        Zitat von Perry Staltic Beitrag anzeigen
                        Ok, die bilder-upload links sind bei mir ausgeblendet, hab ich nicht gesehen. Ist auch uncool, sowas in einem Forum externe Links einzusetzen.

                        Aber zum "Problem":
                        Was bitte soll der doppelte FK, der ja meiner 2. Darstellung entspricht?
                        Und nur zur Klarheit, das ist kein FK mit 2 Spalten, sondern es sind 2 FK.
                        Ok, habe die Hochladefunktion hier gefunden.
                        Code:
                         
                         FOREIGN KEY (`Automodel_id` , `Automodel_Autohersteller_id`)     REFERENCES `mydb`.`Automodel` (`idAutomodel` , `Autohersteller_id`)
                        Ist das nicht ein zusammengesetzter Foreign Key?

                        Kommentar


                        • #13
                          Ja, ist es.
                          Aber was bringt Dir die Aussage, wenn Du Dich selbst damit rausredest, dass hätte eine Tool so gebaut?


                          Was möchtest DU erreichen?
                          Hilfestellung: Welcher meiner Vorschläge gefällt Dir und warum oder warum nicht?

                          Kommentar

                          Lädt...
                          X