Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

MySQL Zwischentablle mit doppeltem Fremdschlüssel

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Vorbild, 1 Dezember 2015.

  1. Vorbild

    Vorbild Neuer Benutzer

    Guten Tag,

    ich arbeite aktuell mit der MySQL Workbench und einer Google Cloud SQL Datenbank.

    Es handelt sich um eine Messaging Datenbank und soll es die Tabelle User, sowie die Usersubscription(abo) geben. User haben als PK eine userID. Ein User kann einen anderen User abonnieren, wobei mein Problem enstanden ist.
    Die Usersubsciptiontabelle ist eine m:n Tabelle und ich identifiziere den abonnierten, sowie auch den abonnierenden durch die userID. Normalerweiße sollte die Abotabelle ja als Fremdschlüssel die userID übernehmen, aber ich brauche für beide die userID zum identifizieren.

    Hier noch ein Ausschnitt des ERM's und des Schemas. Aktuell gibt es bei mir die subscriberID und die subscribedID, was beide die userID von der Usertabelle sind.

    [​IMG]

    [​IMG]
    Ich hoffe ihr könnt mir helfen, wie ich dieses Problem in meiner Datenbank am besten lösen kann.
    Mfg David
     
  2. Vorbild

    Vorbild Neuer Benutzer

    Ich habe nun ein Diagramm in der Workbench erstellt und wollte fragen, ob das mit der Usersubscription so funktioniert?
    [​IMG]
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Welches Problem? 2 Fremdschlüssel in einer Tabelle auf die selbe Tabelle?

    Code:
    test=# create table t_user(id int primary key, name text);
    CREATE TABLE
    test=*# create table abo(u1 int, u2 int, primary key(u1, u2));
    CREATE TABLE
    test=*# create unique index idx_abo on abo(least(u1,u2),greatest(u1,u2));
    CREATE INDEX
    test=*#
    
    Der Index sorgt noch dafür, daß ein Userpaar (x,y) nicht auch noch als (y,x) gespeichert werden kann. Das ginge aber auch mit einer Check-Condition wie folgt:

    Code:
    test=*# create table abo2(u1 int, u2 int, primary key(u1, u2), check(u1<u2));
    CREATE TABLE
    
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden