代码之家  ›  专栏  ›  技术社区  ›  unsafe_where_true

数据库模型和计算平衡,mysql

  •  3
  • unsafe_where_true  · 技术社区  · 16 年前

    另一个问题来自一个应用程序程序员,他第一次尝试自己建立一个数据库模型。

    在我的应用程序中,有用户、帐户和事务。最初我把所有的表都放在3nF中(我相信是这样)。然后我决定向用户添加一个平衡字段,主要是因为我的代码将成为开放源代码,我不希望人们通过更改PHP代码来破坏系统的业务逻辑。因此触发器和存储过程会更新余额。

    现在有了一个新的要求,用户将在他们的帐户页上有一个他们使用余额列进行的所有交易的列表,这样他们就可以观察他们的余额如何随着每个交易而变化。当然,事务和用户在不同的表中。

    怎么办? 我当前的解决方案草图看到了一个带有事务标识和用户标识的外键的平衡历史表。还有其他建议吗?谢谢。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Alexey Sviridov    16 年前

    如果您的事务表不是很大,我建议您从用户表中删除Balance列。如果您已经有一个事务表,为什么要平衡历史记录? 我强烈建议您从触发器中删除任何业务逻辑!仅存储过程。我建议只对真正透明的操作(审计、复杂验证等)使用触发器。 总之,我认为您应该先从用户表中删除balance列,然后编写连接用户和事务表的视图(“userbalance”)。从触发器中删除任何业务逻辑,而不是调用适当的存储过程。仅使用交易记录表显示余额历史记录。 对于不太大的表来说,这都是正确的(3-4百万的记录是可以的)。对于非常大的数据库,您需要使用分布式缓存、垂直数据库等。

        2
  •  1
  •   yukondude    16 年前

    在数据库中存储计算值总是充满潜在的错误。也就是说,这只是一种缓存技术,缓存现在已经被很好地理解了。

    但是,每次访问账户页面时只计算账户页面上的运行余额是否很昂贵?我们只是在讨论加减法。可能只需要获取缓存的最终余额,并从中向后计算每个事务的运行余额就可以了,并且在维护建议的余额历史表时节省了大量工作。

    我还想补充一点,如果允许插入或更新较旧的事务,那么Balance_History表将很难更新。然后,您必须为该用户更新每个连续事务,以更正运行余额。

    Alexey Sviridov的建议是使用视图来平衡运行,这是一个很好的建议,尽管它们很难编写(尤其是高效运行)。Oracle的分析函数确实很适合这种类型的东西,但我不确定MySQL是否有等效的功能。

    推荐文章