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

就我而言,这些元素(可能还有一些我忘记了的元素)必须包括在内:

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

除了数据库设计之外,可能还需要设置触发器来实现这一点(?).

My pain points:

  • 我无法从总体上看出这是什么样的全球设计
  • 哪一行应该是数据库中的一行:monthsusbscrition(即每个客户端每月1行)还是订阅本身(即每个客户端1行)?
  • 您将如何处理每月订阅的自动续订?
  • 如果你预见到使用贝宝这样的服务来处理自动月度付款,你会如何处理支付设计?

Note

我自愿不详细地expose 我的需求,因为这样,辩论就可以保持一般性,对其他人也更有用.

谢谢你的帮助.

推荐答案

我会用这个型号的

你的客户

Client
------
Client ID
Name
...

你的计划(你可以在需要的时候定义新的计划).

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

考虑到此模型,我将在每个计划中 for each 客户端使用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日取消订阅时,只用月和年更新订阅表中的列End(因为您已经预先设置了日期和时间).

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

请确保一个客户端不能同时有两个订阅.

这允许您自动处理每月订阅in your app,而不是使用您的银行/PayPal帐户.

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

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

Database相关问答推荐

嵌入式的 best数据库是什么?

用于存储人与聊天消息的数据库设计

如何打印出 sequelize 实例的表名?

如何将 PHP 会话数据保存到数据库而不是文件系统中?

使用 Mongoose 删除索引的推荐方法是什么?

如何允许多个用户同时连接到我的 H2 数据库?

设计用于存储多人游戏的各种要求和统计数据的表格

如何在 2 个 MySQL 数据库之间传输数据?

是否可以在ORDER BY子句之后放置任何可能造成安全风险的内容?

prices价格字段是浮动还是小数好点?

我应该不断地open()和close() SQL 数据库还是让它保持打开状态?

单父实体的核心数据性能

日期范围重叠判断约束

从 postgresql 转储文件填充 MySQL 数据库

表格字段可以包含连字符吗?

使用带有联合和 CLOB 字段的 Select 时出现错误 ORA-00932

如何在 SQLServer 数据库的两个实例之间复制数据记录

为什么实体框架连接需要元数据属性?

Oracle order NULL LAST 默认

使用 Sinatra 时与数据库对话的最佳方式是什么?