5

私は自分のBScプロジェクト用にかなり大きなWebアプリケーションを作成しており、MySQLを使用してPHPで作成しています。

SQLテーブルを作成するとき、一意のフィールドを使用する必要がありますか?私がこれを尋ねる理由は、検証メソッドをPHPに書き込んでいるためです。たとえば、電子メールアドレスがデータベースにすでに存在するかどうかを確認する場合は、最初にSQLステートメントを作成して、電子メールアドレスが返されるかどうかを確認してから、最初のSQLデータをデータベースに挿入します。

最初のSQLデータを挿入するだけの場合、電子メールアドレスは一意である必要があるため、ステートメント全体でエラーがスローされます。

これは検証に取り組む正しい方法ですか?

4

7 に答える 7

4

ええと...これらは2つのまったく異なるものです。データベースの列に制約(一意など)を設定することで、間違ったデータセットがデータベースに挿入されるのを防ぐことができます。これは、データの一貫性を確保するための基本的なことです。アプリケーションに検証を追加することにより、別のレイヤーを追加します。間違ったデータセットがデータベースに挿入されるのを防ぎながら、主にユーザーに間違ったことを伝える手段を作成します。

あなたはそれらの両方が必要です。また、一般に、データベースを管理するのは一意の制約だけではありません。外部キー制約も使用することをお勧めします。該当する場合は、より複雑なデータ検証も使用することをお勧めします(カスタム制約)。ただし、MySQLを使用しているため、実際に利用できるものはそれほど多くありません。

最終的に、データベース内のデータが間違っていることに最終的に気付くまで、特定のエラーが発生した理由を理解しようとする多くの頭痛の種を防ぐことができるので、できるだけ多くのことを行ってください。それは本当に苦痛かもしれません。

于 2013-03-03T19:24:54.037 に答える
1

データベースの制約のみが一意性を保証できるため、このアプローチはお勧めしません。

2つのリクエストが並行して実行されている場合、両方が同じ電子メールアドレスを受け入れることができ、同じ電子メールアドレスを持つ2人のユーザーがいます。

また、おそらくデータベースで検索フィルタリングを行うので、MySQLでは電子メールにインデックスを付ける必要があります。したがって、その列を一意にすることに大きな違いはありません。

于 2013-03-03T19:25:49.590 に答える
0

電子メールアドレスのフィールドにUNIQUE制約を作成することは、選択性が高いため最善のアプローチですが、フィールドをNOTNULLに設定することも忘れないでください。

制約を使用する方がはるかに優れていると思いますが、次のようなクエリを使用して実行することもできます。

SELECT COUNT(*) FROM table WHERE email = '$email'

主題の詳細:mysql5.0インデックス-ユニークvs非ユニーク

于 2013-03-03T19:35:12.157 に答える
0

はい、データベースはデータが正しいかどうかをチェックする必要があります。データベースは、どのようにしてそこに到達したかに関係なく、データを保持します。別のアプリケーションのデータベースを使用する場合がありますが、このアプリケーションではデータも検証する必要があります。アプリケーション(フロントエンドとバックエンド)とデータベースレベルの両方でデータが正しいかどうかを確認する方が安全です。

于 2013-03-03T19:26:14.423 に答える
0

多くの場合、それはコードがどこにあるべきかを考え出す場合です。これは、ダイクストラの「関心の分離」の例です。

フィールドを一意にするということは、次のことを意味します。

Don't need to write validation code, ergo ultimately you write less code

The validation for values in the database, is in a logical place; bound to the database!

これはデータモデリングの問題です。「このコードがどこにあるのが理にかなっているのか」と自問してみてください。私の意見では、データベースで一意の値を使用するのが正しい方法です。これは、PHPコードから検証を抽象化し、コアモデルロジックを変更せずに検証を変更できることを意味します。

于 2013-03-03T19:26:32.230 に答える
0

検証は、一般的にユーザーエクスペリエンスが向上するため、クライアント側(javascriptなど)で実行する必要があります。クライアント側をバイパスできるため、サーバー側で使用する必要があります。また、データベースに適用されない制約は制約ではないため、データベースに適用する必要があります...これは単なる提案です。

于 2013-03-03T19:28:35.537 に答える
-2

そしてある日、MySQLから他のデータベースに切り替えることにし、すべての「検証」が存在しなくなりました(たとえば、MongoDBなどのデータベースへの切り替え)。

これは行わないでください。アプリケーションレベルで行ってください。シンプルで、バージョン管理され、テスト可能などです。

ぜひとも-MySQLで独自のインデックスを作成してください。しかし、私はそれだけに頼ることはしません。

于 2013-03-03T19:32:41.427 に答える