私の経験では、多くのアプリケーションが単純な一連のテーブルから始まり、次にいくつかのストアド プロシージャを使用して基本的な機能を提供することがわかりました。これは非常にうまく機能します。通常、高いパフォーマンスが得られ、理解しやすいだけでなく、複雑な中間層の必要性も軽減されます。
ただし、アプリケーションは成長します。何千ものストアド プロシージャを持つ大規模なデータ ドリブン アプリケーションを目にすることは珍しくありません。トリガーをミックスに投入すると、元の開発者以外の誰にとっても (まだ開発中の場合)、維持するのが非常に難しいアプリケーションができあがります。
ほとんどのロジックをデータベースに配置するアプリケーションについて一言述べておきます。これらのアプリケーションは、優れたデータベース開発者がいる場合や、変更できないレガシー スキーマを使用している場合にうまく機能します。私がこれを言う理由は、ORM にスキーマを制御させると、アプリケーション開発のこの部分の苦労がほとんどなくなるからです (そうでない場合は、多くの場合、それを機能させるために多くの操作を行う必要があります)。
新しいアプリケーションを設計する場合、通常は、アプリケーション ドメイン (その設計はコードになります) によって決定されるスキーマを選択します。通常、ORM にオブジェクトとデータベース間のマッピングを処理させます。データ アクセスに関しては、ストアド プロシージャをルールの例外として扱います (レポートは、ORM を誘導して複雑な出力を効率的に生成しようとするよりも、sproc の方がはるかに簡単です)。
ただし、覚えておくべき最も重要なことは、設計に関しては「ベスト プラクティス」がないということです。設計のコンテキストで各オプションの長所と短所を比較検討するのは、開発者次第です。