http://highscalability.com/blog/2010/11/9/facebook-uses-non-stored-procedures-to-update-social-graphs.html Facebookがロジックをどのように移行したかについて話します開発の容易さを向上させるために、データベースをアプリケーションに組み込みます(データベース全体ではなく、従業員全体のスケーリングが向上します)。
データベース内とアプリケーション内の両方のロジックを実行することのビジネス上および技術上のトレードオフを評価する調査/記事/ベンチマークはありますか?
具体的には、(データベースのパフォーマンスとビジネスの成長に応じた開発の容易さの両方の点で)何がより適切に拡張できるのかと思います。
シナリオ1では、どのような人のスケーリングのオーバーヘッドが予想されますか?
シナリオ2では、どのようなデータベーススケーリングのオーバーヘッドが予想されますか?
私自身の質問への回答(これまでに読んだすべてを集約):
Account
の表示と更新Balance
のみを許可する必要があります」ではなく、「顧客はTransferFunds()
の呼び出しのみを許可する必要があります。」 ビューを使用して同じ権限スキームをエミュレートできるはずです 。概要:一般的な考えに反して、パフォーマンスやセキュリティ上の理由からストアドプロシージャを使用しないでください。これらを使用してする必要があります複数のアプリケーションをサポートし、データの整合性を適用し、アプリケーション層で簡単に実装できない分野横断的な問題を実装します。
残りのすべてのロジックをアプリケーションレイヤーにプッシュしてください。
この選択を行う際の唯一の問題はスケーラビリティーではありません(私は何兆ものレコードを持つ成功したデータベースを知っているので、データベースは思ったよりスケーラブルです)。それはおそらく最も重要でもありません。
まず、データの意味を確認する必要があります。 Facebookのようなものは本質的にそのアプリケーションに関連付けられているため、ロジックを配置することは、インポート、データベースジョブ、複数の異なるアプリケーションからのユーザーデータエントリからデータを取得する必要があるビジネスアプリケーションほど危険ではありません。制御できません。したがって、データの整合性に対するリスクは、この選択を行う際に検討する必要がある最初かつ最も重要なことです。
また、データがどのように使用され、どの環境で重要であるか。情報はどのように監査されますか?規制要件はありますか?レポートはどのように行われますか?別のレポートシステムやユーザーアプリケーションでロジックを再利用できるようにする必要がありますか?もしそうなら、ロジックはアプリケーションの外で休む必要があります。データのエクスポートを実行する必要がありますか。それは、アプリケーション内のロジックによってどのように影響を受けますか。これは、レポートコードとエクスポートコードを記述しているユーザーが、アプリケーションコードにアクセスできないため、ロジックが何であるかを確認できないことを意味しますか?それは大きな問題になる可能性があります。
別の考慮事項は、パフォーマンスを含むスケーラビリティです。どのくらいの拡張性が必要ですか? Facebookのスケーラビリティを必要とするものはほとんどありません。どのくらいのパフォーマンスが必要ですか?必要のないスケーラビリティーを設計すると、最適な結果が得られません。アプリケーションにロジックを配置するために使用するメソッドは、データベースのパフォーマンスに悪影響を及ぼしますか(たとえば、多くのORMが恐ろしいデータベースコードを書き込みます)。
それから、ばかげている開発のためのより少ない時間についての議論があります。何をしているのかわかっている場合は、データベースにロジックを配置するのに、アプリケーションに配置するよりも時間がかかりません。ほとんどのアプリケーション開発者はSQLの専門家ではありません。しかし、SQLをより良くするために開発者の時間を節約することは本当にプラスですか?いいえ、その選択は、ほとんどの場合、データベースのパフォーマンスとデータの整合性を犠牲にして行われるためではありません。
私が言おうとしているのは、1つのサイズですべてに対応できるものはないということです。ロジックをアプリケーションに配置することが理にかなっているアプリケーションとそうでないアプリケーションがありますが、選択を行うときに考慮すべき重要な要素が1つまたは2つだけであると考えるのは、一般に誤りです。
さて、実用的な答えがあります、そしてこれがこれです。
質問のタイトルは「アプリケーションロジックはどこで実行する必要がありますか?」しかし、あなたがそれについて考えるならば、これは分離可能であるべきである2つのことを膨らませます:
現在のデータベーステクノロジーの一般的に認識されていない大きな弱点の1つは、これらの質問のいずれかを選択すると、通常、もう一方の質問に強いられることです。
しかし、理想的には、すべてのアプリケーションロジックを一度で、選択した強力なプログラミング言語でコーディングし、ロジックをアプリケーションで実行するかどうかを指定できる必要がありますまたは、データベースは遅延バインドされた決定でなければなりません。アプリケーションをデプロイするときに選択するか、実行時と同じくらい遅くすることもできます。
実際、理想的には、ブラウザー、アプリケーションサーバー、データベースで同じロジックを同時に実行できるはずです。フォーム駆動型Webアプリケーションの検証ルールを考えてみてください。理想的には、3つの層すべてで検証ロジックを実行する必要があります。
したがって、実際には、そのロジックを1回コーディングし、それを3つの場所すべてに適用するツールを用意する必要があります。しかし、これを実現するための貴重な技術はほとんどありません。
私はお勧め/好む傾向があります:
ロギング
セキュリティ/権限
クエリ
INS/UPD/DEL
SDL