🐥
NOT NULL制約を解除する vs デフォルト値("")を設定する
状況
- 元々NOT NULL制約のあるカラムを設定していたテーブルで、バリデーションの解除をクライアントから依頼され、解除に伴いNOT NULL制約を解除する必要が出てきた。(こういう状況直面されている方多いんでしょうね、、)
- その際に、方法としてマイグレして解除するだけでなく、別の方法があることを学んだので、学びとして残しておきます。
方法
- NOT NULL制約解除
カラムからNOT NULL制約を外す為、changeマイグレーションを実施。
その後、必須ではなくなったフィールドがnilでも記事が正しく保存されるかをテスト# 例 class ChangeNotNullConstraintsInHoge < ActiveRecord::Migration def change change_column_null :hoge, :description, true end end
- デフォルト値設定
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