Mysql 数据库设计:注册和验证
将未经验证的用户放入Mysql 数据库设计:注册和验证,mysql,database-design,Mysql,Database Design,将未经验证的用户放入users\u表是一个不错的选择,还是我应该制作一个temp\u users\u表来添加未经验证的用户 第一个选项是在users\u表上创建一行,其中包含一列,例如,account\u activated以保存一个整数,该整数定义帐户是否已验证 第二个选项是有两个相同的表,users\u table和temp\u users\u table。在最后一个服务器上添加未验证的用户。验证后,该行将复制到users\u表,并从temp\u users\u表中删除 哪一个更好,为什么
users\u表
是一个不错的选择,还是我应该制作一个temp\u users\u表
来添加未经验证的用户
第一个选项是在users\u表
上创建一行,其中包含一列,例如,account\u activated
以保存一个整数,该整数定义帐户是否已验证
第二个选项是有两个相同的表,users\u table
和temp\u users\u table
。在最后一个服务器上添加未验证的用户。验证后,该行将复制到users\u表
,并从temp\u users\u表
中删除
哪一个更好,为什么
编辑:
第二个表并不意味着永远留在那里,它是临时的,只会在用户未激活时存在。当用户被激活时,它将被迁移到“主”用户表
因此:
始终取决于具体情况,但我很难找到在什么情况下使用双表解决方案是有意义的。同意erikkallen的观点 两个相同的表格是冗余设计的最佳实践。检查例如(伪代码)没有多大意义: 这种替代方法速度更快,而且最重要的是,它不需要冗余表
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个查询
哪一个更快?;-) 根据所提供的信息,我肯定会支持单表/额外列解决方案,除非有明确的理由这样做。使用两个表的主要缺点是,使用冲突或不匹配的用户ID极易损坏数据库,尤其是在ID自动递增的情况下。您必须非常小心如何将用户从未验证表移动到已验证表。另一方面,对于一个表,您唯一的代码更改将是在只希望对已验证或未验证的用户运行查询的情况下,为已验证/未验证的用户添加筛选器。例如,选择进行登录检查。如果有任何以上未提及的原因会引导您使用两个表格,请告诉我们。我从不同的角度来看这一点 在您的情况下,一张桌子可能就足够了。但还有其他考虑 1) 音量。在一个小表中,对标志进行过滤不会显著影响性能。在一个大表(数百万行)中,必须将该标志放在索引中。在大型表的索引中放置低基数标志可能会降低性能 2) 缺陷。表中有一个标志要求几乎每个查询都使用该标志。对于一个足够大或足够复杂的系统,有人会错过这面旗帜。确定风险取决于意外选择未激活用户的成本
降低风险的一种方法是使用视图。如果实现两表解决方案,请使用UNION All使用视图(所有用户)。如果实现了单表解决方案,请仅为激活的用户创建一个视图,并改用该表。只有维护功能需要修改核心表。有一种情况下,2表解决方案似乎对我仍然有效。如果必须保存部分填写的表单,则允许最终用户重新登录并完成该过程。这样做的一个原因是部分填充必须允许空值存储在表中,因此不能加载到主表中(表2)。因此,需要创建副本表(表1) 这样:
- 表1:未验证用户+部分填写表单的用户李>
- 表2:已验证的用户,填写完整的表格
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";
}