整数列を使用する場合、値がないことを示すために0
またはNULL
を使用することをお勧めします。
たとえば、テーブルにparent_id
フィールドがあり、特定のエントリに親がない場合、0
またはNULL
を使用しますか?
私は過去に常に0
を使用してきました。なぜなら、私はJava世界から来たからです(1.5以前)整数は常に値を持つ必要がありました。
私は主にパフォーマンスに関して尋ねていますが、どちらが「より正しい」オプションであるかについてあまり心配していません。
2つの理由から、NULL
を使用することをお勧めします。
NULL
は、フィールドに値がないことを意味します。これは、まさにモデル化しようとしているものです。NULL
を使用する必要があります。可能であれば、列をNOT NULLとして宣言します。インデックスをより効果的に使用できるようにし、各値がNULLかどうかをテストするためのオーバーヘッドをなくすことで、SQL操作を高速化します。また、列ごとに1ビットのストレージスペースも節約できます。テーブルに本当にNULL値が必要な場合は、それらを使用してください。すべての列でNULL値を許可するデフォルト設定を避けてください。
「値なし」にNULLを使用することは、文字通り正しいです。 0は整数の値なので、意味があります。 NULL otohは文字通り何もないことを意味するため、値はありません。
パフォーマンスはおそらく無関係ですが、NULLを正しく使用してコーディングする方法を学べば、NULLを使用した方が多少高速になる可能性があります。
これと実際のパフォーマンスの違いを期待するべきではありません
Parent_idの例では、「root」を表すため、0は完全に有効です。ほとんどの場合、論理的に「値なし」にはNULLの方が適しています。
ただし、私が知っているパフォーマンスへの影響はありません。
UNIQUE( id1, id2 )
は、たとえば1, null
を2回許可するため、null値では機能しません。
一方、0、JOIN atable ON this.extID = atable.ID
を使用すると、結合が実行され(結果として行が結合されなくなります)、NULLは無視されます。
とにかく、空の値がNULLと異なる意味を持たない限り、NULLの代わりに常に「空の値」(0や空の文字列など)を使用することをお勧めします
また、クエリを次のように変更します:JOIN atable ON this.extID = atable.id AND extID > 0
は、無駄な結合の実行を防ぎます
0
は、まだ整数列の有効な値です。したがって、NULL
を使用して、その列でnullを許可する必要があります。
また、正の数値のみにinteger
列を使用している場合は、no
値に-1
を使用できます。
parent_id
を使用する0
参照の例では、ID 0
で始まる参照IDがないことを確認するまで問題ありません。
実際に0が値として使用されることを期待していない場合は、NULLの代わりに0を使用できると思います。
たとえば、列が外部キーです。外部キーは通常0で始まるのではなく、1で始まるため、0が値として使用されることを期待しないことを意味します。
次に、0を使用して「No」値の状態を示すことができます。結合で使用しても、他のテーブルのどの列とも一致しません。したがって、NULLと同じ効果があります。
しかし、実際に0が意味を持つ列がある場合。たとえば数量フィールドのように。それとは別に、価値を表現して空にする必要もあります。たとえば、数量がまだ入力されていないことを示します。次に、そのためのNULLが必要です。
それが理にかなっていると思います。