19
Customers
 customer_id

Orders
 order_id
 customer_id fk

2 つのテーブルがあり、Orders テーブルの customer_id に外部キーを定義した場合、null を許可することで、関連付けられた顧客を持たない注文を持つことができると言っています。そのため、null 許容外部キーの概念は、この制約を強制するという外部キーの目的と矛盾しているように見えます。

null 許容の外部キーが必要になる状況の簡単な例はありますか? それとも、それらを許可することを支持する議論ですか?

4

8 に答える 8

49

チームの TODO を保持するテーブルを想像してみてください。TODO がまだチームのメンバーに割り当てられていない場合、その TODO はuser_idですNULL。そうでない場合は、テーブルNULLへの外部キーです。users

于 2009-05-29T09:47:58.980 に答える
16

いいえ、null 可能な外部キーは必要ありません。

オプションの 1 対多の関係はいつでも正規化できます。あなたの例を挙げると、次のテーブルがあるかもしれません:

Customers: customer_id, ...
Orders: order_id, ...
OrdersCustomers: order_id, customer_id
  UNIQUE(order_id)

2 つの一意の制約により、1 つの注文が 1 人の顧客だけに属することができ、同じ顧客に 2 回属することはありません。

そのような関係を常に正規化する必要があるかどうかは、別の話です。場合によっては、非正規化によって実装がより単純になることがあります。

于 2009-05-29T09:58:00.863 に答える
5

そのため、null 許容外部キーの概念は、この制約を強制するという外部キーの目的と矛盾しているように見えます。

外部キーの目的は、Orders テーブルのランダムな整数が実際には Customers テーブルの項目を参照するという概念を明示することです。実際にそれを制約として強制することは付随的です。

于 2009-05-29T09:58:50.800 に答える
3

外部キーをnullableまたはnullに設定するには、以下のSQLスクリプトを使用します

ALTER TABLE Return_COMMENTS MODIFY order_ID Number NULL;
于 2011-01-06T10:14:30.950 に答える
1

それ自体に関連するツリー構造、テーブルを作成します。このことを考慮:

table_node(node_id, parent_node_id, name)

ルートの場合、parent_node_id は null である必要があります。

于 2011-11-09T02:24:06.920 に答える
0

私たちのアプリケーションはイベントの基本的な情報から始まり、時間の経過とともにイベントがより完全に計画されるにつれて、より多くの情報が追加されるため、これらのものがたくさんあります。ただし、情報を追加するときは、FK制約を満たしていることを確認する必要があります。FKはデータの整合性を保つためのものですが、最初のデータが挿入された時点ですべてのデータが常にわかっているわけではないため、nullを使用できます。

于 2011-01-05T18:55:55.163 に答える
0

私が考えることができる別の状況があります:

1 つのテーブル内に、そのレコードを一意に識別する ID フィールドがあります。その同じレコードには、単一の親がある場合とない場合があります。

次の列を含むテーブル:

  • 整数としての id、自動インクリメント、null 非許容
  • null 許容の整数としての parentid。

外部キー制約を使用すると、フィールドが null でない場合に、有効な親を参照することを保証できます。さらに、子を修正せずに親レコードを削除しようとすると、親を削除できません。

于 2013-07-31T00:35:32.027 に答える
0

列を null に設定する一般的な設計シナリオは、1 対多の親子関係があり、子が存在する必要がない場合です。

親レコード (アカウントなど) に削除可能な子レコード (ヘルプ要求など) がある場合、これは適切な使用方法です。

最新のヘルプ リクエストの ID を含む MostRecentRequest の列がある場合があります。要求がシステムから削除されると、MostRecentRequest 列は NULL に設定され、存在しないことを意味します。

もう 1 つの例は、行にまだ親が割り当てられていないことを NULL で意味する場合です。おそらく、受信したヘルプ リクエストがあり、技術者フィールドの NULL は、そのリクエストに技術者が割り当てられていないことを意味します。その技術者を削除するとき、値を NULL にリセットすることによって、未完了の作業をすべてプールに戻す必要があります。

于 2009-07-11T04:53:42.267 に答える