2008-09-02 43 views
12

アプリケーションでデータベース例外をどのように処理しますか?
DBに渡す前にデータを検証しようとしているのですか、または単にDBスキーマ検証ロジックに頼っていますか?
DBエラー(タイムアウトなど)から回復しようとしていますか?ビジネスで データベース例外処理のベストプラクティス

  • 検証両側にDBへ
  • 左検証をDBとDBの例外を処理するためにいくつかの明白な制約を適切に
  • 検証を渡す前に

    1. 検証データ:ここ

      は、いくつかのアプローチですロジックと複雑な検証をDBに残しました

    どのようなアプローチですか?どうして?

    更新:

    私は成長して議論を見てくれてうれしいです。
    コミュニティの回答を集計しようとしましょう。

    提案:

    • 検証両側に クライアント側の
    • チェックビジネスロジックの制約、DBが整合性をやらせることは、早期にfrom hamishmcn
    • チェック早期悩ませないようにするDB from ajmastrean
    • チェックをチェックしますユーザーエクスペリエンスを改善するfrom Will
    • DB対話コードを 開発from hamishmcn
    • オブジェクト・リレーショナル・マッピング(などNHibernateは、LINQのは、)あなたが制約from ajmastrean
    • クライアント側の検証がfrom Seb Nilsson

    セキュリティ上の理由のために必要であるに対処するために助けることができる簡素化、あなたが何かを持っていますか言う?これはValidation固有の質問に変換されます。 「データベース関連のエラーベストプラクティス」の中核となるもの、つまりバブルアップするものが欠けていますか?

  • 答えて

    1

    一般に、私は入力後できるだけ早くデータを検証しようとします。これは、「提出する」またはそれに相当するものをクリックした後でより早く、有用なメッセージをユーザに提供できるようにするためです。
    dbコールを作成するときは、私が渡しているデータがかなり良いはずであることを期待しています。
    helperメソッドを共有する1つのファイル(またはファイルのグループ)にdbコールを保存しようとすると、例外に関するログに書き込むためにプログラマ(私または他の誰かが呼び出しを追加する)どのパラメータが渡されたかなど

    2

    私は両側で検証しようとしています。私が常に従うルールは、ユーザーからの信頼の入力ではありません。これに続いて、私は通常、不適切な形式のデータの提出を許可しないフォーム/ Webページでフロントエンド検証を行います。これは鈍いツールです。つまり、日付フィールドに日付が含まれていることを確認/解析することができます。そこから、私は通常、データ入力がどのように提出されたかという文脈で意味があるかどうかについて、ビジネスロジックにチェックさせます。たとえば、提出された日付は予想される範囲に収まるでしょうか?提出された通貨価値は予想される範囲に収まるか?最後に、サーバー側では、外部キーの制約とインデックスは、すべてのエラーをキャッチすることができます。これは、最後の手段としてDB例外を発生させ、アプリケーションコードで処理できます。 DB呼び出しが呼び出される前にできるだけ多くのエラーをフィルタリングするため、このメソッドを使用します。

    3

    DBへの不要なトリップを減らしたいので、アプリケーション内で検証を実行することをお勧めします。また、データが入力されたUI付近(コントローラー内であろうと、簡単なアプリケーション用のUIレイヤー内であろうと)の近くで、データのエラーを最も簡単に処理することができます。

    ただし、プログラムで確認できないデータエラーがあります。たとえば、dbにラウンドトリップしないで、関連データの存在に関するデータを検証することはできません。このようなデータエラーは、リレーションシップ、トリガーなどを使用してデータベースによって検証される必要があります。

    ここでは、データベース呼び出しによって返されるエラーを扱うのは興味深いものです。データレイヤー、ビジネスロジックレイヤー、またはUIレイヤーでそれらを扱うことができます。この場合のベストプラクティスは、それらのエラーを処理する前の最後の責任ある瞬間にそれらのエラーをバブルアップさせることです。

    たとえば、ASP.NET MVC Webアプリケーションを使用している場合、データベース、コントローラ、UI(モデル、コントローラ、およびビュー)の3つのレイヤーが下から上にあります。データレイヤーによってスローされたエラーは、コントローラーにバブルアップする必要があります。このレベルでは、アプリケーションはユーザーが何をしようとしているのかを「知っています」、エラーをユーザーに正しく通知し、それを処理するさまざまな方法を提案することができます。データレイヤー内でこれらのエラーから回復しようとすると、コントローラー内で何が起こっているのかを知ることがずっと難しくなります。もちろん、ビジネスロジックをUI内に配置することはベストプラクティスとはみなされません。

    TL; DR:すべての場所で検証し、最後の責任ある瞬間に検証エラーを処理します。

    0

    私が書いていたアプリの種類(私は仕事をして以来)は、社内のファットクライアントアプリケーションでした。
    私はクライアントにビジネスロジックを維持し、db(つまり、上位レベルの検証とは対照的に、実行するプロシージャの能力にのみ関連する検証)に対して機械的な検証を行います。要するに、可能な場所で検証し、関連するタイプの検証を一緒に保つようにしてください。

    +0

    [@hamishmcn](http://stackoverflow.com/questions/39371/database-exception-handling-best-practices#39406)。良い点は、ビジネスロジック層の検証を持つ一つの理由は、ユーザーフレンドリーなUIを作成することです。しかし、複数の場所でこれらのバリデーションを行うことはDRYの原則を破ります。 DBとクライアント側の検証をどのように同期させて管理するのですか? – aku

    5

    @aku:DRYは素晴らしいですが、必ずしもそうであるとは限りません。検証は不可能ではなく、絶対に必要な3つの全く別の無関係の場所があります:UI内、ビジネスロジック内、データベース内。

    ウェブアプリケーションを考えてみましょう。サーバーへの移動を減らしたいので、クライアントデータ入力のjavascript検証を含めます。しかし、ユーザーが入力したものを信用することはできないため、データベースに触れる前にビジネスロジック内で検証を実行する必要があります。また、データの破損を防ぐために、データベースには独自の検証が必要です。

    3つの異なるタイプの検証を1つのコンポーネント内で統一するためのきれいな方法はありません。

    ありPolicy Injection Application BlockがそれらValidation Application BlockとP & P群の組み合わせのようなポリシーインジェクタ内の検証のような横断的責任を統合するために行われ、いくつかの試みがあるが、これらは依然としてコードベースです。

    2

    NHibernate(より良い意味ではActiveRecord)のようなオブジェクト・リレーショナル・マッピング(ORM)ツールは、たくさんのことを避けるのに役立ちますデータモデルを適切なC#クラスとしてコードに組み込むことができます。フレームワークに組み込まれた偉大なキャッシングおよび検証モデルのおかげで、データベースへの移動も避けることができます。

    4

    クライアント側とデータベース側の両方で検証する1つのキラー理由があり、セキュリティです。特にAJAXやハッキング可能なURLなど、あなたのサイト(この場合)をユーザーにもっと親しみやすいものにするためには、のハッカーが便利です。

    ユーザーが入力を修正するように早期に指示するためのスムーズな操作を提供するために、クライアントで検証します。また、データベースのセキュリティのために、データベース(またはビジネスロジックの場合、これがデータベースへの完全に安全なゲートウェイであるとみなされる場合は、)と検証します。