数据库设计:用户和访客

时间:2012-09-08 05:49:58

标签: mysql sql authentication login user-registration

我的网站上有两类人,用户和来宾。实际上它们是相同的,除了创建/授权过程。

目前我有两张桌子:

t_users

userId[PRIMARY, AUTOINC] username[UNIQUE]

t_guests

guestId[PRIMARY, AUTOINC] userId

当某人进入该网站时,脚本会执行以下操作:

1)通过向t_guests

添加新行来创建新的访客记录

2)使用上一步生成的guestId(guest username =“Guest guestId”)将新记录添加到t_users

3)更新在第2步分配的访客记录设置userId

我觉得这个数据库设计很糟糕,因为它包含很多漏洞。例如,如果t_users表中已经存在用户名“Guest xyz”,则步骤2将失败,步骤3将为userId分配错误的值(取决于实现它将为0或guestId,在步骤1中分配)。

实际上我只需要t_guests表来实现其自动增量功能,即可为guest虚拟机生成唯一的用户名。有没有办法只使用一个统一表并使用单个查询注册客户?

更新:我可以执行以下操作以在一个表中插入来宾:

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

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

但我无法确定,没有人在执行这两个语句之间在t_users中插入新的guest记录。而且我无法使guestId独一无二,因为真正的用户将其等于零。

1 个答案:

答案 0 :(得分:1)

如果你只有一张表“ userID,用户名,类型

对于用户名,您可以使用脚本生成Guid并将其用作用户名或其他随机变量。如果您使用GUID,则几乎不可能有2个guid碰撞。

此外,如果您确实要确保用户名列必须是唯一的,则确实有2个用户名发生冲突,那么插入将失败,您可以再试一次。

你肯定要在这里有一张桌子。