kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

データベースで正規化しない正しさ

正規化をしないですっきりするケースに出会ったので、一時の感情で書いてみます。

とある勤怠マスタのテーブル

ユーザーごとに勤怠時間が違い、曜日ごとに勤務時間も違う。一日に複数の勤務時間が発生する場合もある。

正規化した場合のcolumn

user_id, week, start_time, end_time

正規化しない場合のcolumn

user, mon_work_times, tue_work_times, wed_work_times, thu_work_times, fri_work_times, sat_work_times, sun_work_times

work_timesのデータは「,」区切りでstart_time, end_time , start_time, end_time, ....の形式で保存する。

どう違う

正規化した場合は行が増える形になる。1ユーザーで7行や14行のデータになったりするが、正規化しない場合は1行でいい。

データを更新する場合、正規化したデータは、同じデータの判断が難しくdelete, insertで行うことになるだろう。正規化しない場合はuser_idで一つのデータとわかっているため、更新になるだろう。

正規化した場合は時間による検索がDBで簡単にできるが、正規化しない場合はアプリケーションによる判断が必要になるだろう。

検索が重要でない場合、正規化しない場合の方が圧倒的にスッキリした作りでDBのパフォーマンスが良さそうに感じる。

まとめ

自分でつくった後に移行データをみた結果、正規化しない方がいいじゃん。と感じてしまったために書いた記事になります。

最近は正規化しすぎて複雑なアプリケーションを作ることが多く、悩んでいたところでシンプルな作りを見てさらに凹んでおります。

正規化して困るケースはあるけど、正規化しないで困るケースって意外と少ない気がします。テーブルのカラム追加とかロックがかかる場合には別れているケースがありがたい。

まぁ、見極めが難しい問題ですが、経験ということで次に活かしましょうか。