T字形ER手法でnullを認めない理由(2)

ここでは3値論理のアウトラインを書いて、前回の課題のうち「maybe, unknown, undefined とはどういう意味の値か」だけ解決する。

3値論理

SQLでは、nullは3値論理で扱われる。3値の真理値表は以下の通り。

NOT

not
true false
null null
false true

AND

true null false
true true null false
null null null false
false false false false

OR

true null false
true true true true
null true null null
false true null false

nullがらみの論理演算結果、例えば

  • nullの否定はnull.
  • true AND null は null.
  • true OR null はtrue.

などは「直感的ではない」とか言われることがあるみたいだが、そんなことはない。
nullとは「trueかもしれないし、falseかもしれない」という意味と考えれば直感的に理解できる。
「データベース設計論」にある "maybe" は、この「trueかもしれないし、falseかもしれない」という意味。
maybeの何がいけないのかというと、

  1. プログラマがうっかり2値のつもりで書いたコードがバグになる
  2. プログラマが期待する null の意味には「値がわからない」「値がありえない」の2つがあるが、3値論理が表現しているのは「値がわからない」の方だけ

という2つの問題があるから。


1.は、テーブル定義には not null を付けなさい、という話でよく言われること。
例えば3値論理の世界では排中律が使えない。詳細は次回。


2.について。
わざとらしい例だが、社員マスタ上に所属部門コードがあるとする*1

社員マスタ(R)={ 社員コード, 社員名, 所属部門コード, ... }

このテーブルに、社長と、配属未定の新入社員のレコードを収容するとすれば、両方とも所属部門コードはnullになる。
が、新入社員の所属部門のnullは「未定」という意味なのに対して、社長の所属部門のnullは「ありえない」という意味。つまり、同じ null でも意味が違う。
このデータベースに対して、新人の配属先を考えるために配属未定の社員一覧を問い合わせたら、社長もリストアップされてしまうが、これはクエリの発行者が期待していることではない。そこで「未定」と「ありえない」を区別してアクセスできるようにしようという発想が出てくる。

前掲書P-80にある unknown・undefinedというのは、上記の2つのnullの意味に対応している。

  • 新入社員の所属部門 ... unknown
  • 社長の所属部門 ... undefined

次回予定

次回はSQLが算術演算・比較演算でnullをどのように扱うかを整理する。
これについては、ホスト言語からの類推で null をゼロや空文字列のようなものと見なす説明をよく見かけるが*2、これは多分違います。
続く。

*1:もちろん、そんなものを置いてはいけません

*2:例えば、受注金額にnullが混入している場合sum(受注金額)もnullになってしまうことを「残念。1日の売上がぜんぶ消えてしまいました」みたいに説明するとか。nullは「100万円かもしれないし、1億円かもしれない」という意味なのだから、売上は消えたわけではない