ストアドとビジネスロジックみたいな雑記

昨日がDBな日だったので、ついでに。
ちょっと古い話ですけど、ストアドとビジネスロジックみたいな質問が人力検索にあったので、それと関連した雑記です(・∀・) *1
DB自体に強いわけではないので、変なこと言ってるかもしれませんが。*2


で、ロジックの分散だとか、パフォーマンスだとか、開発体制*3だとか、適材適所がどうのというような話ではなくて、もっとレベルの低い話です(´Д`)
あと、Javaではなくて、.NET+SQL Serverな話なんでですけどね(´∀`)


自分は、JavaではORMとしてはiBatisくらいしか使ったことないし、DBに関しては複雑なクエリーをビューにするくらいで、ビジネスロジックもストアドではなくJavaコードにを書くやりかたしか経験無いですが。


で、Javaではなくて.NET+SQL Serverを使っていると、ロジックをストアドで書くのって良いジャーン、とか思うことがあったり(・∀・)
デザイナを使って、ストアド呼び出用のTableAdapterを生成するのが楽ちんポーン♪、って感じで。


ストアドを使用せずにコードでロジックを書く場合、参照系の処理についてはまあいいんですけど。
更新系のちょっと複雑な処理が必要になった場合、DAO層で必要なを処理を定義していって、それを利用するロジックを.NETで書くよりも、ロジックをストアドで書いてしまって、.NETからはそれを呼び出すだけにしたほうが楽だよね〜、と思ってしまうんですよね。


例えば、Insert or Updateみたいなことをする以下のような処理が必要になったとしますが。*4

CREATE PROCEDURE SetProperty
    @Id           int,
    @Data         nvarchar(256)
AS
BEGIN

    BEGIN TRANSACTION

    IF EXISTS( SELECT Id FROM Property WITH ( UPDLOCK, HOLDLOCK ) WHERE Id = @Id )
        BEGIN
            UPDATE Property SET Data = @Data WHERE Id = @Id
        END
    ELSE
        BEGIN
            INSERT INTO Property VALUES ( @Id, @Data )
        END

    COMMIT TRANSACTION

END

重複INSERTに対しては、もし発生したら例外を拾うとのではなくて、WITH ( UPDLOCK, HOLDLOCK )により重複がおきないようにしています。
にも似たような事をちょっと書いてますけど。


で、これをストアドではなくて.NETのコード上で書こうとした場合、データアクセス層としては「参照(ロック付き)」、「更新」、「挿入」が必要になって。
ロジック層としては、トランザクションを準備して、各データアクセス処理毎にパラメータのバインドを行って〜みたいな処理を書かなくちゃならないわけですが。


で、実際にコードを書いてみると、そういう細かい部分がそれなりの行数になりますよね(´・ω・`) *5


まあ、この例程度の処理だったら良いんですけど、複数のテーブルのロックが必要だったり、条件分岐が色々出てきたりすると、そういうビジネスロジックの本質とは関係ない処理を書くのが面倒になってきたりして(´Д`;)
それよりは、ロジックをストアドに書いて専門のSQLに任せて、その呼び出し用にはTableAdapterをデザイナで作っちゃっう、っていうやり方の方が楽だな〜、っということになんですが(゚∀゚)


つまりどっちが楽かという観点からのみの話なんですけどね(´Д`)
.NET+SQL Serverな環境に限って言えば、

  1. ストアドはVisual Studio上で簡単にデバッグできる
  2. ストアド呼び出し用のコードは、デザイナを使って簡単に生成できる

っということがあるので、ロジックをストアドで書いちゃうこともあるという話でした。


もちろん、開発規模やチームの体制によっては、このやりかたを推奨できないケースはありますけどね。
まあ、自分がやってる仕事の規模から言えば、この方法であまり問題はないというか(´ω`)
ストアドでSQL Serverに依存した処理を書いても、データベースが変更になるケースもあまり無いので問題ないし。*6


で、アーキテクチャについて色々知っている人達でも、.NET開発ではこのやり方を選択してる人が多いんじゃないかと思ったり。
どうでしょう(・∀・)?

*1:あまり関連していないかも(´Д`)

*2:…っというか、自分のコアってなんだろうなぁ…。

*3:これについてはちょっと関連あるかしら。

*4:エラー処理とか、細かい部分は省いてますけど。

*5:SqlHelperみたいなものを使ったとしても。

*6:これに関してはまたネタに使えるかしら?