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


72

我想知道如何在数据库中设计每月订阅软件系统。这些系统在Internet上广泛使用,尽管我找不到很多有关数据库设计的内容。

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

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

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

我的痛点:

  • 我看不到总体上这是什么整体设计
  • 数据库中哪一行应该是:month_susbscrition(即每个客户每月1行)或订阅本身(即每个客户1行)?
  • 您将如何处理每月订阅的自动续订?
  • 如果您打算使用Paypal之类的服务来处理每月自动付款,您将如何处理付款设计?

注意

我自愿不详细说明我的需求,因为这样一来,辩论可能会变得笼统,对其他人更有用。

感谢帮助。


1
我建议您与您的提供商讨论自动付款的方式,他们可能会对您希望您执行的操作提供指导。但是通常,您可以在数据库上创建每月工作,该工作将创建在每月续订日期要收费的人员的列表。然后提供商将告诉您如何将该列表发送给他们。
HLGEM '17

Answers:


77

我会用这个模型

您的客户

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行。

当客户订阅诸如“第一个月免费的高级服务!”之类的报价时,您的数据库将如下所示:

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
------
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个客户端订阅。

这使您可以自动处理每月订阅 应用程序中,但不能使用银行/贝宝帐户。

但是有些银行为您提供两种服务:-唯一借记-定期借记

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


关于年价格,我将其作为不同的计划,不同的选择。
Lonefish '16

你是对的。年价格也可以在数据库外部进行计算。例如,Price_per_month * 12 * 0.9但该选项应出现在subscription表格中。
Chambeur '16

我不会在数据库外部计算折扣,而是将其作为其他计划,并在数据库中保留计划的长度。因此,一个计划是1年,月价格为“ standard_price * 0.9”,长度为12(月),或者以天/周/您希望的日期为单位。
Lonefish '16

但这是一个不同的用例。在这里,我们需要有无限的时间表。我认为实际架构存在的问题是您不知道用户是选择按月订阅还是按年订阅。在这种情况下,我将使用与您说的不同的计划,但是使用类别(每年,每月)而不是长度。
Chambeur '16

我会在计划中添加诸如总月数之类的内容,然后当您插入订阅表时,可以用它来计算计划的结束日期。这样,您将知道计划何时结束并且需要更新,因此您可以发送提醒以进行更新。你也可以具备自动更新,直到通知不同,以及与一组结束日期与这一模式的计划..
HLGEM

8

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

我会有一个Client表。

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
...

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

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

每月每个订阅一行。

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

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

如果您打算使用PayPal之类的服务来处理每月自动付款,您将如何处理付款设计?

Netflix每月仅从我的PayPal帐户中扣款。您也可以这样做。


2
购买时间和开始时间不一样吗?
JCarlosR

如果您在另一项订阅结束之前续订或更改您的订阅。
卡布隆(Bloem)

我一直在想这是一个有趣的设计,但是后来我想为什么不合并两个表,订阅和购买呢?我使用的是NoSQL的DB,宁愿做单取而不是两个
哈立德

但是,对于NoSQL DB,情况完全不同,它建议为大型应用程序使用一致的数据库设计系统。
Yashu Mittal,

7

查看接受的答案,我将添加另一个表,其中将存储订阅或计划的所有更改或更新,以供回溯参考。这样,您就可以清楚地记录何时选择了什么计划以及在什么时期选择了什么计划。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.