我们刚刚进入了一个为我们的客户提供订阅的Web应用程序的规划阶段 . 订阅期有所不同,可以由我们的客户无限期延长,但始终至少一个月(30天) .
当客户注册时,客户信息(账单地址,电话号码等)存储在 customers
表中,并在 subscriptions
表中创建订阅:
id | start_date | end_date | customer_id
--------------------------------------------------------
1 | 2010-12-31 | 2011-01-31 | 1
每个月我们都会循环遍历 subscriptions
表(最好是cronjob)并为过去的订阅期创建发票,这些发票存放在他们自己的表中 - invoices
. 根据客户的不同,发票可以手动打印出来并通过邮件发送,或者只是通过电子邮件发送给客户 .
由于我们的客户和产品的性质,我们需要提供各种不同的支付方式,包括电汇和卡支付,因此一些发票可能需要手动处理并注册为我们的员工支付 .
每月15日, invoices
表都会循环播放,如果没有为实际发票标记付款,则相应的订阅将被删除 . 如果已注册付款,则 subscriptions
表中的 end_date
将再增加30天(或现在我们客户选择的时间段) .
我们是通过增加日期向前和向后来处理非付费客户和扩展订阅来看待头痛吗?随着客户扩展订阅,添加新订阅会更好吗?
4 回答
我工作的其中一个应用程序遇到了这个问题,我们通过跟踪用户的订阅但没有跟踪到期日期来解决这个问题 . 然后,我们跟踪他们应该在他们的帐户上收费的日期 - 所以如果我们想看看有人订阅了什么,我们就可以检索他们帐户的最新订阅记录,如果我们想查看下次他们'd be billed, we' d只检查他们的
next_bill_date
.通过这种方式,您可以跟踪用户的订阅并查看他们何时升级/降级,但您的结算代码保持简单 - 您永远不必担心重叠(因为订阅没有结束日期来处理) .
只要您只有一个订阅类型,我认为没有必要为单个客户创建多个订阅记录 . 如果结算周期始终是固定价格的月度,则更改订阅end_date就足够了 . 您需要知道的是,当他的订阅耗尽时,您可以停止开具发票 . 因此,如果他扩展了他的订阅,您只需更新一个记录,以便下个月恢复结算 .
此外,我认为标记未付费订阅而不是删除它们会更好 . 如果客户错过了每月付款,请将订阅标记为未付款,以便停止将来的发票(和服务) . 当/如果他们支付,您取消订阅,以便恢复服务/下个月的发票 .
我会使用订阅表来跟踪订阅 . 这意味着,当客户扩展其订阅时,会插入新记录 .
此外,我将在customer表中添加一个subscription_end日期列,以便在插入新订阅时通过触发器进行更新 .
虽然这是非规范化,但这种方法将允许您的Web应用程序在没有任何连接的情况下检查客户对服务的访问权限(减少数据库服务器负载) . 实际上,只有批处理才能查询订阅表 .
此外,保留订阅历史记录可能很有用
如果与客户发生争执,
如果企业的业务逻辑发生变化(例如根据保真度给予最佳客户折扣)
用于未来统计
当您的用户群和订阅历史记录变得庞大时,您可以决定通过以方便的格式导出来定期备份(我将始终使用xml,但我使用首选csv的某些企业) .
为了跟踪单个客户的订阅历史记录,我会说最好添加新的订阅 .
你也可以省去弄清楚,为什么3月30日订购的订阅会在3月到期(你知道,2月是最短的一个月......) .