Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 订阅管理逻辑_Design Patterns_E Commerce_Subscription_User Management_Recurring Billing - Fatal编程技术网

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
      之间的共享详细信息,添加一个
      类型
      列键,用于区分行与哪种订阅相关

      然后,引用父
      订阅
      行,将特定于每个订阅类型的详细信息存储在其自己的表中

      为了检索数据,您需要一个对象来负责实例化正确类型的
      订阅
      ,给定
      订阅
      行的
      类型
      列值

      您可以在“企业应用程序架构的模式”一书中查看该模式,以了解更多信息