我想知道如何在数据库中设计每月订阅软件系统.
这些系统在互联网上广泛使用,尽管我找不到关于数据库设计的很多东西.
这些系统在互联网上广泛使用,尽管我找不到关于数据库设计的很多东西.
在我的情况下,这些元素(也许还有一些我忘了)必须包括在内:
>客户端
>计划(如“基本”/“保费”).每个计划都有一个月的价格和一个学分(例如:基本计划每个月提供30个学分,保费计划无限制学分).
>积分是在应用程序中花费的虚拟资金.
>订阅/取消订阅
>付款(注意实际支付的价格可能与计划的基准价格有所不同,因为折扣等)
> …?
除了数据库设计之外,还可能有触发器需要设置这样做(?).
我的痛点:
>我看不到一般的方式,这是全球的设计
>哪个应该在DB中的一行:month_susbscrition(即每个客户端每月1行)或订阅本身(即每个客户端1行)?
>您如何处理每月订阅的自动续订?
>如果您预计使用像PayPal这样的服务来处理自动每月付款,您将如何处理付款设计?
注意
我自愿没有详细地披露我的需要,因为这样,辩论可以保持通用,对其他人更有用.
感谢帮助.
解决方法
我会用这个模型
你的客户
Client ------ Client ID Name ...
您的计划(您可以在需要时定义新计划).
如果客户一次性购买12个月(但只是一个想法),如果您想提出折扣,我添加一个Price_per_year.
Plan ------ Plan ID Name Credits_per_month Price_per_month (Price_per_year)
您的订阅
Subscriptions ------ Subscription ID Client ID Plan ID Subscription_start_timestamp Subscription_end_timestamp
考虑到这个模型,我将每个客户端每个计划使用1行.
当客户订阅“Premium with 1st month free!”时,您的数据库将如下所示:
Client ------ ID: 1; LastName: Foo; ... Plan ------ ID: 1; Name: Premium; Credits: -1 (unlimited); Price_per_month: 30 ID: 2; Name: Premium 1st month offer; Credits: -1; Price_per_month: 0 Subscription ------ ID: 1,Client ID: 1,Plan ID: 2,Start: 2014-05-07 08:00,End: 2014-06-06 07:59 ID: 1,Plan ID: 1,Start: 2014-06-07 08:00,End: 9999-12-06 07:59
当客户取消订阅7月1日时,请更新您的订阅表中的列,仅包含月份和年份(因为您已预先设定了日期和时间).
Subscription ------ ID: 1,End: 2014-07-06 07:59
要知道客户端是否不取消订阅,您可以使用:
Select Count(client.*) From Client client Inner Join Subscription sub On sub.client_id = client.id Where DATE_TODAY Between sub.start And sub.end
这允许您自动处理您的应用程序中的每月订阅,但不能与您的银行/ paypal帐户一起处理.
但有些银行为您提供两项服务:
– 独一无二的借记
– 定期借记
第二个将允许您处理每月订阅.