FC2ブログ
 

Technology へようこそ
ここは技術者の「経験」と「ノウハウ」のブログです


--年--月--日

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


2009年05月19日

DB設計時の冗長項目について

DB設計する際、よく正規化、正規化といわれます。
正規化はRDBにおいて、データの一貫性の維持と効率的なデータアクセスを
可能にするための方法論のことですが、冗長にもよい場合があって、たとえば、
会計システムの伝票テーブルなどは伝票行で1レコード、しかもヘッダ項目も
そのなかに含まれる形式のものが多く、冗長である(つまり第1正規化しか行
われいていない)と言えるのですが、これはデータの取り回しがよいためで、
正規化がベスト!というわけではないのが現実です。

よくベンダ系の試験なんかで見かけるものだと、DWHのアクセス効率をよく
するためにはどうすればよいか?という問いに対し、

1.ビットマップインデックスを付ける
2.オプティマイズヒントを用いる
3.合計項目を追加する
4.トリガを用いる

この選択肢では、3.合計項目を追加する(冗長化する)というのが答えになるわ
けです。DWHでは特に、データは追加のみで更新などはほとんど起こらない
ことを前提にしますから、ここがポイントなわけです。

ところが、DWHではないDBで伝票形式で冗長性を持たせた場合にネックに
なる項目があります。
「伝票合計」です。1行でも変更があった場合、6行の伝票なら本来1行の修正で
すむところが6行分の更新が必要になります。

ORACLEにはROLLUPという便利なキーワードがあって、GROUP BY句に使用すること
で、1回のSQLで小計、合計を計算することができます。

ただ、検索結果が合計行として行追加されてくるのが難点。つまり、対象件数が
1件であっても、複数件返ってくるのです。簡単なレポートのデータ検索なんかには
よいかも。

SELECT TABLE1.COL1, TABLE2.COL2, SUM(TABLE3.COL3)
FROM TABLE1
JOIN TABLE2
ON ・・・
JOIN TABLE3
ON ・・・
WHERE ~
GROUP BY ROLLUP (TABLE1.COL1,TABLE2.COL2);


パフォーマンスはまあまあ。

通常のときはGROUP BY で結果セット(合計値)とって、ふつうにINNER JOIN
したほうがラクなんですけどね。

[ posted by H.K ]


この記事に対するコメント


この記事に対するコメントの投稿














管理者にだけ表示を許可する



この記事に対するトラックバック
トラックバックURL
http://comfair2.blog24.fc2.com/tb.php/420-5e9aa616
この記事にトラックバックする(FC2ブログユーザー)











上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。