2010-08-03 75 views
2

我希望我的用户在能够登录之前激活他们的帐户。它们含激活链接,像这样的事情在注册后收到一封电子邮件:检查用户是否激活了他/她的帐户的最有效方法?

http://www.blabla.com/[email protected]&token=Aisd23uNMAu53932asdDasd82AS

当然,每当有人登录时,我不得不请检查是否或不是用户已经激活了他/她的账户。我能想到的2种方式来解决这个问题,无论是在我的“用户”表,其设置为空拥有一个额外的列,每当用户启动像这样:

----------------------------------------------- 
| id | username | password | activation_token | 
----------------------------------------------- 
| 1 | user1 | blabla |     | 
----------------------------------------------- 
| 2 | user1 | blabla | asd232DA34qADJs2 | 
----------------------------------------------- 

然后我提取activation_token与沿用户信息只要在用户登录或我可以只包含激活令牌一个单独的表,然后在“用户”表中加入每次用户登录:

-------------------------------------- 
| id | account_id | activation_token | 
-------------------------------------- 
| 1 | 37   | dsad2428491dka98 | 
-------------------------------------- 
| 2 | 2   | asd232DA34qADJs2 | 
-------------------------------------- 

那么,哪一个会最高效?谢谢你的时间。

编辑:感谢所有伟大的响应

+1

我会说,只要选择一个就可以了。规范化的版本会更容易实现。 – strager 2010-08-03 15:22:29

+2

规范化的表格将节省数据库中的一些空间,但成本是更复杂的SQL查询。两种解决方案都可以工作,所以只需选择一个。 – 2010-08-03 15:24:58

+1

正如其他人所说,因为这种激活只会发生在大多数情况下,任何帐户一次速度是微不足道的。 – Chris 2010-08-03 15:27:13

回答

4

就个人而言,我会做两者的结合...

------------------------------------- 
| id | username | password | status | 
------------------------------------- 
| 1 | user1 | blabla | 1  | 
------------------------------------- 
| 2 | user1 | blabla | 0  | 
------------------------------------- 

如果状态是TINYINT(1)场是0为停用的用户,以及1激活用户。这样,你可以很快地告诉用户的“状态”...

然后,将令牌存储在另一个表中(就像你已经有的那样)......这样,你不需要加入,或在未激活帐户时检查字符串列...

1

使用第一个选项 - 添加isactivated列到USERS表。

不需要单独的表格 - 这是一对一的关系。

1

在Users表中存储令牌而不是单独的表将意味着您不必在每次查询期间加入它们,这会稍微快一些。

此外,您不存储userIds并为该令牌表创建新的Id,这将保存在数据存储上。

1

我会有一个整数字段,激活,默认为0.当有人尝试验证时,您只会查找激活的帐户。我将验证令牌存储在您所描述的单独的表格中。

1

如果关系是1-1(例如,激活表每个帐户id将有1行),那么执行完全标准化的2表方法是矫枉过正。

这两种方法都不存在重大问题,但是1表格更容易。

如果你使用2表方法,你应该在用户表中存储“已激活”的yes/no标志,所以你不需要加入到第二个表用户登录的目的。

0

我不认为有必要将激活令牌存储在数据库中。就像md5('users @ email'。'secret')将会工作得很好。至于用户状态,我同意他人,在用户表中使用单独的专用“状态”列。另一个优点是,这一列可以存储其他人(例如“禁止”)

1

如果激活令牌仅用于验证'点击此处激活您的帐户'链接并且不再使用,那么在您的用户表中浪费存储char(32)(或其他任何东西)字段的空间并没有意义。将激活令牌放置在您的帐户激活脚本可在用户点击激活时引用的单独表格中。激活完成后,您可以从该单独的表中删除该令牌的记录。

在用户表中放置一个'is_activated'布尔/位字段,您的登录脚本可以在登录过程中检查(并输出“嘿,您还没有激活”错误,如果字段的空/错误)。

当然,现在磁盘空间很便宜。即使每百万用户拥有一个32位激活令牌,也只会浪费32美元的空间。一个TB的驱动器价格低于100美元,这是磁盘的0.00305%,并且本质上是0.00美元的成本(0.305美分)。

+0

但是然后我可能以及将激活令牌存储在用户表中?如果我已经计划存储'is_activated'布尔/位字段,那么我已经在使用额外的列“已保存” – 2010-08-03 18:32:34

+0

表中的列数通常不是问题。这是列的空间量。 MySQL中的单个位字段占用至少1个字节的空间(1-7位字段= 1字节,8-15位字段= 2个字节,e tc ...),而固定字符(32)则为32字节。因此,为代码创建一个单独的表可以节省每条记录31个字节,并且只在激活过程处于活动状态时占用空间。 – 2010-08-03 19:14:11

+0

我明白了,谢谢! – 2010-08-03 19:45:15

0

在我看来,不是将激活码存储在用户表中,而是保留一个标志,默认情况下将其设置为关闭。当用户点击任何激活链接时,更新表格并设置标志。

登录前检查该标志是否打开。 如果标志关闭,则用户没有点击激活链接。那么你可以给用户一个错误信息。

如果标志处于打开状态,则用户可以成功登录。

相关问题