Dav*_* D. 52 database database-design database-schema
我想知道如何在数据库中设计月度订阅软件系统.这些系统广泛用于互联网,但我找不到很多关于数据库设计的东西.
就我而言,必须包括这些元素(也许还有其他一些我忘了):
除了数据库设计之外,还可能需要设置触发器才能执行此操作(?).
我的痛点:
注意
我自愿不公开我的需求,因为这样,辩论可以保持通用,对其他人更有用.
感谢帮助.
Cha*_*eur 58
我会用这个模型
你的客户
Client
------
Client ID
Name
...
Run Code Online (Sandbox Code Playgroud)
您的计划(您可以根据需要定义新计划).如果你想在一次拍摄中购买12个月(但这只是一个想法),你想提出折扣,我会加上Price_per_year.
Plan
------
Plan ID
Name
Credits_per_month
Price_per_month
(Price_per_year)
Run Code Online (Sandbox Code Playgroud)
您的订阅
Subscriptions
------
Subscription ID
Client ID
Plan ID
Subscription_start_timestamp
Subscription_end_timestamp
Run Code Online (Sandbox Code Playgroud)
考虑到这个模型,每个计划每个客户端使用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, Client ID: 1, Plan ID: 1, Start: 2014-06-07 08:00, End: 9999-12-06 07:59
Run Code Online (Sandbox Code Playgroud)
当客户取消订阅7月1日时,请仅使用月份和年份更新Subscription表中的列结尾(因为您已预先设置了日期和时间).
Subscription
------
ID: 1, Client ID: 1, Plan ID: 2, Start: 2014-05-07 08:00, End: 2014-06-06 07:59
ID: 1, Client ID: 1, Plan ID: 1, Start: 2014-06-07 08:00, End: 2014-07-06 07:59
Run Code Online (Sandbox Code Playgroud)
要知道客户是否未取消订阅,您可以使用:
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
Run Code Online (Sandbox Code Playgroud)
确保您不能同时为客户端订阅2个订阅.
这允许您自动处理应用中的每月订阅,但不能使用您的银行/ PayPal帐户.
但有些银行为您提供两种服务: - 独特借记 - 定期借记
第二个允许您处理每月订阅.
小智 15
查看已接受的答案,我将添加另一个表,其中将存储订阅或计划的所有更改或更新以供反向参考。通过这种方式,您可以清楚地记录在什么时间段选择了哪些计划和计划。
我会确保订阅表将包含变量,这些变量会告诉您它是否处于活动状态,付款日期以及您在日常操作中需要的任何其他可能的数据。
如果需要,额外的表将确保您能够在任何给定时间重新创建任何订阅。
我会使用关系表设计和关系数据库.
我会有一个客户表.
Client
------
Client ID
Client Last Name
Client First name
...
Run Code Online (Sandbox Code Playgroud)
我会有一个订阅表
Subscription
------------
Subscription ID
Client ID
Subscription Purchased Time stamp
Subscription Started Time stamp
Subscription Ends Time stamp
Run Code Online (Sandbox Code Playgroud)
我会有一张购买表
Purchase
--------
Purchase ID
Subscription ID
Payment method
...
Run Code Online (Sandbox Code Playgroud)
现在回答你的问题.你应该一次只问一个问题.
哪一个应该是DB中的一行:month_subscription(即每个客户每月1行)或订阅本身(即每个客户端1行)?
每个订阅每月一行.
您将如何处理每月订阅的自动续订?
Netflix每月都会扣除我的PayPal帐户.您可以使用PayPal或信用卡执行相同操作.如果您接受信用卡,则必须与银行,信用卡处理商或PayPal进行安排.
如果您预见到使用PayPal等服务来处理自动每月付款,您将如何处理付款设计?
Netflix每月都会扣除我的PayPal帐户.你也可以这样做.