如何更好地组织数据库以考虑用户的状态变化

时间:2012-08-23 16:17:57

标签: database database-design

我关注的用户可以是“未经证实”或“已确认”。后者意味着他们获得完全访问权限,前者意味着他们在主持人批准后待审。我不确定如何设计数据库来解释这种结构。

我想到的是有两个不同的表:confirmedUser和unconfirmedUser非常相似,只是unconfirmedUser有额外的字段(例如“emailConfirmed”或“confirmationCode”)。这有点不切实际,因为当用户被接受时我必须复制所有信息(虽然我认为它不会那么糟糕 - 不要期待大量流量)。

我想象的第二种方法是实际将所有用户放在同一个表中,如果需要,可以使用额外的“未经证实的”数据来获取表的密钥(也许还会在用户中添加“已确认”标志表)。

每种方法的缺点有哪些优点,是否有更好的方法来设计数据库?

4 个答案:

答案 0 :(得分:5)

第一种方法意味着你需要为两个表编写每个查询 - 用于所有常见的事情。坏(tm)。第二种选择肯定更好。这样,您可以根据特定访问权限添加简单的where confirmed = True(或False)。

您实际可以思考的是,确认的数据(不是用户,只是数据)是否存储在同一个表中。将所有确认数据放在一个单独的表中可能会更清晰+规范化,以便left join confirmation on confirmation.userid = users.id where users.id is not null (或类似,或内部联接,或者在服务器端脚本中获取所有+过滤器等)只获得确认的用户。确认电子邮件,日期等附加数据可以存储在此处。

答案 1 :(得分:3)

就个人而言,我会选择第二个选项:1个用户表,其中包含boolean类型的已确认/待定列。将数据从一个表复制到另一个表是不切实际的。

然后,您可以创建组并为每个组附加特定的访问权限,并在需要时将每个用户分配到特定的组。

答案 2 :(得分:3)

逻辑上,这是继承(也就是类别,子类,子类型,泛化层次等)。

从物理上讲,继承可以通过3种方式实现,如hereherehere以及可能在SO上的许多其他地方。

在这种特殊情况下,同一个表中所有类型的策略似乎最合适 1 ,因为层次结构很简单,不太可能获得新的子类,子类只有少数几个字段而你需要维护父级别的密钥(即未经证实和确认的用户不应该有重叠的密钥)。


1 I.e。你问题中提到的“第二种方式”。是否也将确认数据放在同一个表中取决于所需的基数 - 即那里是否存在1:N关系?

答案 3 :(得分:1)

最好的方法是为状态ID为外键的用户创建一个表,状态表将包含所有不同类型的确认,以及您可能拥有的所有不同组合。在我看来,这是构建规范化数据库和编程需求的最佳方法。

所以你的状态表看起来像这样

StatusID | Description
=============================================
1        | confirmed
2        | unconfirmed
3        | CC confirmed
4        | CC unconfirmed
5        | acct confirmed CC unconfirmed
6        | all confirmed

用户表

userID | StatusID
=================
456    |    1
457    |    2
458    |    2
459    |    1

如果您需要确认码,可以将其存储在用户表中。并在使用后对其进行编程以便更改,以便在需要重置密码时可以使用相同的字段。

也许我假设太多了?