Design patterns 订阅管理逻辑
对于用户可以是Design patterns 订阅管理逻辑,design-patterns,e-commerce,subscription,user-management,recurring-billing,Design Patterns,E Commerce,Subscription,User Management,Recurring Billing,对于用户可以是会员或管理员的系统,具有会员角色的用户必须通过定期订阅付费,或获得免费访问权限 我目前的做法是: 用户有一个user数据库表 subscription表包含用户的记录(如果用户有订阅) subscription\u事件表记录每个帐单或失败的付款。我可以对此进行查询,看看最后一次事件是否确实成功付款 但如果给用户“免费”访问权限,我应该如何记录 是否有另一个以用户ID为外键的表免费订阅 在subscription中为他们记录特殊的“订阅” 或者在用户行中添加另一列,例如是免费的
会员
或管理员
的系统,具有会员
角色的用户必须通过定期订阅付费,或获得免费访问权限
我目前的做法是:
- 用户有一个
数据库表user
表包含用户的记录(如果用户有订阅)subscription
表记录每个帐单或失败的付款。我可以对此进行查询,看看最后一次事件是否确实成功付款subscription\u事件
- 是否有另一个以用户ID为外键的表
免费订阅
- 在
中为他们记录特殊的“订阅”subscription
- 或者在用户行中添加另一列,例如
和是免费的
免费的(过期)日期
- 是否在用户行中添加更通用的
列expires
- 尽管如此,免费订阅仍然是订阅。其到期付款金额和认购价格将为零。它的截止日期将是免费订阅和常规订阅的截止日期
如果当前设置不允许您根据这些因素成功查询免费订阅/用户,则只需要单独的列或表
注意:我在这里假设您当前将用户与订阅价格关联。您需要知道,无论如何,如果订阅价格在未来发生变化,或者您还想为经常性用户或促销用户提供折扣。问题回顾 正如@leanne所说,您正在建模一个
订阅
,其专门化是,比如说,月订阅
和恭维订阅
(给他们一个这个答案的名称)
您知道订阅可能会过期:
- 对于
,当用户未支付当月订阅费时会发生这种情况月订阅
- 对于
,将到期日期指定给用户时订阅
ExpirationDate
是任何订阅
的基本属性,但在每种情况下存储它的方式都不同。如果第一种情况下,您必须根据最后一个事件计算它,那么在后一种情况下,您可以直接检索它
处理数据库中的继承问题
因此,要将这个示例模型映射到数据库模式,可以使用Martin Fowler的书中描述的模式。其意图如下:
“表示类的继承层次结构,每个类有一个表”
基本上,您将拥有一个表,其中的属性在类之间共享,并且您将在一个单独的表中存储每个类的特定属性
记住这一点,让我们回顾一下您提出的选项:
- 是否有另一个以用户ID为外键的表
免费订阅
恭维订阅
特定的详细信息听起来不错,但是如果您不将此表与订阅
表相关联,您最终可能会遇到一个既有每月订阅
又有恭维订阅
的用户。它的外键应该指向subscription
表,该表告诉您用户是否有订阅(并且您必须对每个用户执行最多一个订阅)
- 在
中为他们记录特殊的“订阅”subscription
- 或者在用户行中添加另一列,例如
和是免费的
免费的(过期)日期
- 是否在用户行中添加更通用的
列expires
subscription\u事件
时都必须处理数据同步(在每月订阅的情况下)。通常,我会尽量避免这种数据重复的情况
样品溶液
在添加新的订阅类型时,为了支持可扩展性,我会使用subscription
表来存储MonthlySubscripton
和complairySubscription
之间的共享详细信息,添加一个类型
列键,用于区分行与哪种订阅相关
然后,引用父订阅
行,将特定于每个订阅类型的详细信息存储在其自己的表中
为了检索数据,您需要一个对象来负责实例化正确类型的订阅
,给定订阅
行的类型
列值
您可以在“企业应用程序架构的模式”一书中查看该模式,以了解更多信息