DB設計におけるNULLについて

#DB

NULLとは

「値が存在しない」または「値が不明」ということを示す。

値ではないため値のように比較できない。

空集合(要素が0個の集合)ではなく、存在しない集合と見なされる。

リレーショナルモデルに反するNULL

リレーショナルモデルは閉世界仮説(真であると判明しないものは全て偽であると仮定すること)に基づいており、NULLはこれに反する。

リレーショナルモデルでは2値論理が元となっているため、真と偽以外が存在する3値論理は受け入れがたい。

NULLの影響

  • NULLは演算しても文字列操作をしてもNULL
  • 意図しないSELECT結果を得る可能性
    • NULLの扱いをどう解釈するかによってクエリが変わる
  • 3値論理(TRUE, FALSE, Unknown)をもたらす
    • SQLが複雑化する
  • オプティマイザへの悪影響
    • NULLが存在するとオプティマイザの計算に影響する
      • 最適なパフォーマンスを発揮するクエリへの書き換えや、クエリのコスト見積もりに悪影響する

NULLの対策

  • テーブル正規化
    • 正規化を進めることでカラムをNOT NULLとする
      • NOT NULLを定義しつつも、NULLと同義になるようなデフォルト値を用いることは避ける
  • COALESCE関数の使用
    • 指定したカラムがNULLのときのデフォルト値を設定できる関数
      • IFNULLもあるが、IFNULLはSQL標準ではない
    • SQLの評価結果によりNULLになってしまうパターン(ex. SUMやAVGなどの集計関数の実行結果やOUTER JOINの結果、NULLIFの評価結果など)で有効に使える

空文字とNULL

空文字は長さが0で、存在する文字列であるの対し、NULLは存在しない集合であり、両者は区別されるものである。

NULLを許容するケース

リレーショナルモデルに合わないデータを扱う場合は許容しても良いと考えられる。

参考