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を許容するケース

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

    参考


    関連書籍