データベース スキーマ
私はこのフィールドを持っています:
- タイトル (文字列)
- 字幕
- 説明 (文字列)
デフォルト値を空の文字列 ''またはNULLとして設定したほうがよいですか?
読み取り/書き込みおよびサイズ ストレージのパフォーマンスを向上させるため
データベース スキーマ
私はこのフィールドを持っています:
デフォルト値を空の文字列 ''またはNULLとして設定したほうがよいですか?
読み取り/書き込みおよびサイズ ストレージのパフォーマンスを向上させるため
通常の契約は次のとおりです。
NULL
「情報がありません」という意味です。''
「利用可能な情報があります。それはただ空です」を意味します。この点を超えて、NULL
SQL だけでなく、あらゆる言語での発明以来、多くの哲学的議論があります。
ここでの唯一の技術的なポイントは次のとおりです。PostgreSQL ではNULL
、長さゼロの文字列よりも効率的に格納できます。あなたの場合、それが本当に重要かどうかはわかりません。
リレーショナル データ モデルの作成者/発見者 ( Dr. Codd )と提携したChris (CJ) Date博士は、「いいえ、NULL を使用しないでください」と明言しています。多くの議論については、彼の著書A Guide To The SQL Standard を読んでください。
彼は、他の専門家とともに、理論的および実際的な問題の両方について、NULL はあまりにも多くのリスク、混乱、および問題をもたらし、価値があるとは言えないと主張しています。
解決:
NOT NULL
。DEFAULT
。テキスト型の列の場合、デフォルト値は空の文字列 ('') の場合があります。または、デフォルトは、ニーズに応じて「EMPTY」や「NOT-AVAILABLE」など、任意に選択して一貫して使用する特定の文言である場合があります。一部の列では、デフォルトが必要ない場合があります。つまり、ユーザー/アプリが値を提供しなかった場合、レコードの挿入または更新を拒否する必要があります。上記は良いルールであり、私はそれを習慣的に守っています。ただし、すべてのルールには例外があります。非常にまれなケースですが、NULL を許可する例外を設けました。
例外の例:数百万行のテーブルでXML データ型を使用する場合のPostgres。値がまだ記録されていない行 (欠損値) を繰り返し検索する必要があります。Postgres は有効な XML のみを格納するというルールを適用し、空の文字列は有効な XML ドキュメントではないため、空の文字列を格納することはできません。したがって、その XML 列で NULL を許可します。
データを含まない最小限の XML ドキュメントを保存できると思うかもしれません。しかし、記録されたデータのある行とない行を区別するために、効率的にインデックスを付ける方法がわかりません。NULL にインデックスを作成できます。
これについてはほとんどがすでに述べられていますが、NULL を使用するか "" を "値なし" として使用するか (簡単に言えば) が 50/50 であると最終的に考える場合、考慮すべきことがもう 1 つあります。
列に負の条件がある場合、MySQL 値 NULL は「キャッチ」されません。例えば。
where column != 'text'
「列」に値「テキスト」がない行のみが返されますが、「列」が NULL の行は検索されません。これらの行も検索する場合は、次を使用する必要があります。
where column != 'text' OR column IS NULL
私自身はまだ NULL を使用し、空の文字列を保存する前に nil に変更することを好みます。データベースでは「空の値」が常に NULL であることを知っておくとよいと思います。
一方、「値なし」(NULL) と「空の値」("") の違いを利用したい場合もあります。しかし、一部のアプリケーションでそのような状況が発生したことはありません-まだ.
空の文字列でも値であるため、列に値がないことを示すには、常にNULLを使用する必要があります。
「null」と空の文字列の値がアプリケーションで別の意味を持っているのか、それとも単に「データなし」を意味しているのかを判断する必要があります。後者の場合は、一般的には単なる好みの問題ですが、結果を考慮する必要があります。特定のフィールドに「null」値と空の値を混在させないようにしてください。
一般に、「null」は「データなし」のより適切な概念を提供しますが、空の文字列と比較して、アプリケーションで使用するのはやや面倒です。しかし、null の代わりに空の文字列を使用すると、時期尚早の最適化と見なされる可能性があり、将来のある時点で、null と空の文字列を区別する必要がある機能を導入できなくなる可能性があります。
一方、文字列列に null を格納せず、空の文字列だけを格納する DBMS があります。私はnullを使用しますが、確立され文書化された契約(つまり、「このフィールドにはnullが含まれることはありません。空のタイトルはタイトルがないことを意味し、列にNOT NULL制約が適用されます」)が一貫して守られているため、好きなアプローチを取ることができます。
パフォーマンスに関心がある場合は、使用している DBMS のドキュメントを読み、自分でテストを行う必要があります。空の値が非常に頻繁に発生すると予想される場合は、「スパース列」が役立つかどうかを確認できます。一部の DBMS では、頻繁に発生する null 値を効率的に格納する手段としてこれらを導入していますが、通常、一般的な (通常は大きくありません) null 以外の値を取得する際のパフォーマンスの低下、またはこのようなもの。
そしてもちろん、クライアントが何を期待しているかを考慮に入れる必要があります。ただし、クライアントがまだアクセスしていないデータベースを作成する場合は、適切に決定して文書化する必要があります。
これはあなたのケースに厳密には当てはまりませんが、完全を期すために言及します.NULL外部キーは強制されません.
他のテーブルを参照する外部キーであるフィールドがある場合、NULL 以外の値が含まれているforeign_id
場合にのみ適用されます。foreign_id
ところで、Oracleは空の文字列を NULL として格納します。VARCHAR2 は引き続きそのように動作することが保証されていますが、VARCHAR は (いつか) SQL 標準に準拠し、空の文字列と NULL を区別するように変更される可能性があります。(私が知っている) 他の DBMS は、その区別をしています。
データが不明または適用できない場合にのみ、Null 値を使用してください。それ以外の場合はすべて、NULL 値を含むデータのクエリを作成するときに特別な考慮事項が必要になるため、""(空の値) を使用しますが、これはしばしば困難です。
場合によります。値が空であることを知っていますか? 例: ミドルネームのイニシャルがないことが知られている人。
それとも単に知らないだけですか?例: 「ミドル イニシャル」フィールドが空白のままになっているフォームを受け取りました。