3

私のサイトには、ユーザーとゲストの 2 種類の人がいます。作成/認証プロセスを除いて、実質的には同じです。

現時点では、2 つのテーブルがあります。

t_users

userId[PRIMARY, AUTOINC] username[UNIQUE]

t_guests

guestId[PRIMARY, AUTOINC] userId

誰かがサイトに入ると、スクリプトは次のことを行います。

1) t_guests に新しい行を挿入して、新しいゲスト レコードを作成します。

2) 前のステップで生成されたゲスト ID (ゲスト ユーザー名 = 「ゲスト ゲスト ID」) を使用して、t_users に新しいレコードを追加します。

3) ステップ 2 で割り当てられたゲスト レコード設定の userId を更新します。

多くの脆弱性が含まれているため、このデータベース設計はひどいものだと思います。たとえば、ユーザー名 "Guest xyz" が t_users テーブルに既に存在する場合、ステップ 2 は失敗し、ステップ 3 は userId に間違った値を割り当てます (実装によっては、ステップ 1 で割り当てられた 0 またはゲスト ID になります)。

実際には、ゲストの一意のユーザー名を生成するための自動インクリメント機能に t_guests テーブルのみが必要です。統合テーブルを 1 つだけ使用し、単一のクエリを使用してゲストを登録する方法はありますか?

更新:次のようにして、単一のテーブルにゲストを挿入できます。

SELECT @mg := IFNULL(MAX(guestId), 0) + 1 FROM t_users;

INSERT INTO t_users (guestId) VALUES(@mg);

しかし、これら 2 つのステートメントの実行の間に t_users に新しいゲスト レコードを挿入する人がいないことは確かではありません。また、guestId を一意にすることはできません。実際のユーザーはそれをゼロにするからです。

4

1 に答える 1

1

「ユーザーID、ユーザー名、タイプを持つテーブルが1つしかない場合

ユーザー名については、スクリプトを使用して Guid を生成し、それをユーザー名またはその他の確率変数として使用できます。GUID を使用する場合、衝突する 2 つの GUID を取得することは事実上不可能です。

また、ユーザー名列が一意でなければならない場合に衝突する 2 つのユーザー名がある場合、挿入は失敗し、再試行できます。

あなたは間違いなくここにテーブルを1つだけ持っているべきです.

于 2012-09-08T06:03:50.510 に答える