DB設計ではどこまで正規化するべきか?
システム開発にあたってDB設計が重要なのは言うまでもないが、設計思想は、設計者やプロジェクトによって千差万別である。
経験上、主な違いは以下の3点である。
- 正規化の徹底さ
- データ型の厳密さ
- 予備項目の有無
まず、正規化について。
今回は、正規化の是非について自分なり考えをまとめようと思う。
正規化をどこまで徹底するかは、DBと画面、どちらを中心に設計時しているかだと思っている。
DBを中心に設計している場合は、しっかり正規化していることが多い。一方、画面を中心に設計している場合は、正規化されておらず、画面の項目がテーブルのカラムと一対一で対応していることが多い。ちなみに、個人的には、前者がシステム設計のあるべき姿だと考えている。なぜなら、DBを中心に設計すると処理がシンプルになるからである。
たとえば、insert時にデフォルト値を気にする必要もないし、update時に同一のカラムを一括で更新する必要もないし、select時にdistinctする必要もない。また、性能問題の解決のために無駄にindexを作成する必要もない。正規化されていないテーブルをチューニングしていると、indexで正規化をしているような感覚に陥ることがある。
システム設計とは、ユーザー⇔アプリケーション、アプリケーション⇔DBのインターフェースを設計することに等しい。つまり、ユーザーとDBは直接メッセージをやり取りをしない。UIとDBは分けて考えるべきなのである。