3

以下のデータベース設計をご覧ください。

create table Person (id int identity, InvoiceID int not null) 
create table Invoice (id int identity, date datetime)

現在、すべての人がinvoiceIDie the InvoiceIDisを持っていnot nullます。

データベースを拡張して、一部の人がInvoice. 元の開発者は null を嫌い、決して使用しませんでした。一貫性を保ちたいので、この要件を満たすためにデータベースを拡張するために使用できる他のパターンがあるかどうか疑問に思っています。nullを使用せずにこれにどのようにアプローチできますか?

上記の 2 つの表は、説明のためのものであることに注意してください。これらは実際のテーブルではありません。

4

4 に答える 4

5

NULLは、データベースおよびプログラミング全般において非常に重要な機能です。ゼロやその他の値とは大きく異なります。これは、値がないことを示すために最も一般的に使用されます(ただし、値が不明であることを意味する場合もありますが、解釈としてはあまり使用されません)。一部の人が請求書を持っていない場合は、希望のスキーマと一致するため、本当にNULLを許可する必要があります

于 2012-12-14T19:50:26.307 に答える
3

一般的なパターンは、その関連付けを別のテーブルに格納することです。

個人:ID請求書:ID Assoc:person_id、assoc_id

次に、人が請求書を持っていない場合、あなたは単に列を持っていません。このアプローチでは、人が意味をなす可能性のある複数の請求書IDを持つこともできます。

于 2012-12-14T19:50:24.197 に答える
3

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」というタイトルの章で詳しく説明しました。

于 2012-12-14T20:17:53.247 に答える
1

請求書/個人の関係を別のテーブルに移動する必要があります。あなたはで終わる

create table Person (id int person_identity) 
create table PersonInvoice (id int person_id, InvoiceID int not null)  
create table Invoice (id int identity, date datetime)

一部のデータベースでは、外部キーに NULLS を許可しないため、一部のデータベースでは InvoiceId を外部キーにできるようにする必要があります。

個人が 1 つの請求書しか持てない場合、PersonInvoice は person_id と 2 つの列を合わせて一意の制約を持つことができます。また、invoiceID フィールドに一意の制約を追加することで、請求書の担当者を 1 人にすることを強制することもできます。

于 2012-12-14T19:55:47.340 に答える