2012-09-08 62 views
2

我有两种类型的人在我的网站上,用户和来宾。实际上它们是相同的,除了创建/认证过程。数据库设计:用户和来宾

目前我有两个表:

t_users 

userId[PRIMARY, AUTOINC] username[UNIQUE] 

t_guests 

guestId[PRIMARY, AUTOINC] userId 

当有人进入现场,脚本执行以下操作:

1)通过插入新行创建新的客户记录t_guests

2)使用上一步生成的guestId(guest用户名=“Guest guestId”)向t_users添加新记录

3)更新guest记录设置u serId在第2步分配

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

其实我只需要t_guests表的自动增量功能来为客人生成唯一的用户名。有没有办法只使用一个统一表并使用单个查询注册客人?

更新:我可以做下面的插入位客人在单个表:

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

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

但我不能肯定,没有人插入一个新的客人纪录t_users这两个的执行之间声明。而且我不能让guestId独一无二,因为真正的用户会将它等于零。

+1

为什么不在你的用户表中添加一个'type'列并指定你的用户类型('user','guest','admin'等)? – Blender

+0

“类型”列是一个选项,但它不能解决命名问题。我希望客人被命名为客人1,客人2,客人3等。 –

回答

1

如果你只是有1代表” 用户ID,用户名,类型

你可以使用你的脚本生成一个GUID和使用的用户名作为用户名,或者一些其它随机变量。如果您使用GUID这几乎是不可能的,你得到2个guid碰撞。

此外,如果你确实有2个用户名碰撞,如果你确保用户名列必须是唯一的,那么插入将失败,你可以再试一次。

你绝对有权在这里只有一张桌子