RDBの履歴テーブルにdefault値を設定するのは避けよう

こんにちは!kossyです!



さて、今回はRDBの履歴テーブルにdefault値を設定するのは避けよう、という提言を
ブログに残してみたいと思います。


前提

読書管理アプリ見たいなものを想像してください。

読書記録の編集履歴を保存する機能があって、

reading_record
reading_record_histories

というテーブルがある想定

なぜdefault値を設定したらダメなの?

reading_recordテーブルのレコードにUPDATE文が走った場合、
UPDATEが走る前のreading_recordレコードがreading_record_historiesにinsertされるという仕様だったとします。

ここで、もしreading_recordレコードのとあるカラムがnullで、reading_record_historiesのとあるカラムにdefault値が設定されているとします。

この場合、reading_record_historiesはreading_recordのコピーレコード(主キー、created_atとかupdated_atは別)でないといけないのに、
意図しない値が入ることになります。(まぁ普通に実装してればないだろうけど、、、)

なので、「履歴テーブルにdefault値を設定するのは避けよう」という結論に至るわけです。

「普通に実装してれば」と記載しましたが、
reading_recordモデルにきちんとvalidationを貼ったり、default値を設定していれば問題ないと言うことです。




皆さんはどう考えますでしょうか。