数据库设计:用户和访客

3

我网站上有两种用户类型:注册用户和访客。实际上,它们几乎相同,除了创建/认证过程。

目前我有两个表:

t_users

userId[PRIMARY, AUTOINC] username[UNIQUE]

t_guests

guestId[PRIMARY, AUTOINC] userId

当有人进入网站时,脚本将执行以下操作:
1)通过向t_guests插入新行创建新的访客记录。
2)使用上一步生成的guestId将新记录添加到t_users中(访客用户名=“Guest guestId”)。
3)更新访客记录,设置分配给步骤2的userId。
我认为这种数据库设计很糟糕,因为它包含许多漏洞。例如,如果用户名“Guest xyz”已经存在于t_users表中,则第2步将失败,并且第3步将为userId分配错误的值(取决于实现,它将是0或在步骤1中分配的guestId)。
实际上,我只需要t_guests表的自动递增功能来生成唯一的访客用户名。是否有一种方法可以仅使用一个合并的表格,并使用单个查询注册访客?
更新:我可以执行以下操作以在单个表中插入访客:
SELECT @mg := IFNULL(MAX(guestId), 0) + 1 FROM t_users;

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

但是我不能确定,在这两个语句的执行之间,没有人插入一个新的客户记录到 t_users 表中。而且我也不能将 guestId 设为唯一值,因为真正的用户会将其设为零。


1
为什么不在您的“用户”表中添加一个“类型”列,并指定您的用户类型(“用户”,“访客”,“管理员”等)呢? - Blender
“type”列是一个选项,但它不能解决命名问题。我希望客人的名称为Guest 1,Guest 2,Guest 3等。 - Denis Kulagin
1个回答

1
如果您只有一个包含“userID,username,type”的表格,
对于用户名,您可以使用脚本生成GUID并将其用作用户名,或者使用其他随机变量。如果使用GUID,则几乎不可能发生2个GUID冲突。
此外,如果您确实有2个用户名冲突,如果确保用户名列必须是唯一的,则插入将失败,然后您可以再次尝试。
在这里,您绝对应该只有1个表格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接