2011-02-05 13 views
3

アプリケーション内のデータベース制約とネイティブデータベースの制約を処理する一般的な質問を見てみましたが、私の質問はどのようにPHPで書かれたアプリケーションロジック内のネイティブのmysql制約を処理します。PHP/MYSQL - アプリケーションでデータベースレベルの制約を処理する方法

他の言語/データベースラッパー(たとえばADO.NET)では、データベースインタラクションをtry/catch内に置き、適切な例外をスローします。これはPHPの場合ですか?

また、厳密なORMを使用すると、データベースレベルの制約の必要性が否定されますか?他の言語/データベースラッパーで

答えて

0

try/catchブロックの大きな神話は、プログラマーが驚くほど堅牢なコードを作成し、実際には失敗したデータベースクエリから回復できることです。しかし、dbエラーから回復する能力は、最初にあったエラーの種類によって異なります.SQL構文エラーがある場合、そのコードはユーザーがクエリーで入力したものか、それを生成するいくつかのサブルーチンから来たものです。クエリ?ユーザーがコードではなくコードから来た場合は、コードを再度呼び出すと同じエラーが再び発生します。したがって、try/catchブロックを使用すると、最初から運命づけられているため、クエリは実行されません。これは一般に、Webサーバー上で実行されているPHPスクリプトから取得したコードです。クエリを実行すると失敗し、失敗をエスカレーションしてやります。一方、PHPでインタラクティブなアプリケーションを作成していて、DBエラーを適切に処理する必要がある場合、ランダムな突然変異(非常に奇妙な例ですが、とにかく)を介して有効なSQL文を展開しようとしていた遺伝的アルゴリズムのようにtry/catchブロックからいくつかの利点を得るでしょう。

これはデータベースレベルの制約にも適用されます。制約違反に対処する必要のある長時間実行されるアプリケーションがある場合は、自分でその堅牢性を構築する必要があります。しかし、私はこのようにPHPを使用している人はほとんどいないと考えています。PHPの99%がWebページをダンプするのに使われています。さまざまなラッパーとORMがこれをデザインに反映しています。 .NETがエラー回復ロジックを必要とする自立型アプリケーションを構築するために使用されるはるかに大きな可能性があります。

元の質問のバリエーション、いつ使用するのか、なぜデータベース制約を使用するのですか?コンパイル時にテーブル間の関係がわからない、つまりアプリケーション自体の一部として新しいテーブルが作成または削除された、非常に動的なデータベース構造を持つ場合に最も便利です。これは、大量のデータウェアハウス、データマイニング、または文字列理論のために必要となります。

0

、 (例えばADO.NET)あなたは のtry/catch内のあなたの データベースとの対話を配置し、それが適切な 例外をスローし、これはPHPの場合ですか?

これはPDOと同じですが...私はMysqliだと思っていますが、私は数年後にそれを使ってしまったので間違っていました。しかし、それはPDOExceptionをスローするだけです... 'duplicate key'または 'not null'などの特定の例外タイプはありません...例外のメッセージ/コードから解析する必要があります。

また、厳格なORM の使用は、データベースレベル 制約の必要性を否定するのですか?

私はそう言いません。 PHPでこれをエミュレートすれば、より多くのオーバーヘッドを持つことになるので、一般的にdbがこれを処理できるようにすることができます。

+0

ORMコメントの私の主張は、ORMを使用しているときにオーバーヘッドが既に存在していると思うということだと思うので、なぜデータベース自体に複製するのですか? – jondavidjohn

+0

ORMがどのように設計されているかによって異なります... Doctrine 1.2は、それを設定するか、db/engineがそれらをサポートしていない場合にのみエミュレートします。したがって、ネイティブサポートを持つdbを使用すると、その点でORMのパフォーマンスが向上します。 – prodigitalson

関連する問題