在数据库中设计月度订阅系统的良好实践

Dav*_* D. 52 database database-design database-schema

我想知道如何在数据库中设计月度订阅软件系统.这些系统广泛用于互联网,但我找不到很多关于数据库设计的东西.

就我而言,必须包括这些元素(也许还有其他一些我忘了):

  • 客户
  • 计划(如'基本'/'溢价').每个计划都有月度价格和一定数量的信用额度(例如:基本计划每月提供30个学分,保费计划无限制学分).
  • 积分是在应用程序中花费的虚拟货币.
  • 订阅/取消订阅的
  • 付款(请注意,由于折扣等原因,实际支付的价格可能与计划的基本价格不同)
  • ......?

除了数据库设计之外,还可能需要设置触发器才能执行此操作(?).

我的痛点:

  • 我不能一般地看到这个的全球设计是什么
  • 哪一个应该是DB中的一行:month_susbscrition(即每个客户每月1行)或订阅本身(即每个客户端1行)?
  • 您将如何处理每月订阅的自动续订?
  • 如果您预见到使用Paypal等服务来处理自动每月付款,您将如何处理付款设计?

注意

我自愿不公开我的需求,因为这样,辩论可以保持通用,对其他人更有用.

感谢帮助.

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

查看已接受的答案,我将添加另一个表,其中将存储订阅或计划的所有更改或更新以供反向参考。通过这种方式,您可以清楚地记录在什么时间段选择了哪些计划和计划。

我会确保订阅表将包含变量,这些变量会告诉您它是否处于活动状态,付款日期以及您在日常操作中需要的任何其他可能的数据。

如果需要,额外的表将确保您能够在任何给定时间重新创建任何订阅。

  • 下次分享表格设计;所以这会有帮助 (2认同)

Gil*_*anc 8

我会使用关系表设计和关系数据库.

我会有一个客户表.

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帐户.你也可以这样做.

  • 购买时间和开始时间不一样? (2认同)
  • 如果您在其他订阅结束之前续订或更改订阅。 (2认同)