2009-07-07 4 views
2

私は.NET 3.5でLINQ-To-SQLを使用しています。基盤となるデータベースに基づいていくつかのクラスを構築しました。私は今決定に直面します:私はクラスコードまたはデータベースのデータを検証するのですか?検証:クラスまたはデータベースで行いますか?

私は賛否両論を見ることができます。データベースで検証を行うと、どのアプリケーションがデータベースを使用しているかに関係なく、検証が行われます。 (私は現在、他のアプリがこのデータベースにアクセスするとは思っていませんが、誰が知っていますか?)

OTOHは、私の検証を行うためにはるかに堅牢なプログラミング環境を提供します。確かに、UIがアイテムをデータベースに送信されるまで待つのではなく、問題を修正できる状態になっている間に、問題を把握することができます。 Linq-to-SQLは列のデータ型を取得できますが、AFAIKでは、基礎となるデータベースのCHECKまたはDEFAULT制約のプログラムによる強制は提供されません。

エンティティの「Last Modified」プロパティ:データベースのON INSERTトリガを使用して更新できます。または、クラス自体のPropertyChangedイベントに応答することもできます。クラス自体のイベントを購読するのは奇妙ですが、クラスが部分クラスとして定義された2つのファイルにあり、これらのファイルの1つがIDEによって自動生成されるため、この方法では自動生成されたファイルを改ざんする必要はなく、ので、私は.dbmlを再生成する必要があります)、または私は、エンティティがデータベースに提出されたときにアプリでそれを行うことができます壊れません。

私はデータベースとクラスで検証を複製したくありません。私は、クラスコードで妥当性を確認する堅牢な環境が好きです。しかし、私の純粋主義者は、別のアプリ(これまでにないと思う)がデータベースを使用しても、データベースの検証が一貫性を保証すると考えています。

このトピックについて他のユーザーはどう思いますか?

答えて

3

IMHO、検証は複数のレベルで行うのが最善です。私は、UIレイヤー、ビジネスロジックレイヤー、そして最後にデータベースそのものに異なる種類の検証を実行することに問題は見られません。

私の考えでは、理想的なシナリオは、可能性のある悪意のある入力、不正な値、正規表現のパターンマッチ、および必須フィールドに対してユーザーが送信したデータをUIレイヤが検証するシナリオです。 2番目のレイヤーは、データのタイプと、データセットに伝播できる具体的な更新可能なオブジェクトを形成するために一緒にメッシュを張るかどうかを検証します。データベースは、すべての操作について言及したような基本的な制約を課します。

また、必要な検証のレベルは、各レベルで減少します... UIレイヤーの厳格なレベルからデータベースレイヤーの基本レベルに向かって減少します。

私は1つのルールを信じている - 「そうでない場合は証明されるまでのすべての入力が悪である。」

0

私はクラスでやっています。 IMAO、UIのメリット徹底的には、あなたのAPIをバイパスしている仮想アプリケーションに関する懸念から抜け出しています。

+1

データベース内の制約を定義することで、アプリケーション内のバグから保護し、後で新しい機能がアプリケーションに追加されたときに不変条件/アサーションを保持することもできます。 – ChrisW

0

通常、検証エラーをできるだけ早くキャッ​​チしてユーザーに表示する方が良いでしょう。時には、サーバーのラウンドトリップを保存するためにクライアント側で既に検証しなければならないことを意味します。しかし。あなたのDAOオブジェクトは、おそらく自分自身のいくつかのセマンティクスを持っています。つまり、それらも検証する必要があります(スキーマに一定の制約がある場合はDB例外が発生します)。

1

私はどちらか/または命題としてこれを見ていません。異なる種類のバリデーションは、異なる分野でより適切です。通常、私は、データのレイヤーでフィールドの長さ、ヌル/非ヌル、フォーマット、値などのコンテンツの検証とリレーショナル検証 - 外部キー、一意性などをデータベース内で処理します。一般に、私は実用的なアプローチを取って、それが最も理にかなった、そして/または容易に達成される検証を行うと言うでしょう。

私は、可能な限り多くの検証クライアント側も行うことに注意してください。 Webアプリケーションでは、ユーザーのために有効なデータが含まれていることが合理的でない限り、私はポストバックを取得しないことをお勧めします。これにより、サーバー上で検証を行う必要はなくなりますが、ユーザーがフィールドを見落としたことを知るために要求サイクルを待つ必要がないため、ユーザーエクスペリエンスを向上させることができます。

2

他のところで述べられているとおり、すべてのレベルで検証を行います。残念ながら、これはより多くの作業です。しかし、は本当にで、誤ったアドホック・ポンキング以降のアプリケーション・プログラムからデータベースを保護したいと考えています。

あなたは、あなたの検証の説明を読んで、各コンテキストに適したコードを生成できる何らかの "ルール"コードジェネレータを作ることを検討しました。もっと良いことに、使用しているDB /ミドル/クライアントスタックで利用可能なものがあるかどうかを調べてみてください。

私はこのような何かをやって想像:

  • は、1つ以上の「ルール」のファイルを持っています。
  • 生成されたコードで置き換えられる "マクロ"フック付きのターゲットコードファイル(SQL、java、C#、javasciptなど)のテンプレートを用意してください。
  • ビルドプロセスの一部としてコードを生成するためのmake/ant/maven/rake/whateverターゲットがあります。 (もちろん、これはあなたがしていない「点と、よだれ」環境の構築を前提と - 私は時々のIDEを使用しますが、私は本当にビルドを行うためにそれらに依存するを憎む)

まあ、それは私の青ですとにかく空に乗る。

関連する問題