我们正在推出一个网站(付费订阅),注册过程包括输入激活码。激活码打印在刮刮卡上,并通过离线渠道销售。其中一些卡是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)到期后,当用户尝试登录时,将要求她提供激活码
因此,不希望用户在需要时键入激活码。
答案 0 :(得分:3)
这还不错。但是,我建议您向tbl_user
添加两个字段:
tbl_user
----------------
id
name
status_id
activated_date
expiry_date
当然,activated_date
包含首次激活的日期,而expiry_date
包含它们到期的日期。每当他们购买新卡时,您还需要一个更新此expiry_date
的程序。此过程应处理两张日期重叠的卡片,因此用户不会在特定时间段内进行双倍付款。例如:
那里有十五天的重叠,因此用户的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中添加外键 - 这将指向用户当前的激活码记录,从而简化了需要查找当前状态的场景用户的访问权限这样,用户记录将始终直接引用其当前激活码,并且您仍然可以获得其先前代码的完整历史记录。