2016-03-31 4 views
1

Lets betrachten drei Tabellen hat:Datenbank Tabellenspalte, die mehrere Tabellenfremdschlüssel

1.Companies 
      id 
      company_name 
      ... 
    2. Employees 
      id 
      employee_name 
      ... 
    3. Payment 
      id 
      pay_by 
      pay_to 
      ... 

Das Problem ist jetzt hier pay_to ID eines Unternehmens sein kann oder Mitarbeiter (fk). Also habe ich eine boolesche Spalte "is_company" in der Zahlungstabelle hinzugefügt. Also meine Lösung ist, wenn is_company True ist, dann ist seine Firma sonst ihr Angestellter.

Aber ich bin nicht mit dieser Lösung zufrieden. Ich meine, ich möchte keine Spalte mit einem Fremdschlüssel für mehrere Tabellen haben. Ich denke, dass es eine bessere Lösung gibt, aber ich konnte das nicht finden. Bitte helfen Sie, eine bessere Lösung zu finden. Danke im Voraus.

Antwort

2

Sie könnten, je nachdem, was Sie verwenden, um mit der Datenbank zu interagieren, pay_to mit einem Buchstaben voranstellen, e für Mitarbeiter oder c für Unternehmen, dann können Sie nicht angeben, dass das Feld ein int usw. ist, was zu Problemen führen kann .

Eine Alternative ist, verschiedene Bereiche zu verwenden (dies würde natürlich die Anzahl von jedem begrenzen, die Sie haben könnten), aber Sie könnten sagen, 0-9999999 ist Mitarbeiter und 10000000+ ist Firmen-IDs. Eine andere Alternative wäre eine Zwischentabelle (die Zahlungsempfänger genannt werden), in der pay_to auf eine Zeile in dieser Tabelle verweist, die Ihnen einen Zahlungsempfängertyp und dann die ID des Zahlungsempfängers in ihrer jeweiligen Tabelle angibt. --EDIT-- Sie könnten eine Tabelle namens payees mit Spalten wie payee_id, payee_type, id erstellen. payee_id wäre eine Spalte für automatisches Inkrement, auf die Sie dann im Feld payment.pay_to verweisen würden. payee_type wäre firma/angestellter und id würde je nach typ entweder company.id oder employee.id sein. Es würde bedeuten, 2 Abfragen zu verwenden, anstatt einen Join zu verwenden, aber das gilt für alle Möglichkeiten, es sei denn, Sie könnten Unternehmen und Mitarbeiter in einer Tabelle zusammenfassen - dies hängt von den anderen Spalten ab, die über Ihre ursprüngliche Frage hinausgehen.

Keines von ihnen ist notwendigerweise elegant (und dort können und wahrscheinlich sind andere) Lösungen, aber sie würden die 3 sein, die ich betrachten würde, in Ihrer Situation verwendend!

+0

Danke für Ihre Antwort. Aber ich bin verwirrt über den Zwischentisch. Es scheint dasselbe zu sein, was ich schon getan habe. Kannst du es bitte mehr beschreiben. –

+0

@SunnoSakib - Ich habe eine Bearbeitung hinzugefügt, um mehr zu erklären, was ich meinte - lassen Sie mich wissen, ob es überhaupt noch unklar ist. –

0

um auf das, was Ed Wade sagte, können Sie alle companies mit einem 1 und alle employees mit einem 2 voranstellen. Dies würde helfen, das Feld als eine ganze Zahl zu halten, während die Anzahl nicht begrenzt wird, die Sie speichern konnten