データベースを勉強する機会があると、必ずデータの正規化について学びます。 正規化とはデータの冗長性を排除したりデータのメンテナンス性を高める設計手法で、かつては高価だった記憶装置の使用コストを削減する目的もありました。またインデックスの効果が得られやすいので、統計やリレーションに使用する項目を正規化(コード化)しておくことでアプリケーションのパフォーマンスを上げることもできます。

 しかしこれを"教科書通り"に行うと開発の生産性を低下させたり、まったく費用対効果が得られないケースが多くあります。

例えばアンケート(性別、都道府県、職業、氏名、媒体、好きなペット、個人情報承諾)を収集するようなデータベースを正規化手法を用いて構築した場合、実データは以下のようになります。
--------------------------------------------------
0,12,3,"フジモト マコト","2|3|7",2,0
1,33,6,"スズキ ユカリ","5|7",1,1
0,35,8,"アマカス ジロウ","1|2|3|5",4,0
--------------------------------------------------
このデータを見ただけではそれぞれの数値の意味が分からないので"人間にとっては"可読性がよくありません。

この例を正規化しない状態(つまり非正規化)にすると以下のようになります。
------------------------------------------------------------------------------
男性,千葉県,自営業,"フジモト マコト","テレビ|ラジオ|インターネット",ネコ,承諾する
女性,岡山県,公務員,"スズキ ユカリ","中刷り広告|インターネット",犬,承諾しない
男性,山口県,パート・アルバイト,"アマカス ジロウ","雑誌|テレビ|ラジオ|中刷り広告",鳥,承諾する
------------------------------------------------------------------------------
と、このようにひと目でそれぞれの項目の意味が分かるので、一次データとしてはこのまま使用できそうです。ちなみに最近のコンピュータは性能が極めて高いので、統計などで数十万件程度のデータから文字列検索を行う場合でも数秒程度しか時間はかかりません。

Webキャンペーン応募などは期間中にアンケートデータを収集するだけの処理(INSERT)が大半なので、検索や更新は運営側の処理が多く、相対的な正規化メリットはとても低くなります。統計やレポートは通常非同期に行われる作業ですから、なんでしたらお手元の素晴らしいバックオフィスソフトで十分処理が可能です。

その昔、途中から関わることになった案件で、性別や都道府県までもがマスタテーブル化、つまり正規化されているシステムを見て驚いたことがありました(当然管理画面もあります)。設計者は何故か性別や都道府県に新たな区分が加わったり変更がありうることを想定していたようです。世の経験値が浅いかコスト意識の低いエンジニアの中には、"正規化すべし"ということを教科書通り真に受けて、費用対効果の低い正規化とテーブル増加を安易に行ってしまう方がいるようです。

以前述べたとおり、データベース(テーブル)数とコスト・工数には強い相関性がありますから、「そんなに細分化したテーブル設計にお金を支払ってくれるなんてずいぶん太っ腹なお客様がいたもんだなぁ」と関心すらしてしまいます。逆にお金と時間を余分に頂かずにこのような設計を行った場合こそプロジェクトが"デスマーチ"となる大きな要因になるでしょう。

正規化とはコストと付加価値を十分見極めて設計する必要があり、つまり"ビジネス要件"でもあるのです。