私は、ビジネスロジックを可能な限りデータベースに入れないことを強く信じています。しかし、私の会社のパフォーマンス開発者として、時には良いパフォーマンスを達成する必要があることを感謝しています。しかし、人々が主張するよりもはるかに少ない頻度で必要だと思います。
長所と短所に異議を唱えます。
あなたはそれがあなたのビジネスロジックを集中化すると主張します。それどころか、分散化されていると思います。現在取り組んでいる製品では、多くのビジネスロジックにストアドプロシージャを使用しています。パフォーマンスの問題の多くは、関数を繰り返し呼び出すことに起因しています。例えば
select <whatever>
from group g
where fn_invoker_has_access_to_group(g.group_id)
このアプローチの問題は、一般に(これがfalseである場合もある)、データベースに関数を1行に1回、N回実行させることです。その機能は高価な場合があります。一部のデータベースは関数インデックスをサポートしています。ただし、考えられるすべての入力に対して、考えられるすべての関数にインデックスを付けることはできません。それともできますか?
上記の問題の一般的な解決策は、関数からロジックを抽出し、クエリにマージすることです。これで、カプセル化が壊れ、ロジックが複製されました。
私が見る別の問題は、ストアドプロシージャの結果セットを結合または交差させる方法がないため、ループ内でストアドプロシージャを呼び出すことです。
declare some_cursor
while some_cursor has rows
exec some_other_proc
end
ネストされたprocからコードを引き出すと、再び分散化されます。したがって、カプセル化とパフォーマンスのどちらかを選択する必要があります。
一般的に、私はデータベースが次の点で悪いことを知っています。
- 計算
- 反復(それらは集合演算用に最適化されています)
- 負荷分散
- 解析
データベースの得意分野:
- ロックとロック解除
- データとその関係の維持
- 整合性の確保
ループや文字列解析などの高価な操作をアプリケーション層に保持することにより、アプリケーションを水平方向にスケーリングしてパフォーマンスを向上させることができます。通常、ロードバランサーの背後に複数のアプリサーバーを追加する方が、データベースレプリケーションをセットアップするよりもはるかに安価です。
ただし、ビジネスロジックをアプリケーションのプログラミング言語から切り離すことは正しいのですが、なぜそれが利点なのかわかりません。Javaアプリがある場合は、Javaアプリがあります。多数のJavaコードをストアドプロシージャに変換しても、Javaアプリがあるという事実は変わりません。
私の好みは、データベースコードを永続性に集中させることです。新しいウィジェットをどのように作成しますか?3つのテーブルに挿入する必要があり、それらはトランザクション内にある必要があります。それはストアドプロシージャに属します。
ウィジェットにできることと、ウィジェットを見つけるためのビジネスルールを定義することは、アプリケーションに属します。