O/Rマッピングの是非 の論議

http://blogs.wankuma.com/naka/archive/2008/05/25/139274.aspx
わんくまさん曰く、

>すべてのSQLはストアドの中で書きましょう。そうしないとどこでどんなSQLが呼ばれているか把握することは非常に困難になります。
>まずはまとめるところから始める。

うーん。ストアドにしちゃうほうがわからなくなるかと...
私は、コーディング規約としてSQL文を入れる変数をsqlstrとかsqlstr01とかにしてます。
こうしとくと文字列検索かけると一発なので...

>よくそういうコネクションをまとめるクラスとか作りたがりますが、それは必要ないでしょう。
>それよりもデータセットなんかをうまく利用できるようにしたほうがつぶしがききます。
>その上でどうしてもまとめないといけないようなことってのはうまくまとめてあげましょう。

型付データセットを利用するというのは、その通りだと思います。CV POSのクライアントロジックでも、
クライアント側DataSetの中に書いておくと、そこだけ見ればだいたいOKになるので...

>もちろんたちの悪いSQLを平気に書くやつが多いのは確かだけど、それよりも性能要件はもっと複雑です。こんなSQL一個直すだけで解決するものばかりではありません。

^_^;あえて言いますが、データが増えて遅くなるという現象はほぼ間違いなくSQLを直すだけで解決します。


http://blog.y-110.net/log/eid86.html
BUKURO-JINさんの意見に、おおむね賛成いたします。

>そもそも何十行もの SQL文を見たことがありませんし, もしそのような SQL を書かなければならないのであれば, それは単純にテーブル設計が腐っているとしか思えません。

という意見は補足いたします。
たとえば、下のようなSQL文は20行程度です。

sqlstr = "select B.商品CD HIN,B.色CD COL,B.サイズCD SIZ,TO_SINGLE_BYTE(zen2han(A.商品名)) NAME"
+",TO_SINGLE_BYTE(zen2han(NVL((select C.名称 from HC$master_meisho C where C.名称区分='COL' and C.名称CD=B.色CD),''))) COLN"
+",TO_SINGLE_BYTE(zen2han(NVL((select C.名称 from HC$master_meisho C where C.名称区分=A.商品サイズ区分 and C.名称CD=B.サイズCD),''))) SIZN"
+",B.JANコード1 JAN"
+",row_number() over (partition by B.JANコード1 order by B.SEQ_NO) ROWNO" // 同一JANがあった場合に順番をつける(Primary対応)
+ ",GET_JODAI(B.商品CD,B.色CD,B.サイズCD,'" + DateTime.Now.ToString("yyyyMMdd") +"','"
+ global::CvnetPos2.Properties.Settings.Default.MyShopCode + "') JODAI"
+ ",A.代表品番FLG DAI" // 1のときには代表品番。
+" ,A.ブランドCD BRD"
+" ,A.アイテムCD ITM"
+" ,A.商品区分FLG KBN"
+",NVL((select H.セール区分 from HC$MASTER_SHO_PRICE H " // セールマスタ(HC$MASTER_SHO_PRICE)からセール区分を
+" where H.期間S=(select MAX(I.期間S) from HC$MASTER_SHO_PRICE I where H.店舗CD=I.店舗CD and H.商品CD=I.商品CD"
+" and H.色CD=I.色CD and I.期間S>'19010101' and I.期間S<='" + DateTime.Now.ToString("yyyyMMdd") +"')" // セールマスタ中で最終日付のデータ
+" and H.商品CD=B.商品CD AND H.色CD=B.色CD AND H.サイズCD=B.サイズCD"
+" and (H.店舗CD='.' OR H.店舗CD='"+global::CvnetPos2.Properties.Settings.Default.MyShopCode+"')" // 自店のもの
+" and H.POS区分=0),A.セール区分) SAL0" // 最終的なセール区分
+ " from HC$master_shohin_JAN B"
+ " left join HC$master_shohin A on (A.商品CD=B.商品CD and A.POS区分=0)"
+ "order by B.JANコード1,B.SEQ_NO"; // JANコードで並べる (B.商品CD,B.色CD,B.サイズCD)は使わない

このSQL文は複雑か?
複雑とはみなしません。単にマスタをいくつか条件を付けて結合しているだけです。
単に列名が長くて複数行になるもの、マスタを結合しただけのもの、そういった部分を除いたSQL本体が
数十行になるものは、おそらくほとんどないと思います。
(普通、こういったSQL見せられて理解しようとする場合、どれがメインなのかという本体をまず把握する。
たとえばこのSQL文であれば、from HC$master_shohin_JAN B という1行の部分が本体と理解できればOK。
SQLの本体が列名とかコメント、マスタ結合のぞいて数十行だとたぶん一発では理解不可)
そういった意味でBUKURO-JINさんは発言なされてるような気がします。