2010-08-01 8 views
17

Die übliche Methode zum Festlegen einer Fremdschlüsseleinschränkung besteht darin, auszuwählen, auf welche Tabelle der Fremdschlüssel zeigen soll.Fremdschlüssel zu einem von vielen Tischen?

Ich habe eine polymorphe Beziehung zwischen 1 Tabelle und einem Satz von Tabelle.

Das bedeutet, dass diese Tabelle eine Beziehung mit einer dieser Tabellen in der Menge haben wird.

z.

images: person_id, person_type 
subordinates: id, col1, col2...col9 
products: id, colA, colB...colZ 

Im obigen Beispiel, wenn person_type „Untergebenen“ ist, dann sollte person_id ein Fremdschlüssel subordinates.id und das gleiche gilt mit Produkten.

Also frage ich mich, ist es möglich, einen Fremdschlüssel zu einem von vielen Tabellen zu haben, oder müssen Sie speziell festlegen, auf welche Tabelle es zeigt, wenn Sie einen zuweisen.

Diese Frage gilt für MySQL und PostgreSQL.

Dank

+0

[Sie können dies in Yii Rahmen tun] (http://www.yiiframework.com/forum/index.php/topic/20018-conditional-relation) – Alireza

Antwort

41
+3

wow ... wie hast du es geschafft, all diese zu finden Links +1! –

+9

Suche nach Benutzer-ID und nach Tag: 'user: 20860 [polymorphic-associations]' –

2

Ein Fremdschlüssel per Definition entweder ein Primar- oder candidate- Schlüssel auf eine-und-nur-ein-Tabelle zeigen muss - ist Primar- nur in einem verfügbaren typischen DBMS. Sie sind besser dran mit einer einzigen "Person" -Tabelle und haben Tabellen, die dazu in Beziehung stehen, z. Managerinformationen.

1

Eine Spalte ist nur ein Platzhalter für einen Wert. Eine Fremdschlüsseleinschränkung bedeutet, dass die in dieser Spalte gespeicherten Daten nur ein Wert sein können, der mit der Spalte der Tabelle übereinstimmt, die in der Einschränkung definiert ist. Fremdschlüsseleinschränkungen gelten pro Tabelle ...

Es gibt nichts, was Sie davon abhält, mehrere Fremdschlüsseleinschränkungen für eine Spalte zu definieren. Dies bedeutet jedoch, dass der einzige Wert, der gespeichert werden darf, Werte sind, die bereits in allen anderen fremden Tabellen vorhanden sind. IE: TABLE_1 hat die Werte 1 und 2, TABLE_2 hat die Werte 2 und 3 - TABLE_3 hat Fremdschlüsselbeziehungen zu den Tabellen 1 & 2 in der Spalte col von TABLE_3 ... Der einzige gültige Wert, den ich in TABLE_3.col einfügen kann, ist 2, weil er beide enthält Tabellen (unter der Annahme, col ist nicht NULL).

1

Ein Fremdschlüssel kann immer nur auf eine einzelne Tabelle verweisen.

Es sieht für mich so aus, als ob Sie hier wirklich eine Eltern-ID in Ihrer Personentabelle erstellen wollten. Die Untergebenen hätten eine Eltern-ID, die auf ihre Manager zeigt. Wenn ein Untergebener mehrere Manager haben müsste, könnte eine separate Verbindungstabelle mit 2 Spalten erstellt werden, die jeweils eine Personen-ID enthalten, wobei eine die untergeordnete und die andere einer der Manager ist.

Wenn Sie einschränken wollten, wer dem Feld parentid zugewiesen werden konnte, könnte dies mit einer Check-Einschränkung erfolgen.

+0

MySQL hat CHECK-Einschränkungen, erzwingt sie aber nicht. Was Sie beschreiben, ist immer noch eine Fremdschlüsselbeziehung, nur zur selben Tabelle - was normalerweise bedeutet, rekursive/hierarchische Abfragen zu benötigen, die MySQL nicht hat (PostgreSQL 8.x). –

+0

Das war nicht das, was ich tun wollte, ich war mir nicht so klar darüber, was ich meinte. Sehen Sie sich meine aktualisierten Tabellen und Spalten an und Sie werden verstehen, wonach ich suche. –

+0

So sehr wie ich diese Art von Antwort verabscheue ich bekomme definitiv das Gefühl von "was du willst ist falsch" hier. Ich denke @ Bill Karwin hat die richtige Idee. – Mykroft

Verwandte Themen