サイト登録はアクティブ ユーザーとは別のテーブルに保存する必要がありますか?
-
22-08-2019 - |
質問
ユーザー登録のベストプラクティスについて疑問に思っています。私は、サイトの登録を別の登録テーブルに保存し、電子メールでサインアップが確認されたら、データをユーザー テーブルに転送する方法に傾いています。
この利点は、users テーブルからの読み取りがアクティブ化されていない登録で乱雑にならないことです。もう 1 つの利点は、電子メール (ユーザー名) フィールドが users テーブル内で一意のままであることができますが、自分が所有していない電子メール アドレスで登録しようとしても、その電子メール アドレスの所有者は依然としてその電子メール アドレスに登録できることです。電子メールフィールドは登録テーブル内で一意ではありません。
これが一般的な慣行なのか、それともこれが良い考えではない理由があるのか疑問に思っています。
解決
アクティブ化されているかどうか
ユーザーを別のテーブルに保存する必要は実際にはありません。すべてのユーザーを 1 つのテーブルに保存し、アクティブ化されているかどうかを示すブール フラグを付けるだけです。時々、cron ジョブを実行して、x 日前にアクティブ化されていないアカウントがあるかどうかを確認し、それらを削除します。
Eメール
つまり、電子メールからユーザーをアクティブ化していると考えられますよね?また、別のユーザーが他人の電子メールを入力した場合でも、その他人が正しく登録できるように設定したいと考えていますか?それは実際にはかなり簡単です。誤って送信された電子メールには、その電子メールをデータベースから削除するためのリンクだけを含めてください。明らかにそれは彼らではなく、彼らがアカウントをアクティブにすることはありません。
しかし、他の人がそれを削除した場合はどうなるでしょうか?
その後、登録時に、既に電子メールを持っていることを伝え、アクティベーションを再度送信するよう申し出ると、この電子メールにはデータベースから削除するオプションも含まれます。
または
古いアカウントをデータベースから削除するだけです。その人が新しいアカウントをアクティベートしようとしていて、一度もアクティベートされていない古いアカウントがある場合は、それを削除するだけで済むのは当然です。
他のヒント
私は、エンジニアリング上だと思います。
1つのテーブルにそれらのすべてを保存し、30日より前のactivedないアカウントを削除するには、SQLクエリー(毎日)スケジュール。
自分に好意を行うと、それを単一のテーブルを保持します。あなただけ(あなたは3週間後にそれらを拭く場合は特に)遊びに来て、パフォーマンスの問題のために十分に中止されまし登録を持っているつもりはない。
の電子メールアドレスについてのあなたの正当化は愚かです。誰もが自分の電子メールは、偽の登録によってブロックを取得する可能性がありません。
あなたは論理的に2つのテーブルを分割したいケースは、この1つがあるかもしれません。たとえば、保留中の登録テーブルには、このようなテーブルは、など、ユーザ名、姓、名、住所、など、多くの追加の列を持っているユーザーに対し、電子メールおよびアクティベーションキーなど少数の列で羽目になるならば
あなたはそれらの列のNOT NULL
を宣言することができるだろうとのスプリットが、その場合には意味をなさないかもしれません。
それ以外は、しかし、私は他の回答のほとんどに同意する必要があります。それは私には時期尚早の最適化のように聞こえます。同じ構造を持つ複数のテーブルにを強い警告サインであるウルはそれが間違ってdoinの。の明確ではないが、強い警告ます。
私は懸念の理由の分離のためにこのような行為に同意します。
登録テーブルは、「登録処理」のステータスを保持するために使用されます。 そのプロセスは、(メールが検証された後)完了すると、プロセスの「出力が」新しい「ユーザーアカウント」になります。 (ユーザーが1ヶ月のための彼の電子メールを確認するために失敗した後に例えば、それは「タイムアウト」)プロセスが失敗した場合は、「ユーザーアカウント」という概念には影響はありません。
は別の答えで述べたように、これはいくつかのケースでは、エンジニアリングを超えることができますが、それはまた、これらの2つの別々の概念の複雑さをenapsulateするのに便利な方法です。また、正規化の原則に反するとして見ることができるが、その後、私はあなたの状況に応じて、カプセル化し、正規の間のトレードオフを選択する必要があります信じています。