🐥

NOT NULL制約を解除する vs デフォルト値("")を設定する

2025/01/08に公開

状況

  • 元々NOT NULL制約のあるカラムを設定していたテーブルで、バリデーションの解除をクライアントから依頼され、解除に伴いNOT NULL制約を解除する必要が出てきた。(こういう状況直面されている方多いんでしょうね、、)
  • その際に、方法としてマイグレして解除するだけでなく、別の方法があることを学んだので、学びとして残しておきます。

方法

  1. NOT NULL制約解除
    カラムからNOT NULL制約を外す為、changeマイグレーションを実施。
    その後、必須ではなくなったフィールドがnilでも記事が正しく保存されるかをテスト
    # 例
    class ChangeNotNullConstraintsInHoge < ActiveRecord::Migration
      def change
       change_column_null :hoge, :description, true
      end
    end
    
  2. デフォルト値設定
    before_saveコールバックでset_default_valuesメソッドを追加
    NOT NULL制約のあるカラムにデフォルト値を設定
    # 例
    before_save :set_default_values
    ~~~
    def set_default_values
      self.description ||= ""
    end
    

比較表

NOT NULL制約解除 デフォルト値設定
メリット - 柔軟性が高い
- データベースエラーが発生しない
- コードの可読性向上
- データの一貫性を保つ
- データベース設計が堅牢
- 既存ロジックへの影響が少ない
デメリット - データの一貫性が失われる可能性
- デフォルト値がないため扱いが煩雑
- 意味のないデータが増える可能性
- 柔軟性が低下する
- データベースの負担

どちらを選ぶべきか?

NOT NULL制約を解除するべきケース

  • データの柔軟性が重要であり、必須項目をアプリケーション側で管理するのが望ましい場合。
  • 必須でないフィールドが多い場合や、将来的に必須・非必須の要件が変わる可能性が高い場合。

デフォルト値を設定するべきケース

  • データの一貫性を保つことが最優先の場合。
  • 他システムやデータ分析で、NULLが問題になるケースを防ぎたい場合。
  • 意図的なデフォルト値(例:初期表示用の空文字列やデフォルト画像など)が有益な場合。

所見

今回はどちらかの選択だったが、実際は、どちらも合わせて利用するってこともあるのだろうか、、

Discussion