Sql 存储值还是从其他数据推断?

Sql 存储值还是从其他数据推断?,sql,database,data-structures,Sql,Database,Data Structures,我正在开发一个金融应用程序,人们可以通过它汇款 每个用户都可以将他们的钱存入我们的服务,并且他们可以从余额中向其他人汇款。 这两个事务将影响我们应用程序中它们的余额 我想知道,获得用户余额价值的最佳方式是什么。我应该直接将值存储在列中,并在用户进行交易时更改它,还是应该从用户进行的所有交易中推断余额值 我已经想到的每种方法的缺点是: 直接存储值: 数据一致性:当一个数据保存成功而另一个数据保存不成功时,可能会出现值差异 从另一个数据推断: 较慢(?):每当我想要得到余额的值时,我必须查询

我正在开发一个金融应用程序,人们可以通过它汇款

每个用户都可以将他们的钱存入我们的服务,并且他们可以从余额中向其他人汇款。 这两个事务将影响我们应用程序中它们的余额

我想知道,获得用户余额价值的最佳方式是什么。我应该直接将值存储在列中,并在用户进行交易时更改它,还是应该从用户进行的所有交易中推断余额值

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

  • 直接存储值:

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

    • 较慢(?):每当我想要得到余额的值时,我必须查询所有事务数据并得到其总和。我的应用程序中有很多函数需要您知道用户余额的值,因此可能需要进行大量此类查询。当用户的事务数据变得很大时,也有一个问题
我使用PHP和MySQL以及Yii2框架构建了我的应用程序

您认为解决此类问题的最佳方法是什么,即在高效的同时,还可以保持数据的完整性,并且在将来处理大量数据时不会出现问题


谢谢。

考虑第一种方法

如果db是
Mysql
,则可以使用Mysql的
表锁定(或行锁定)
功能。在MySQL实例上使用InnoDB表,否则您的系统将不能完全使用ACID编译器,这意味着您将无法获得所需的原子性。

将两者结合起来

要么:

  • 存储值
  • 使用事务确保不会保留任何部分结果
  • 安排一个常规(每天?)任务,使用上次验证的一致性值和增量验证一致性
或:

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

假设它是一个银行应用程序,其中一些公司客户有一个帐户。意味着每天有数千笔交易。因此,为该客户计算平衡不会降低性能。在每次进行事务时,将所有事务的所有值相加。这在很大程度上取决于预期的使用模式。对于传统银行来说,交易每天(夜间)一次成批进出,自然的方法是处理成批交易并更新余额。如果您有一个更实时的用例,可能最好在更新时只计算一次余额,然后在定期一致性检查时再次检查。谢谢您的回复,很抱歉我的回复太晚。我的应用程序的使用模式更适合于实时用例。所以我想我将使用您的第一种方法:存储值,使用事务,并创建定期一致性检查。我还将按照@FallAndLearn的建议实现行锁定。谢谢大家。