2010-05-10 7 views
13

Kann ich eine Spalte in meiner Wertetabelle (Wert) als Fremdschlüssel zu knownValues ​​Tabelle Bezug genommen wird, und lassen Sie es NULL sein, wenn nötig, wie im Beispiel:Fremdschlüssel und NULL in mySQL

Tabelle: Werte

product  type  value  freevalue 
0   1  NULL  100 
1   2  NULL  25 
3   3  1   NULL 

Tabelle: Typen

id name  prefix 
0  length cm 
1  weight kg 
2  fruit NULL 

Tabelle: knownValues ​​

id Type  name 
0  2  banana 

Hinweis: Die Typen in der Tabelle values & knownValues sind natürlich in der Tabelle types referenziert.

Antwort

17

NULL in Fremdschlüsseln sind absolut akzeptabel. Der Umgang mit NULL in Fremdschlüsseln ist schwierig, aber das bedeutet nicht, dass Sie solche Spalten in NOT NULL ändern und Dummy-Datensätze ("N/A", "Unbekannt", "Kein Wert" usw.) in Ihre Referenztabellen einfügen.

Wenn Sie NULL in Fremdschlüsseln verwenden, müssen Sie häufig LINKE/RECHTE JOIN anstelle von INNER JOIN verwenden.

+3

Die Verwendung von INNER Join oder einer Art OUTER Join hängt von den Ergebnissen ab, die Sie suchen. Es gibt Zeiten, in denen ein INNER-Join genau die gewünschte Antwort liefert. –

+1

Ja, und in Fällen, in denen Sie Zeilen mit NULL in FK haben, werden Sie * alle * Zeilen mit einem inneren Join nicht finden; aber mit einer äußeren Verbindung. –

+1

irgendwelche Beispiele? Dies funktioniert nicht für mich mit InnoDB Storage Engine - MySQL – dev

3

Dies ist eine 1 zu Null-zu-viele-Beziehung. Ich habe das oft mit SQL Server verwendet. Ich glaube, dass dies auch mit MySQL möglich ist.

Ich bevorzuge es, NULLs in meinen Datenbanken zu vermeiden, wegen Problemen im Zusammenhang mit Datenaggregation, so dass ich je nach Design eine UNBEKANNTE Zeile in die Lookup-Tabelle lege.

+4

Hallo Raj! Wie meinst du das mit "UNBEKANNTE Reihe"? – Industrial

1

Ja, es ist durchaus möglich, einen NULL in Ihrer Spalte mit Fremdschlüsselbeschränkung zu haben. Ich habe es gerade ausprobiert. Beachten Sie, dass Ihre Fremdschlüsseleinschränkungen sowieso ignoriert werden, wenn Sie nicht die InnoDB-Speicher-Engine verwenden.

+0

Mit InnoDB natürlich! – Industrial

4

Obwohl Sie Fremdschlüssel-Spalten nULL-fähig machen können, würde ich vorschlagen, dass es im Allgemeinen besser ist, Tabellen ohne Nullable-Fremdschlüssel zu entwerfen. Nullen führen unweigerlich zu bestimmten Mehrdeutigkeiten und falschen Ergebnissen, aber das ist ein doppeltes Problem, wenn erwartet wird, dass die fraglichen Spalten einer Beschränkung unterliegen.

+1

Hallo David, wie würdest du das machen? Eine zusätzliche Tabelle nur für Freitext-Werte? – Industrial

+1

Ja, es in eine andere Tabelle zu legen, ist der offensichtliche Weg, dies zu tun. Wenn Sie Fakten in Tabellen mit den richtigen Attributen darstellen, müssen Sie keine Nullen für Attribute verwenden, die nicht zutreffen. Fügen Sie dem Modell nur dann Nullen hinzu, wo ein besonderer Vorteil besteht oder wo Sie durch eine Software-Beschränkung gezwungen werden. – sqlvogel

1

Natürlich gibt es eine Möglichkeit ti NULL-Werte in Fremdschlüssel, aber dafür machen Sie sich keine Sorgen, ich hoffe, Sie können InnoDB als Datenbank-Engine verwendet, um die Key-Einschränkungen zu verwalten. Für diesen Fall schlage ich vor, dass Sie Links verbinden oder Rechts verbinden verwenden, um Zeilen von DB zu erhalten, und Group By kann verwendet werden, um Doppelungen zu vermeiden. Bitte benutze kein Inner Join.