design-patterns - 跟踪用户代币/硬币的策略

标签 design-patterns database-design subscription subscriptions

我正在开发一个网络应用程序,用户每月购买代币/硬币 - 这意味着代币在月底到期(例如,3 美元可以让你在一个月内获得 5 个代币)。在存储和跟踪每个用户 token 时,我对采取什么策略感到有点困惑。

在两部分问题中:

1) 由于用户通常可以在一个月的任何阶段购买代币,月份是定义为“30”天,还是映射到日历月的天数? (例如:如果代币在 3 月份购买,它们会持续 31 天,但如果在 5 月份购买,它们会持续 30 天吗?)

2) 问题的第二部分是如何跟踪这些 token ?如果用户支付一年的订阅费用(每月 5 个代币,共 12 个月),但也被允许在一年中购买更多代币(6 月用户想要 10 个代币),我如何才能真正跟踪有多少每个月都买代币了吗?

我有一些实现想法,但似乎没有一个是“正确的”。希望有人可能已经解决了类似的问题,或者可以指出任何相关文献。

提前致谢。

最佳答案

Since a user can typically buy tokens during any stage of the month, are months defined as "30" days, or do they map to the days of a calendar Month? (example: if tokens are bought during March, would they last 31 days, but if bought in May they last 30 days?)

总是 1 个完整月。

为什么?因为你对你的用户很好 ;)

我会选择一个完整的月份,因为日期方法很简单。并且更容易跟踪成员。 对于喜欢在 2 月底购买最多代币的人来说,31 天是一个更好的选择。 例如,1 月 31 日购买的商品将于 3 月 3 日到期,而不是 2 月 28 日。

当然你可以自己决定,但这是最合理的选择,也可以确保你少给客户带来麻烦。

The second part of the question is how do I track these tokens? If a user pays for a year long subscription (5 tokens every month for 12 months) but is also allowed to buy more tokens during the course of the year (for June user wants 10 tokens), how can I actually keep track of how many tokens have been bought for each month?

为每次代币购买创建一个表格,其中包含购买时间和日期以及代币数量。

TokenPurchaseNumber | UserId | TokenCount | PurchaseDateTime| ExpireDateTime
---------------------------------------------------------------------
10001               | 1      | 200        | Jan 20          | Feb 20
10002               | 1      | 100        | Jan 24          | Feb 24
10002               | 2      | 300        | Jan 24          | Feb 24
10003               | 1      | 20         | Jan 25          | Feb 25
10004               | 1      | 40         | Jan 29          | Feb 29

这样您就可以通过唯一的购买编号很好地存档所有购买,并且可以为用户生成购买历史记录。

您可以考虑不使用 ExpireDateTime 列,因为您只是将购买代币的日期 + 31 天与今天进行比较。

现在如何计算用户拥有的代币总数似乎是下一个问题。

两个选项,第一个会有更好的购买历史和存档。

选项 1:

这很简单,每次用户购买代币时,您都会在上面的表中创建一行,并将其添加到他自己的用户表列 tokens 中保存的总金额。

每次用户登录时(或您想要的任何其他选择的时间),您都可以检查他们的 token 总数,例如 165。

现在今天是 2 月 21 日,所以您检查他在 1 月 21 日之后购买的所有代币。我们将这些相加,我们看到用户只能拥有 100+20+40=160 的可能数量的有效 token 。因此,我们删除了他的 5 个代币并向他发送消息,他在 1 月 20 日购买的#10001 的 5 个代币已过期。

第二个选项:

当用户使用它们时,只需从最旧的购买中删除代币。当到期日期到期时,删除整个购买行,有效地删除该购买的剩余代币。

关于design-patterns - 跟踪用户代币/硬币的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15013173/

相关文章:

java - 以不同顺序调用接口(interface)方法

SQL-Server:将列定义为互斥

php - 私有(private)消息通知 - 数据库表设计

php - 使用非 Paypal 付款方式的 Magento 循环配置文件

ios - CloudKit 获取当前用户的所有订阅

Java - 带有泛型的工厂和策略模式

java - 关于使用断言删除生产中 Java 代码部分的建议

python - 如何将 python 格式字符串与列表中的元素匹配?

mysql - 数据库设计 - 问题、答案、标签

Android - Play 商店 - 更改订阅的到期日期