1

メインテーブルから「username」という名前のすべてのユーザーを含むフィールドを別のテーブルにリンクまたは追加して、メインテーブルに大量の行を追加せずにチェックを実行して値を比較するにはどうすればよいですか? これは、はるかにクリーンでより組織化されたセットアップになります。

login_users というテーブル。これは、基本情報を格納するメイン テーブルです。

username       email                 password
Anthony        user@email.com
Josh           user@email.com
Tsuyoshi       user@email.com

Badge_status と呼ばれる表 2。この表は、私のサイトで実績のロックを解除したかどうかでステータスを保持します。ユーザー名を取り込みたい。

username       badge1               badge2
Anthony        locked               unlocked
Josh           unlocked             locked
Tsuyoshi       unlocked             locked

また、すべての新しいサインアップが最初のテーブルにインポートされるため、サインアップ時にテーブル 2 が新しいユーザーで自動的に更新される可能性があります。補足として、私はphpmyadminを使用しています。

このセットアップを手伝ってくれてありがとう。非常に高く評価。

4

2 に答える 2

9

代わりに次のスキーマを使用してデータを正規化する必要があると思います。

  • login_users [テーブル]
    • ユーザー名
    • Eメール
    • パスワード
  • バッジ[表]
    • BadgeId int 主キー
    • バッジの名前
    • ... (その他の関連する列)
  • users_badges [表]
    • login_usersユーザー名 (テーブルのユーザー名列への外部キー制約)
    • BadgeId (テーブルの BadgeId 列に対する外部キー制約badges)

これにより、データベース スキーマやスクリプトを変更することなく、必要な数のバッジを追加できます。

于 2012-11-06T18:40:33.293 に答える
2

これらの表を分けている理由がよくわかりません。理論的には、両者の間には 1 対 1 の関係があります。「すべての新しいサインアップが最初のテーブルにインポートされるため、サインアップ時に新しいユーザーでテーブル 2 が自動的に更新される可能性があります」というクエリは、これらのテーブルを分割すると不要なオーバーヘッドが発生する理由をさらにサポートします。

badge_status.usernameオーバーヘッドの他の原因には、データを取得するための非常に複雑な JOIN や、外部キーだけでなく一意の制約を追加する必要性などがあります。


これらのテーブルを本当に分離したい場合は、代わりに次の設定をお勧めします。これにより、特定のバッジのクエリと新しいバッジの追加が非常に簡単になります。

login_users: ユーザー名、電子メール、パスワード、...
バッジ: ID、名前、説明、...
users_badges: ユーザー名、バッジ ID、ステータス、unlocked_date、...
于 2012-11-06T18:37:33.920 に答える