4

我想知道用户注册的最佳实践。我倾向于将站点注册存储在单独的注册表中,然后在通过电子邮件确认注册后将数据传输到用户表。

这样做的好处是,从用户表中读取的内容不会因为从未激活的注册而变得混乱。另一个好处是电子邮件(用户名)字段在用户表中可以保持唯一,但如果您尝试使用不属于您的电子邮件地址进行注册,该电子邮件地址的所有者仍然可以将其注册为email 字段在注册表中不会是唯一的。

我想知道这是否是一种常见做法,或者是否有任何理由这不是一个好主意?

4

5 回答 5

2

在一种情况下,您可能会在逻辑上拆分这两个表:如果您的注册过程仅在您确认电子邮件地址后才询问大量强制性用户信息。例如,如果您的待处理注册表最终只有几列,例如电子邮件和激活密钥,而您的用户表有许多附加列,例如用户名、名字、姓氏、邮政地址等。

在这种情况下,拆分可能有意义,因为您可以声明这些列NOT NULL

不过,除此之外,我必须同意大多数其他答案;对我来说,这听起来像是过早的优化。具有相同结构的多个表是一个强烈的警告信号,表明你做错了。不明确,但强烈警告。

于 2009-05-18T17:46:05.960 回答
1

我认为那将是过度工程。

将它们全部存储在一个表中,并安排一个 SQL 查询(每天)以删除超过 30 天的未激活帐户。

于 2009-05-18T15:01:41.173 回答
1

激活与否

没有真正需要将用户存储在不同的表中。只需将所有用户存储在一个表中,并带有一个布尔标志,指示他们是否已激活。每隔一段时间运行一个 cron 作业来检查是否有 x 天前未激活的帐户并删除它们。

电子邮件

所以大概你是从电子邮件激活用户吧?您还想设置它,以便如果其他用户输入其他人的电子邮件,其他人仍然可以正确注册?这实际上很简单。在错误发送给他们的电子邮件中,只需一个链接即可从您的数据库中删除该电子邮件,因为显然不是他们,而且他们永远不会激活该帐户。

但是如果其他人只是删除它怎么办?

然后,当他们注册时告诉他们您已经拥有他们的电子邮件并提议再次发送激活,这封电子邮件也可以选择从数据库中删除它。

或者

只需从数据库中删除旧帐户即可。如果该人试图激活一个新帐户并且有一个从未激活过的旧帐户,则可以将其删除。

于 2009-05-18T15:02:46.133 回答
1

帮自己一个忙,把它放在一张桌子上。您只是没有足够的中止注册来解决性能问题(特别是如果您在 3 周后擦除它们)。

您对电子邮件地址的理由很愚蠢。没有人可能会因为虚假注册而阻止他们的电子邮件。

于 2009-05-18T15:29:44.207 回答
-1

出于关注点分离的原因,我同意这种做法:“注册过程”和“用户帐户”是两个独立的概念。

注册表将用于保持“注册过程”的状态。一旦该过程完成(一旦电子邮件被验证),该过程的“输出”将是一个新的“用户帐户”。如果该过程失败(例如,在用户 1 个月未能确认其电子邮件后“超时”),则对“用户帐户”概念没有影响。

正如在另一个答案中所说,在某些情况下这可能是过度工程,但它也可能是封装这两个独立概念的复杂性的有用方法。它也可以被视为与规范化原则相矛盾,但我相信您必须根据您的上下文在封装和规范化之间进行权衡。

于 2009-05-18T15:09:52.517 回答