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

时间:2014-05-07 01:25:42

标签: database database-design database-schema

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

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

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

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

我的痛点:

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

注意

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:47)

我会使用这个模型

您的客户

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, Client ID: 1, Plan ID: 1, Start: 2014-06-07 08:00, End: 9999-12-06 07:59

当客户取消订阅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

要知道客户是否未取消订阅,您可以使用:

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

确保您不能同时为客户订阅2个。

这样您就可以自动处理应用中的每月订阅 ,但不能使用您的银行/ PayPal帐户。

但有些银行为您提供两项服务:   - 独特的借记卡   - 定期借记

第二个允许您处理每月订阅。

答案 1 :(得分:8)

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

我会有一个客户表。

Client
------
Client ID
Client Last Name
Client First name
...

我会有一个订阅表

Subscription
------------
Subscription ID
Client ID
Subscription Purchased Time stamp
Subscription Started Time stamp
Subscription Ends Time stamp

我会有一个购买表

Purchase
--------
Purchase ID
Subscription ID
Payment method
...

现在回答你的问题。你应该一次只问一个问题。

  

哪一个应该是DB中的一行:month_subscription(即每个客户每月1行)或订阅本身(即每个客户端1行)?

每月订阅一行。

  

您如何处理每月订阅的自动续订?

Netflix每个月都会扣除我的PayPal帐户。您可以使用PayPal或信用卡执行相同操作。如果您接受信用卡,则必须与银行,信用卡处理商或PayPal进行安排。

  

如果您预计使用PayPal等服务来处理自动每月付款,您将如何处理付款设计?

Netflix每个月都会扣除我的PayPal帐户。你也可以这样做。

答案 2 :(得分:1)

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

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

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