try/catchブロックの大きな神話は、プログラマーが驚くほど堅牢なコードを作成し、実際には失敗したデータベースクエリから回復できることです。しかし、dbエラーから回復する能力は、最初にあったエラーの種類によって異なります.SQL構文エラーがある場合、そのコードはユーザーがクエリーで入力したものか、それを生成するいくつかのサブルーチンから来たものです。クエリ?ユーザーがコードではなくコードから来た場合は、コードを再度呼び出すと同じエラーが再び発生します。したがって、try/catchブロックを使用すると、最初から運命づけられているため、クエリは実行されません。これは一般に、Webサーバー上で実行されているPHPスクリプトから取得したコードです。クエリを実行すると失敗し、失敗をエスカレーションしてやります。一方、PHPでインタラクティブなアプリケーションを作成していて、DBエラーを適切に処理する必要がある場合、ランダムな突然変異(非常に奇妙な例ですが、とにかく)を介して有効なSQL文を展開しようとしていた遺伝的アルゴリズムのようにtry/catchブロックからいくつかの利点を得るでしょう。
これはデータベースレベルの制約にも適用されます。制約違反に対処する必要のある長時間実行されるアプリケーションがある場合は、自分でその堅牢性を構築する必要があります。しかし、私はこのようにPHPを使用している人はほとんどいないと考えています。PHPの99%がWebページをダンプするのに使われています。さまざまなラッパーとORMがこれをデザインに反映しています。 .NETがエラー回復ロジックを必要とする自立型アプリケーションを構築するために使用されるはるかに大きな可能性があります。
元の質問のバリエーション、いつ使用するのか、なぜデータベース制約を使用するのですか?コンパイル時にテーブル間の関係がわからない、つまりアプリケーション自体の一部として新しいテーブルが作成または削除された、非常に動的なデータベース構造を持つ場合に最も便利です。これは、大量のデータウェアハウス、データマイニング、または文字列理論のために必要となります。
ORMコメントの私の主張は、ORMを使用しているときにオーバーヘッドが既に存在していると思うということだと思うので、なぜデータベース自体に複製するのですか? – jondavidjohn
ORMがどのように設計されているかによって異なります... Doctrine 1.2は、それを設定するか、db/engineがそれらをサポートしていない場合にのみエミュレートします。したがって、ネイティブサポートを持つdbを使用すると、その点でORMのパフォーマンスが向上します。 – prodigitalson