ブール値のデータベースフィールドにNullとしてFalseを格納する必要がありますか?


20

Userというテーブルにブールフィールドを持つアプリケーションがあるとしましょうInactive

falseをnullとして保存するだけで本質的に問題はありますか?もしそうなら、あなたはマイナス面がどうあるべきかを説明できますか?これについては数か月前に誰かと議論しましたが、アプリ/データベース全体で一貫して行う限り、それは問題ではないことに同意しました。最近、私が知っている誰かが「真実」trueまたはfalse使用されるべきだと強調しましたが、彼らは本当に理由についての説明を本当にしませんでした。


25
ウィキペディアによると、 Null is a special marker used in Structured Query Language (SQL) to indicate that a data value does not exist in the databaseこれは受け入れられている知恵であり、アプリケーションでNullの意味を再定義するべきではありません。それはあなたのコードで作業している他のすべての人にとって混乱するでしょう。
PersonalNexus

10
なぜあなたもこれをしたいのですか?なぜnull不可のビットフィールドを使用し、それがトライステートフィールドと問題を混同するのではなく、あなたが望む行動であればデフォルトをfalseに設定しないのですか?
-JohnFx

5
それが非常に悪い考えである理由の実世界の例: SELECT * FROM foo WHERE bar = FALSEあなたが期待する結果を与えない。
Blrfl

2
ブール値ではなくデフォルトの0を持つint列の使用を検討してください。このように、新しい条件(たとえば、「保留」状態など)が発生した場合、データベース構造を変更する必要はありません。
GrandmasterB

4
しかし、falseをnullとして保存する場合、FILE_NOT_FOUNDをどのように保存しますか?!(thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx
エド・ジェームズ

回答:


51

falseをnullとして保存するだけで本質的に問題はありますか?

はい。

もしそうなら、あなたはマイナス面がどうあるべきかを説明できますか?

NULLはFalseとは異なります。

定義により、NULLを含む比較(およびロジック)は、(Falseではなく)NULLの値を返す必要があります。ただし、SQLの実装はさまざまです。

True and NULL NULL(Falseではない)です。

True and NULL or False NULL(Falseではない)です。

http://en.wikipedia.org/wiki/Null_(SQL)#Three-valued_logic_.283VL.29

http://technet.microsoft.com/en-us/library/cc966426.aspx


3
NULLが値の欠如を表す値である理由に関する簡潔な説明。
maple_shaft

2
私の最初の開発ジョブの最初の日には、この質問/回答のようなエラーのデバッグと修正が含まれていました。回想+1
通徳

1
あなたがリンクしたまさにその記事nullは、がロジックに無関係である場合(whatever OR TRUEまたはの場合のようにwhatever AND FALSE、の値がwhatever条件を変更できない場合)、式は値を返すことに注意してください。最適化ではありません。それはだ3値論理がどのように機能しますか。これらの式に対してUNKNOWN/ NULLを返すことを主張するDBMS は、根本的に壊れています。
-cHao

1
@ S.Lott、しかしfalseの代わりにnullを保存しないでスペースを節約しますか??
アゼラファティ

2
@Bludream:ブール値の場合、null許容フィールドは、DBMSに応じて実際により多くのスペースを取ることができます。(ただし、ほとんどすべての場合、無視できる量です。)ブール値は1ビットで表現できますが、ヌル値を許可するブール値には3つの値(true、false、null)があり、複数のビットが必要です。
cHao 14

15

ブール値フィールドでnullを許可することにより、意図したバイナリ表現(true / false)をトライステート表現(true、false、null)に変換し、「null」エントリを不確定にします。「null」値は適切に「true」でも「false」でもありません。不正確になるように表現を補強しなければならない理由は何ですか?

このようなパターンを決定し、アプリケーション全体で一貫してそれを行っても、それで問題はありません。そのパターンが適切な位置にある理由が新鮮な目では明らかでない状況に陥るか、またはそのパターンが不注意に壊れた状況に陥る可能性が高くなります。


5

他の人が言ったこと。3つの可能な値はブール値ではありません。

ただし、3つの値を正当に必要とする場合があります。(true、false、unknown)など。この場合でも、超正規化を行う場合は、NULL値をまったく許可しません。代わりに、1対1の関係を持つ別のテーブルに真のブール値を格納します。NULL値は、物理的に格納されたNULL値ではなく、「失敗した」外部結合によってクエリで生成される可能性があります。


私のブール質問の範囲外で、nullを使用してtrue false unknownが悪いのはなぜですか?私の質問を超えて、一般的にヌルは避けるべきですか?どうして?
オミヌス

3
@Ominus:純粋主義者なら、一般にヌルは避けるべきです。それらが使用されることを意図されていたように使用された場合(偽の偽物としてではなく「ここには価値がない」としてfalse)、彼らは彼らの場所を持っています。存在しなければ、存在しません。前述のように、代替手段は基本的に、行の主キーと単一のブール値(またはint、varchar、またはあなたが持っているもの)だけを持つ他のテーブル全体を持つことです。それ以外の場合は、nullを許可するすべてのフィールドに対して。関係は純粋ですが、ほとんどの目的には複雑すぎます。
cHao

-3

あるbool?boolean型?いいえそれは型であるブール値です。NULL可能ブール値には、true、false、およびnullの3つの値があります。使用するか、要件に依存します。nullを使用する必要があるかもしれない正当な理由があるかもしれませんが、バイナリのような匂いがしますが、答えがわかりません。上記の例では、Nullable<T>Tboolbool?User.IsActive明確なようです。ユーザーがアクティブかどうか。システムとして、ユーザーがアクティブかどうかを知りたい場合があります。「多分」はないはずです。しかし、機能フラグのようなものについて考えてください。この機能はオンになっていますか?答えは「はい」、「いいえ」、または「不明」です。flagがtrueに設定されている場合にのみボタンを表示するビジネスルールがある場合があります。boolはデフォルトではfalseであると主張するかもしれません。要件の逆:データソースのすべての値をtrueに設定しますか?


2
この投稿は読みにくい(テキストの壁)。ですが、あなたは気編集をより良い形にそれをINGの?
グナット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.