你会如何设计这个数据库?

时间:2009-11-02 10:43:01

标签: mysql database database-design data-structures

我们正在推出一个网站(付费订阅),注册过程包括输入激活码。激活码打印在刮刮卡上,并通过离线渠道销售。其中一些卡是1个月访问。其他人则为3个月和1年。激活码是唯一的10位随机数。

当访问权限到期时,用户可以购买另一张激活卡并通过输入新的激活码来扩展订阅。此外,如果他们要求,我们也应该能够扩展他们的订阅。例如,直到特定日期(例如,另外一周)。

考虑到上述信息,您将如何为user-activation_code关系设计数据库?你觉得这个设计好吗?

tbl_user
----------------
id
name
status_id

tbl_user_status
----------------
id
description

tbl_activation_code
----------------
activation_code
activation_code_type_id
activation_code_status_id
user_id
activated_date
expiry_date

tbl_activation_code_type
----------------
id
description

tbl_activation_code_status
----------------
id
description

更新:仅需要激活码:

1)初次注册时

2)当系统显示带有指向页面的链接的通知以输入激活码时,更接近访问过期日期(例如,7天)

3)到期后,当用户尝试登录时,将要求她提供激活码

因此,不希望用户在需要时键入激活码。

2 个答案:

答案 0 :(得分:3)

这还不错。但是,我建议您向tbl_user添加两个字段:

tbl_user
----------------
id
name
status_id
activated_date
expiry_date

当然,activated_date包含首次激活的日期,而expiry_date包含它们到期的日期。每当他们购买新卡时,您还需要一个更新此expiry_date的程序。此过程应处理两张日期重叠的卡片,因此用户不会在特定时间段内进行双倍付款。例如:

  • 卡1 - 9月1日至9月30日
  • 卡2 - 9月16日至10月15日

那里有十五天的重叠,因此用户的activated_date应该 9月1日,而他们的expiry_date应该 10月30日( 10月15日+ 15天)。

考虑到这一点,我会更改tbl_activation_code,因为expiry_date会变得有点误导。而是创建一个名为access_days的列,用于计算用户的expiry_date

另外,如果你想记住发行的卡片,即使没有激活,我也会将tbl_activation_code分成两个表:

tbl_activation_code
----------------
activation_code
activation_code_type_id
activation_code_status_id
access_days

tbl_activation
----------------
activation_code_id
user_id
activated_date

答案 1 :(得分:1)

我会考虑一些非规范化 - 目前,要确定用户当前是否具有访问权限,您必须在tbl_activation_code中查看该用户的潜在多条记录,以查看该用户是否有活动记录。

因此,可能值得在tbl_activation_code中添加代理IDENTITY / autonumber字段,并在tbl_user中添加外键 - 这将指向用户当前的激活码记录,从而简化了需要查找当前状态的场景用户的访问权限这样,用户记录将始终直接引用其当前激活码,并且您仍然可以获得其先前代码的完整历史记录。

相关问题