http://blogs.wankuma.com/ognac/archive/2009/06/09/174556.aspx
横持ちと縦持ち(Ognacの雑感)より
上記でへのコメントが長くなったのでエントリーとしてアップします。
上記のエントリーでは、例えば、1~12月のデータを
横持ちにするか、縦持ちにするか
という話で盛り上がっています。
現在のところ「横持ちだとフィールドに1月~12月までを設けることになりますが、レコードによる縦持ちの方が一般的だよね」って話が、コメントで「そんなの「ケース・バイ・ケース」じゃん」という話で落ち着いてきてしまっている状況です。
なので、この場では縦持ちマンセーな僕が思ったことを、つらつらと述べようと思いますw
そもそも横持ちの設計って、昔の COBOL 文化によるものではないかと、僕は思っています。
ISAMファイルでフィールドを横持ちさせることによって、1レコードを読み込むだけで、データ構造体に関連データが格納される仕組みは、今の .NET の DataSet に少し似ているように思います。
つまり、当時の COBOL に限って言えば、必ずしも悪い設計ではなかったと言えるように思います。
ISAMファイル時代に当たり前とされてきた設計を、RDBMSマンセーの今の時代に、そのまま持ってくることが問題だと考えます。
また、慣習的に横持ちにするものだと思ってしまっている技術者が未だに数多く存在していて、更に、そういった人たちは古くからこの業界にいて、それなりの地位にいる人も数多くいるでしょう。
エントリー元の例のように、1~12月と常に12種類のフィールドで固定的に表現できるものなら、横持ちも悪くはありません。
しかし、1~12月の例のように、上限を決めてモデル化できるものなんて殆どありません。
更に、1~12月のケースであっても、各月に値が存在する前程なら、物理的に記録するエリアも無駄にはなりませんが、ある月だけ存在するというような場合は、存在した月だけを書きこむことのできる縦持ち形式の方が効率が良いことが多いでしょう。
また、横持ちだと OLAP キューブとして利用しにくいこともありますよね。
速度面も重要ですが、そのテーブルに格納されている値が多角的に分析される可能性が少しでもある以上は、縦持ちの設計にすべきだと僕は思います。
・・・ちゅーか横持ちのメリットって速度面以外にないのなら、横持ち形式で設計することの方が「特別」だと判断できるのではないだろうか?