存储价值或推断其他数据?

时间:2016-02-29 11:14:41

标签: sql database data-structures

我正在开发一个人们可以通过它汇款的财务应用程序。

每个用户都可以将钱存入我们的服务中,他们可以将余额从其余额汇入其他人。 这两笔交易将影响我们申请中的余额。

我想知道,获得用户余额价值的最佳方法是什么。我应该直接将值存储在列中,并在用户进行事务时更改它,或者我应该只是从用户所做的所有事务中推断出余额值。

我已经想到的每种方法的缺点是:

  • 直接存储值:

    • 数据一致性:当一个数据成功保存但另一个数据不是
    • 时,可能会出现差异
  • 从其他数据推断:

    • 较慢(?):每当我想获得余额的价值时,我必须查询所有交易数据并得到它的总和。我的应用程序中的许多功能都要求您知道用户余额的值,因此这种查询可能会完成很多。当用户的交易数据变得很大时,也存在一个问题。

我使用PHP和MySQL以及Yii2框架构建了我的应用程序。

您认为这种问题的最佳方法是什么,虽然效率很高,但也可以保持数据的完整性,并且对未来的大量数据没有问题?

谢谢。

2 个答案:

答案 0 :(得分:1)

考虑第一种方法。

如果db是Mysql,您可以使用MySQL的table-locking (or row-locking)能力。在您的MySQL实例上使用InnoDB表,否则您的系统将无法完全进行ACID编译,这意味着您无法获得所需的原子性。

答案 1 :(得分:1)

结合两者。

或者:

  • 存储值
  • 使用事务确保不会保留部分结果
  • 安排定期(每日?)任务,该任务将使用上次验证的一致值和增量来验证一致性

或者:

  • 存储昨天的价值
  • 计算昨天的当前值和增量值
  • 安排将更新存储值的每日任务