如何改进基于订阅的计费系统的数据库设计?
Posted
技术标签:
【中文标题】如何改进基于订阅的计费系统的数据库设计?【英文标题】:How can I improve database design for my subscription based billing system? 【发布时间】:2018-11-20 12:25:30 【问题描述】:我正在从基于信用的计费系统迁移到基于订阅的计费系统。到目前为止,我曾经检查过用户拥有的积分数量并以此为基础;我曾经通过电子邮件发送用户是否续订已完成。在第一次购买的情况下,我曾经激活用户选择的计划。
我现在正在转向基于订阅的计费系统,在该系统中我将使用validity
存储订阅,并且我想从根中消除信用部分。这是我的新计费系统的数据库架构。 此架构的问题是我无法处理首次购买事件,因为没有可靠的方法可以知道用户是否是第一次购买以及用户是否已支付全部金额。我对变化的每一步都感到困惑。
让我解释一下我面临的问题。在处理事务时,subscriptions
中的is_active
标志仍然是null
,这意味着用户无法对我的软件执行任何操作。但是当交易被处理时,用户将返回我的网站,我的网站将标记交易paid
,这意味着用户已付款,但由于交易和订阅之间没有联系,我怎么知道何时标记订阅已付费.在 TransactionController 中处理交易,在 SubscriptionController 中处理订阅。
我还没有创建订阅和事务之间的连接,因为在这种情况下,我必须在事务中允许nullable foreign keys
,因为事务也可以用于额外服务!
我越想越困惑。我不知道这里有什么问题,但我知道数据库设计存在一些问题。任何帮助表示赞赏!
【问题讨论】:
如果你不想改变数据库,你可以使用连接。我可以看到有一个 user_id 在事务和订阅中都很常见。交易完成后,您必须检查哪个 user_id 与订阅中的相同。 是的,可以做到。我正在考虑将“first_purchase=>true|false”元信息放在 user_meta 中,并在交易完成时检查它是否存在。如果它存在,我可以激活订阅。否则,我可以续订订阅并将其标记为活动和 is_renewal。这是一个好方法吗? 如果订阅有多种类型(如基本、高级、黄金),那么将来可能会出现问题。如果它只有一种类型,它会工作。 好吧,让我们开始吧。当用户选择订阅时,将所有值放入会话中并保存在数据库中。之后继续交易并完成。如果事务完成,则获取上一个会话和事务响应合并它们并保存到另一个表中。保存值后销毁该会话。 是的,我只是想说同样的话,你不需要改变类型 【参考方案1】:这就是我想到的:
-
为您的订阅添加结束日期和 is_autorenew
为您的交易添加创建和付款开始日期
我会创建一个新表,例如预订,其中包含用户信息、帐单地址、价格和付款方式。想象一个案例,当客人订阅或用户更改地址或产品价格发生变化时。这些价值观必须是真实的。
在预订和订阅以及订阅和交易之间创建 1:1 关系
使用支付提供商返回的值(例如 customer_id 或 transaction_id)丰富您的交易。
这可能是您的基本数据库模型。现在,当有人购买任何东西时,如果一切顺利,您将创建 3 个条目:预订、订阅和交易。如果 is_autorenew && is_active 为真,则运行一个自动更新订阅的 cronjob。您可以为此使用事务表中的 transaction_id。然后我会创建一个全新的订阅并将其链接到预订和交易。之后将旧订阅设置为非活动状态。
希望这对您有所帮助。
【讨论】:
【参考方案2】:如果您为订阅表添加字段parent_id
会怎样。
subscription
和 transaction
之间的关系将是 1:1。
另外,我建议您立即激活用户会员资格(如果可以的话),它会给您带来以下好处:
不会因为交易确认的延迟而影响用户体验。
subscription
和transaction
之间的关系在用户尝试初始化订阅时立即创建。您可以稍后在收到 transaction_id 时填写交易 ID。
希望我能帮上忙。
附言这与php
有关吗?
【讨论】:
其实我加了php
,因为Laravel是一个PHP框架,知道我用的是laravel,我想有人会建议用laravelish的方法来解决这个问题。
是的,我可以在付款成功之前激活订阅,但这会造成漏洞。
我想在付款后立即激活会员。
漏洞是什么意思?
如果我在用户处理付款时启用会员资格,他/她可以取消付款并免费获得会员资格。但我误解了你的话。我现在明白,立即意味着付款后立即。我终于找到了解决所有问题的方法。以上是关于如何改进基于订阅的计费系统的数据库设计?的主要内容,如果未能解决你的问题,请参考以下文章
《基于改进随机抽取算法的信息论题库和智能组卷系统的设计与实现》