数据库设计:注册和验证

时间:2009-11-09 08:30:38

标签: mysql database-design

将未经验证的用户加入users_table或者我应该temp_users_table添加未经验证的用户是不是一个好的选择?

第一个选项是使用列在users_table上创建行,例如,account_activated保存一个整数,用于定义帐户是否已经过验证。

第二个选项是拥有两个相同的表,users_tabletemp_users_table。在最后添加未经验证的用户。验证后,该行将被复制到users_table并从temp_users_table卸下。

哪一个更好,为什么?

编辑:

第二个表并不意味着永远呆在那里,它是临时的,只有在用户未被激活时才存在。激活用户后,它将被迁移到“main”user_table。

所以:

users_table: Will have the users that have been verified.
temp_users_table: Will have ONLY the users that are not verified.

5 个答案:

答案 0 :(得分:2)

我从不同的角度看待这一点。

在你的情况下,一张桌子可能已经足够好了。但还有其他一些考虑因素。

1)音量。在小表中,对标志进行过滤不会显着影响性能。在一个大表(数百万行)中,您必须将标志放在索引中。将低基数标记放在大表的索引中可能会降低性能。

2)缺陷。在表中有一个标志要求几乎每个查询都使用该标志。对于足够大或足够复杂的系统,有人会错过那面旗帜。确定风险取决于意外选择未激活用户的成本。

降低风险的一种方法是使用视图。如果实现两个表解决方案,请使用UNION ALL视图(All_Users)。如果实现一个表解决方案,请仅为激活的用户创建一个视图,然后使用该表。只有维护功能需要修改核心表。

答案 1 :(得分:1)

有一种情况,2表解决方案似乎对我有效。如果您必须为部分填充的表单执行SAVE,则允许最终用户重新登录并完成该过程。这样做的一个原因是部分填充必须允许将空值存储在表中,因此不能加载到主表中(表2)。因此需要创建一个副本表(表1)。

这样:

  • 表1:未经验证的用户+部分填写表单的用户。
  • 表2:经过验证的用户,表格填写完整。

答案 2 :(得分:0)

总是取决于具体情况,但我很难找到完成两个表解决方案的情况。

答案 3 :(得分:0)

同意erikkallen

两个相同的表是冗余设计的最佳实践。检查例如,没有多大意义(伪代码):

sql = Sql("SELECT * FROM db_unactivated_users WHERE user_id = X");
sql2 = Sql("SELECT * FORM db_activated_users WHERE user_id = X");
if (sql)
 {
  return "user not activated";
 }
elseif (sql2)
 {
  return "user activated";
 }
else
 {
  return "user not found";
 }

这种替代方案要快得多,最重要的是,不需要冗余表

sql = Sql("SELECT * FROM db_users WHERE user_id = X");
if (sql[activated] = 0)
 {
  return "user not activated";
 }
elseif (sql[activated = 1)
 {
   return "user activated";
 }
else
 {
  return "user not found";
 }

我希望你看到差异; - )

并且最重要的是,如果您需要将用户状态从“未激活”更改为“已激活”,则无需将其从未激活表中删除,暂时保存其信息并再次将其写入激活表

使用一个表,只需将0更改为1即可!

所以,基本上这是简单的数学:

2个表= 2个查询 1表= 1查询

哪一个更快? ; - )

答案 4 :(得分:0)

根据给出的信息,我肯定会争论一个表/额外列解决方案,除非有明确的理由不这样做。使用两个表的主要缺点是,使用冲突或不匹配的用户ID来破坏数据库将非常容易,尤其是当您的ID自动递增时。您必须非常小心如何将用户从未验证的表移动到已验证的表。另一方面,对于一个表,您唯一的代码更改将是在您只想对已验证或未验证的用户运行查询的情况下为已验证/未验证的用户添加过滤器。例如,用于登录检查的SELECT。如果有任何上述原因导致您使用2张牌,请告诉我们。