2009-05-18 36 views
3

我想知道用户注册的最佳做法。我倾向于在单独的注册表中存储站点注册,然后一旦通过电子邮件将注册数据传输到用户表中,就可以确认注册。网站注册应该存储在活动用户的单独表格中吗?

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

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

回答

1

激活或未经

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

电子邮件

那么想必你是从激活电子邮件权限的用户?你还想设置它,这样如果其他用户输入了别人的电子邮件,其他人仍然可以正确注册?这实际上很简单。在错误地发送给他们的那封电子邮件中,只需链接即可从数据库中删除该电子邮件,因为显然这不是它们,他们也不会激活该帐户。

但是如果其他人只是删除它呢?

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

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

1

我认为这将超过工程。

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

+0

它甚至不必每天都在。你可以一个月左右做一次。除非您非常受欢迎或者永远不清除,否则您不会看到积聚的未激活帐户会减慢您的处理速度。每月做一次,或每年一次。 – Malfist 2009-05-18 16:16:24

-1

我同意这种做法的分离的担忧理由:“注册过程”和“用户帐户”是两个单独的概念。

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

正如在另一个答案中所说的,在某些情况下,这可能超过工程设计,但它也可以是一个有用的方法来诠释这两个单独概念的复杂性。它也可以被看作是矛盾的规范化原则,但是我相信你必须根据你的上下文选择封装和规范化之间的权衡。

+0

如果我的用户使用绿色汽车而不是红色汽车,该怎么办?我需要创建一个单独的表格来保持不同颜色汽车的两个概念分开吗?因为红色汽车与绿色汽车完全不同。 – Malfist 2009-05-18 15:14:30

+0

@Malfist:两辆只有不同颜色的汽车仍然具有相同的数据和行为,因此不需要将它们分开(这会导致复制粘贴程序)。但就汽车而言,我可以有不同的概念:汽车本身,购买合同,汽车注册,保险合同,维修。当我使用汽车时,修理过程无关紧要,只有修理的最终结果(汽车正常工作)。 此外,它可能是有意义的(在某些系统中)为Bus,SUV提供单独的概念,这可能会将继承用于常见行为。 – ckarras 2009-05-18 15:39:17

1

帮你一个忙,把它放在一张桌子上。你只是不会有足够的性能问题注册中止注册(尤其是如果你在3周后擦除它们)。

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

1

可能会出现以下情况:您在逻辑上将两个表格分开:如果注册过程仅在确认电子邮件地址后才会询问大量强制用户信息。例如,如果您的待定注册表只包含几列(如电子邮件和激活密钥),而您的用户表有许多其他列(如用户名,名字,姓氏,邮政地址等)

在这种情况下,拆分可能是有意义的,因为您可以声明这些列NOT NULL。然而,除此之外,我必须同意大多数其他答案;但是,我不得不同意其他答案。这听起来像是对我来说过早的优化。多个相同结构的表格是一个强烈的警告标志,你做错了。不确定,但强烈的警告。

相关问题