2011-08-10 3 views
1

"データベースとビジネス・ロジックの対比"の古典的な質問をもう一度尋ねるのは嫌ですが、古いタイプの開発者チームに、コード内のビジネス・ロジックが優れていると納得させるいくつかの具体的な理由が必要です。他の何よりも保守的です。私はそれが単一のアクセスポイントであると信じていたので、DB内に多くのビジネスロジックを持っていました。私が唯一変わったのであれば、メンテナンスは簡単です。私の経験では、プロジェクトが大きく複雑になったときに問題が発生しました。 DB用のソース管理ストアドプロックスは、新しいIDE用のものほど進んでおらず、エディタもありません。ビジネスロジックをコードでは、DBよりもはるかに優れていますが、これは私の最近の経験で見つけたものです。データベース・レイヤーのビジネス・ロジック

https://stackoverflow.com/search?q=business+logic+in+database

私はそこにどのような状況には絶対的ではありませんが、与えられたasp.netソリューションを知っている、:

だから、ちょうどstackoverflowの周りを探して、私はその尊敬のメンバーとは全く反対の哲学を発見しました特に高トラフィックのサイトではなく、SQLサーバーまたはOracleを使用します。なぜロジックをDBに入れるのでしょうか?

答えて

6

あなたはビジネスと呼ぶものによって異なります。

データベースは、期待どおりの動作をする必要があります。

データのコンシューマとプロバイダは、データベースが一定の保証を行うことが予想される場合、それはデータベースで実行する必要があります。

データベースで参照整合性を使用しない人もいれば、システムの他の部分で管理することもあります。データベースのテーブルに直接アクセスする人もいます。

Iは、システムとコンポーネントの観点から、データベースは、他のサービスやクラス/オブジェクトのようであることを感じます。これは、「ビジネス」とみなすことができる一定のレベルにまで低レベルの整合性から、その周囲を保護し、その実装の詳細を隠すと整合性の保証を提供する必要があります。これを行うには

良い方法はなど、参照整合性、ストアドプロシージャ、トリガ(必要な)、ビュー、ベーステーブルを隠し、などです

+0

お返事ありがとうございます - 私はビジネスロジックを意味していますが、「この従業員はこの部署の費用を追加することができますか?」など、非常に特定したビジネスロジックを参考にしています...参照整合性とトリガーは、孤立したデータと外部キーを保持しますが、私が言及したようなチェックをするのには役立ちません。それはどこにあるべきですか? –

+1

@Cadeあなたがあまりにも多く隠れるか、あまりにも多くのビューやSprocsが容易にほとんど管理不能になる可能性がある場合を除いて、私はあなたに完全に同意します。私はリファクタリングのケースを見てきました。ビューの上にビューがあり、ストアドプロシージャがすべてのことを管理するために使用されています。良いデザインは、3層とn層のアーキテクチャが発明された理由ですが、これを多く防ぐことができます。これらの問題の多くを避けようとする。 –

+1

@ M.R。従業員と部署に関するあなたのケースは、データベースの外にある場合もあります。一方、複数のアプリケーションが挿入を実行している可能性がある場合(たとえば、WebフロントエンドとWindowsサービスを含むSSISパッケージからの注文)、データベースに適用する可能性があります。すべてのユーザーに何らかの種類のアプリケーションサーバーまたはWebサービスを強制します。 –

1

データベースでは、データを取得するために既にかなりヒットしているものを憂慮しています。パフォーマンスのこととコードのことです。データベースにすべてを格納するよりもビジネスロジックコードを維持する方がずっと簡単です。 Sprocs、Views and Functionsは、あなたがsprocsを使ってビューのViews of Viewsを持って、その混乱を埋めるまでしか動かない。ビジネスロジックを使うと、あなたの心配を分けることができる。何かが間違って計算されるバグがあれば、ビジネスロジックコードをチェックする方がDBに入り、誰かがストアドプロシージャで何かを混乱させるかどうかを確認するよりも簡単です。これは非常に意見があり、場合によってはデータベースにロジックを入れても構いませんが、ロジックベースではなくデータベースに属しています。

P.S:この記事のためにいくつかの熱をcatchinかもしれないが、それはどちらかのための本当の証拠はありませんパフォーマンスの数値よりも非常に独断と他のだと、それはあなたがで作業しているものの場合になります。

編集:ケイドは私が忘れたと言いました。誠実な誠実さ。是非、あなたのDBに正しいデータの整合性を持たせてください。忘れ去られたレコードは、CASCADEのDELETE CASCADEにはありません。

+0

はい、私は知っています:) DB全体がフレームワークよりも速く実行されたとき、DB全体のビジネスロジックは古い考え方(または私が思った)です。今日のフレームワークははるかに速く、より柔軟でスケーラブルであるため、私はこの哲学が勝利したとは考えていませんでした。しかし、私のstackoverflowの検索はそうでないと思われます.... –

+0

@ M.R。私はそれに少しショックを受けました。私は、このプラクティスを阻止するために努力してきた多くの場所で性能テストを行ってきました。 .NETフレームワーク(非常に普及している)は、PHPのように非常に高速で、非常に一般的にDBバックエンドで使用されています。実際にデータベースに多くの作業をダンプする理由はありません(少なくとも私はそう考えています)。 –

+3

私はまた、多くの「開発者」が実際にSQLを書くのにはあまりよくないと言います。したがって、彼らがデータベースに入れた "論理"は性能が悪く、使用する技術ではなくデータベース上でこれを責めます。トリガーの過度な使用、ほとんどすべてのカーソルの使用、誤解の原因となる非効率的な照会、および基本的な索引付けの戦略はすべてここで機能します。 –

-1

私は巨大なプロジェクトの一つに、データベースのロジックに直面しています。これは、DBAスペシャリストのメインマネージャーの決定によるものです。彼は、アプリケーションはleightweightでなければならず、データベーススキーム、結合テーブルなどについては何も知らず、格納されているProcsはクライアントからのトランザクションスコープやクエリよりもはるかに高速に実行されると述べています。 もう一方の側では、データベースオブジェクトのマッピングに関するバグが多すぎました(他のビューなどに基づくビューに基づいてprodまたはビューが格納されていました)。 70-90-120のパラメータを持つ巨大なストアドプロシージャと呼ばれ、いくつかの(10-15)テーブルを更新したため、各ボタンがクリックされたために、データで何が起きているのかを理解することができませんでした。私たちは単純な選択要求を照会する能力がありませんでしたので、単純な結合のためにビューをコンパイルしたり、Procとクラスをコードに格納したりしなければなりませんでした:-もちろん、テーブルやビューの定義が変わると、編集されたオブジェクト上の他の場所で実行時例外が発生します データベースのロジックは恐ろしい方法です。もちろん、パフォーマンスやセキュリティの問題によって必要に応じてストアドプロシージャにコードを保存することはできますが、データベースはロジックが柔軟で、テスト可能で、維持可能でなければならず、ロジックを格納するデータベースを使用してこの点に到達することはできません)

関連する問題