如何构建账户余额制度

时间:2014-09-18 14:36:19

标签: php mysql sql symfony architecture

这是关于如何构建用户会计平衡架构的更多理论问题。对于堆栈,我们可能会将Symfony与Doctrine一起使用,但我不认为该语言最相关。

问题:

我们需要为每个用户创建和维护使用余额,以便我们的其余API用于结算。

有三种类型的账单:

  1. 固定价格,例如年/月
  2. 根据API调用过帐付费使用情况。
  3. 基于API调用的预付费使用情况。
  4. 在同一帐户中混合使用这些内容。 API调用可以有不同的价格。

    问题并不像拥有一个带有" balance"的列的SQL表那么简单。并更新这个。我们需要在帐​​户上记录存款和取款,并跟踪每个API调用和审核用法。所以这意味着我们可能需要一个交易表。

    所以这是我需要建议的地方。对于大型应用程序,我们是否应该将每个用户事务放在同一个表中,然后使用SQL汇总每个日期的余额?这张桌子可能会在一段时间后变得巨大。 100万次API调用= 100万行。

    我们可能会使用某种借记/贷记解决方案。因此,当支付发票时,订单系统将为该帐户添加正余额。当进行API调用时,它会根据价格进行借记。

    由于我们有3种不同的结算模式,我们可能会使用某种标记,表示" API调用1 2 3是固定价格,API调用4 5 6是按使用情况支付的#34;。

    如果是后付款,余额将为负数。

    在每次结算运行中,订单系统会询问余额系统要开具多少发票。

    关于如何以理智的方式构建这个问题的任何想法?

1 个答案:

答案 0 :(得分:3)

如果您为“理智”定义标准,您可能会获得更多/更好的答案。

这个规范模型确实是一个事务表。暂时忽略性能问题,事务表为您带来了许多好处:

  • 记录每个操作,以便您可以轻松查看当前帐户余额的变化情况。
  • 您可以轻松查看过去任意点的帐户余额。
  • 在创建事务时很容易管理 - 您只需在事务表中插入一个新行,而不必执行一堆复杂的业务逻辑来查找当前用户的余额,计算出适当的定价模型,然后修改余额,同时保持事务/锁定以避免并发写入

所以,我推荐“交易表”模型。

至于实际问题 - 是的,它们可以相当快速地增长。幸运的是,SQL数据库非常擅长处理大量记录,而在设计良好的数据库中,数亿行并不是特别的挑战。但是,有一些常见的策略可以避免大量记录。

最常见的是,您可以编写归档程序。通常,在“后付款”帐户上,例如,当客户支付发票时,您将该发票中涵盖的所有交易写入存档表,并在交易表中将其替换为单行。对于后付费客户,您可以采取相反的行动。

您还可以对逻辑进行分区 - 我工作的一个系统有一个名为“transactions”的视图,这是一个基于时间的表模式的薄层每个月,IT部门都会丢弃并重新创建查看指向称为例如jan2014,feb2014等的表。他们将在每月表中填充每个客户的期初余额。虽然它很笨重并且需要在月底停机,但这种方法效果出奇的好。

您可以对客户类型进行分区 - 3个事务表,而不是一个大表。