null を回避しながらオプションの関係を表す唯一の方法は、他のいくつかの回答が示唆しているように、別のテーブルを使用することです。次に、特定の個人の行がないことは、その個人に請求書がないことを示します。person_id を主キーまたは一意のキーにすることで、このテーブルと Person テーブルの間に 1 対 1 の関係を強制できます。
CREATE TABLE PersonInvoice (
person_id INT NOT NULL PRIMARY KEY,
invoice_id INT NOT NULL,
FOREIGN KEY (person_id) REFERENCES Person(id),
FOREIGN KEY (invoice_id) REFERENCES Invoice(id)
);
各人が複数の請求書を持つことを許可したい場合は、代わりに主キーを列のペアとして宣言できます。
ただし、この解決策は、NULLを回避するという要件を満たすことです。これは人為的な要件です。NULL は、データ モデルにおいて正当な位置を占めています。
Chris Date のような一部のリレーショナル データベース理論家は、NULL の存在を避けて、NULL の存在がリレーショナル ロジックの厄介な論理異常につながると説明しています。このキャンプでは、上記のように行が存在しない方が、欠落しているデータを表現するのに適しています。
しかし、リレーショナル理論に関する重要な論文を書いた EF Codd を含む他の理論家は、「不明」または「適用外」を意味するプレースホルダーの重要性を認めています。Codd は 1990 年の本の中で、SQL には2 つのプレースホルダーが必要であるとさえ提案しました。
私にとって、特定の方法で NULL を使用したときに見られる異常は、算術でゼロで除算したときに見られる未定義の結果に似ています。解決策は次のとおり です。
しかし、欠落データを表すために 0 や '' (空の文字列) などの非 NULL 値を使用するべきではありません。同様に、通常のスカラー値であるかのように NULL を使用するべきではありません。
NULL については、著書『SQL Antipatterns: Avoiding the Pitfalls of Database Programming 』の「Fear of the Unknown」というタイトルの章で詳しく説明しました。