« 技術が利用方法に追い越される時? | トップページ | informixのsp foreach使用上注意 »

2004.09.17

うーん、確かにわかりやすいけど……

割合複雑なテーブル構造を持つと、正規化をしていく関係でどうしても一回の業務処理でいくつものテーブルを使用しなくてはならない。
それで普通はJOINを多用してさくっとデータを取得して対応するのが吉。
とりわけウェブシステムはレスポンスが課題となることが多いので、可能な限りSQLの発行回数は減らしてトランザクションがたくさんにならないようにしないと。
しかし中には「可読性」を重視しているのかどうか知らないが、一個一個真面目にSELECTしてデータを取得するというちょっち頭が痛めのプログラムを書いてきてくれるプログラマさんも居る。
まあおかげさまでソースを読むと、何をしているのかは一目瞭然ではあるのだが(^^;;;;

まあ今回のエントリーはそんなソースを眺めていて思った雑感ではあるわけで。

正規化されているテーブルを一個一個個別に読む、という上記のプログラマーさんはまあ問題外としても、いくつかの関連性が薄いテーブルから取得する情報を一画面で表現するときなどはちょっと悩むところもある。
またプログラムが部品化されすぎているがために、例えばそのパーツを20個埋めこむような画面がユーザーのパーソナライズによって発生した場合など、各部品が殆ど同等のSQLを部品個数だけ発行させてしまう、というようなこともあり得る。
イメージは次のような画面。

A社
Code:1111
Tel:xxxx-xxx
B社
Code:1122
Tel:aaaa-zzz
C社
Code:1132
Tel:aaaa-ssss
E社
Code:1142
Tel:aaaa-2sss
で、この会社情報個数は可変で、ユーザーが一定の枠の範囲で自由にカスタマイズできる。というようなケース。 この部品がJavaScriptかなんかになっていて、
<script src="xxx.cgi?cd=1111"> <script src="xxx.cgi?cd=1122"> <script src="xxx.cgi?cd=1132"> <script src="xxx.cgi?cd=1142">
とかになっていたら、都合4回の殆ど同じようなSQLを結果として1画面で発行していることになる。 この画面であれば、ユーザーの定義ファイルをサブクエリかなんかにしてWhere 条件として、マスタファイルをselectするのがスマートだろう。

過去の実例で行くとけっこうシステム開発能力には定評のあるカブ・ドットコムなんかがこの問題点を抱えて、抜本的に見直して対応したという事例を日経オープンシステムかなにかで読んだ記憶がある。
株価等の情報を上場企業単位で呼び出せる部品があって、それを自由にユーザーが組み合わせられるような画面でこの問題が顕在化したようで、ソースレベルのレビュー等では気付かない可能性は確かに高そうだと思った記憶があり。

で、自分はどうしてるかって?
個人でつくるようなアプリだとそれほど真面目に正規化していないし、関連するテーブルも少ないので、割と気軽に個別にSQLを発行してたりするのが現実だとはとても恥ずかしくて言えない(笑)


2004/09/20補足: 知人から「でもJOIN多用すれば事実パフォーマンス落ちるじゃん」という指摘(^^; うむ、確かに(^^; DBの教科書でも一般的に正規化の問題点のひとつとしてあげられるよね。 また、「単純に程度の問題だけどもJOINをしまくるとあるところで急激にパフォーマンスが落ちるよ。DBMS性能依存だけど」という指摘も(^^; はい、そのとおりです。ごめんなさい。

あと、その時には書かなかったのだが「Webのプレゼンテーション層に近いレベルから個別にSQL発行するからダメなんじゃん。ストアドプロシージャとかにしてDBサーバサイドでやれば複雑なSQL発行しなくても通信のオーバーヘッドは無視できるんじゃないの?」というのはYES。
実際に、そういうポリシーで作成しているシステムもたくさんある。ただ、例示している内容だと別プロセスで個々の部品が起動する以上、通信のオーバヘッドだけでなくサーバサイドの処理プロセスも無用に多く発生しているというのは事実なわけで、これはいくらストアドプロシージャとか使っても解決しない。

|

« 技術が利用方法に追い越される時? | トップページ | informixのsp foreach使用上注意 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/1458053

この記事へのトラックバック一覧です: うーん、確かにわかりやすいけど……:

« 技術が利用方法に追い越される時? | トップページ | informixのsp foreach使用上注意 »