null はどのような意味を取りうるかを ANSI/X3/SPARC の中間報告から読み取る

1975 年の ANSI/X3/SPARC の中間報告で述べられている 14 個の null が取りうる意味を確認してみたので, 本記事で共有します.

動機

主に以下の 2 つの動機がありました.

  • リレーショナルデータベース(RDB) の入門書に, null の意味は複数ある, と記述されているが列挙されていなかったため
  • 0 と null の違いについて, 明確にこれを説明できるような資料である可能性があったため

ほとんどの RDB の入門書では null 値に関する記述があります.
私が読んだ RDB の入門書 の null 値に関する説明の中に, 以下のような記述がありました.

データベースでは, 異なった空値の意味は 14 個に及ぶという ANSI/X3/SPARC の中間報告 (1975) もある.

しかし, その 14 個の空値 (null) の意味の列挙はありませんでした.
このように, null の意味が複数あるという記述はあってもそれらの列挙がされている書籍を見たことがなかったので, 調べてみることにしました.

また, 0 と null の違いをわかってもらうのに苦労をするみたいな話をよく聞きます.
例えば, 条件式では 0 も null も False も False として評価されることが多いですが, それらは明確に違うはずです.
そのような点を説明するためには, null とはなんなのかを明確に知ることがスタートではないかと考えたので, null の意味が列挙された資料を読んで見ることにしました.

今回取り上げる資料

INTERIM REPORT ANSI/X3/SPARC 75-02-08

この文書は, データベース管理システムの抽象的なアーキテクチャに関する文書です.
結構分量多いので, 該当箇所しか読んでません.(2 段組 PDF で 140p 超え)
p.55 に manifestation of null として null の 14 個の意味が列挙されています.

manifestation of null

まずは箇条書きにされている内容を見てみます.

– not valid for this individual (e.g., maiden name of male employee)
– valid, but does not yet exist for this individual (e.g., married name of female unmarried employee)
– exists, but not permitted to be logically stored (e.g., religion of this employee)
– exists but not knowable for this individual (e.g., last efficiency rating of an employee who worked for another company)
– exists, but not yet logically stored for this individual (e.g., medical history of newly hired employee)
– logically stored, but subsequently logically deleted
– logically deleted
– logically stored, but not yet available
– available, but undergoing change (may be no longer valid)
– change begun, but new values not yet computed
– change incomplete, committed values are part new, part old, may be inconsistent
– change incomplete, but part new values not yet committed
– change complete, but new values not yet committed
– available, but of suspect validity (unreliable)
– possible failure in conceptual data aquisition
– possible failure in internal data maintenance
– available, but invalid
– not too bad
– too bad
– secured for this class of conceptual data
– secured for this individual object
– secured at this time
– derived from null conceptual data (any of the above)

これらを読み解く上で難しい点は, それぞれの項目ごとで, 実世界と データベース(DB) の概念モデルについて述べているのか, DB の更新と参照が同時に発生する時について述べているのか, DB を含めたアプリケーション全体でのエラーについて述べているのかが異なっている点です.
それらに気をつけて読む必要があります.

ここから, ひとつひとつ確認をしていきますが, それらには私の解釈が多く含まれる点について注意をお願いします.

not valid for this individual (e.g., maiden name of male employee)

最初の 5 項目の null については, 実世界と概念モデルの対応時に生じるものであると考えられます.

実体の項目に値が入ること自体が妥当でない場合の null です.
結婚時に女性が名字を変えるのが一般的な時代において, 男性の旧姓という項目に値が入ることはありません.
(例題が時代錯誤感がありますが 文書が公開されたのは 1975 年であるのでそのまま例題を利用します)
そのため, 男性である”人間”の”旧姓”という項目を参照すると null が返ります.

valid, but does not yet exist for this individual (e.g., married name of female unmarried employee)

実体の項目に値が入ることは妥当であるが, まだ値が入っていない場合の null です.
結婚した場合に, “新姓” という項目に値を入れる場合というのは考えられますが, 未婚の人の “新姓” という項目には値が入らないため null となります.

exists, but not permitted to be logically stored (e.g., religion of this employee)

実世界には存在するが, 論理的に保存することが許されない項目は null となります.
例えば, “社員”の”宗教”という項目には null が入ります.

exists, but not knowable for this individual (e.g., last efficiency rating of an employee who worked for another company)

実世界には存在するが, その実体に対しては知ることができない項目には null が入ります.
例えば, 他社から転職してきた社員の, 前の会社における最新の評価は(おそらく)存在するが, それを知ることはできないために null が格納されます.

exists, but not yet logically stored for this individual (e.g., medical history of newly hired employee)

実世界には存在するが, その実体についてはまだ値が存在していない項目には null が入ります.
例えば, 新入社員の病歴などは, まだ存在していないデータであるため null となります.

logically stored, but subsequently logically deleted

ここからは論理的に生じる null 値です.

値が格納されていたがその後値が削除された場合には, その項目は null となります.

logically deleted

値を削除する操作がなされた場合には, その項目は null となります.
先述の logically stored, but subsequently logically deleted と同じように思いますが, こちらのケースには削除操作前に値が入っていない場合を想定していると考えられます.

裏を返すと, ある項目を参照した際に null が返ってきたことだけでは, その項目に値が入っていたが削除されたのか, そもそも値が入っていなかったのかを区別することはできないと考えられます.

available, but undergoing change (may be no longer invalid)

ここからは, DB を参照した際に null が返ってきた場合について述べられています.

項目が参照可能であるが, 現在更新が実行中である際に, null が返る場合があります.
値が妥当でない場合があります.

この項目については, 加えて以下の 4 つの場合があると述べられています.

  • change begun, but new values not yet computed
    更新は始まっているが, 新しい値が格納されていない場合です.
  • change incomplete, committed values are part new, part old, may be inconsistent
    更新が完了しておらず, 部分的に新しい値が格納されており, DB の内部状態が一貫していない場合です.
  • change incomplete, but part new values not yet committed
    更新が完了しておらず, 一部の新しい値がコミットされていない場合です.
  • change complete, but new values not yet committed
    更新は完了したが, 新しい値がコミットされていない場合です.

この項目の null は一部の DB においてはトランザクション管理のあたりで処理されるものだと考えられます.

available, but suspect validity (unreliable)

null 値が取得されたが, その項目が null であるか疑わしい場合があります.
具体的には, DB 内部でエラーが発生したので, null が生じた可能性があります.
この項目については, 加えて以下の 2 つの場合があると述べられています.

  • possible failure in conceptual data aquisition
    概念データの取得に問題がある可能性があります.
  • possible failure in internal data maintenance
    内部データ保持に問題がある可能性があります.

available, but invalid

null 値が取得されたが, それ自体が妥当でない場合です.
先述の available, but of suspect validity (unreliable) と類似しているが, available, but invalid は妥当でないと断定できる場合です.
この項目には, not too bad と too bad の 2つに分けられているが, 妥当でない値が返された原因の重大度を表していると, 私は解釈しました.

secured for this class of conceptual data

ここからは, 概念モデルの構築時にとりあえず null を入れていると解釈できる場合です.

概念データのために事前に確保された項目に対して, null が入ってる場合です.

secured for this individual object

個々のオブジェクトのために事前に確保された項目に対して, null が入っている場合です.

secured at this time

当面確保された項目に対して, null が入っている場合です.
DB というより, 確保した変数にとりあえず null を入れている場合かなと考えています.

derived from null conceptual data (any of the above)

空である概念データから導出された null です.
存在しないオブジェクトの項目を参照しても結果は null となる, みたいな意味だと推察しました.

まとめ

以上が, ANSI/X3/SPARC の中間報告 (1975) で述べられている null が取りうる意味です.
一部の項目については DB 固有のものもありましたが, null が取りうる意味を知るには十分すぎる内容なのではないかと考えます.

日本語による解釈は私の解釈ですのでご注意ください.

参照

INTERIM REPORT ANSI/X3/SPARC 75-02-08
リレーショナルデータベース入門 第 3 版

あわせて読みたい