Database design 基本数据库设计问题-如果一个计算查询不断发生,最好有一个单独的表?

Database design 基本数据库设计问题-如果一个计算查询不断发生,最好有一个单独的表?,database-design,Database Design,通过创建社交网络来实践web开发。用户可以通过执行某些活动获得积分,因此我为存储积分事务的每个用户提供了一个PointHistory表。要计算点平衡,最好有一个专用的点平衡表,每当用户的点平衡发生变化时,该表就会更新,对吗 示例场景:userA获得10分 -userA的PointHistory表被更新,transaction1被记录为+10 -userA的PointBalance表更新为向pointTotal添加10 另一种方法是使用一种算法,该算法在每次点事务发生时运行PointHistory

通过创建社交网络来实践web开发。用户可以通过执行某些活动获得积分,因此我为存储积分事务的每个用户提供了一个PointHistory表。要计算点平衡,最好有一个专用的点平衡表,每当用户的点平衡发生变化时,该表就会更新,对吗

示例场景:userA获得10分 -userA的PointHistory表被更新,transaction1被记录为+10 -userA的PointBalance表更新为向pointTotal添加10

另一种方法是使用一种算法,该算法在每次点事务发生时运行PointHistory表并计算点余额


专用的表格听起来好像占用的资源更少——或者我遗漏了什么

通常,如果信息可以从现有的持久化数据中派生出来,那么重新计算比保存计算结果更好。这样,重新计算的数据将始终反映持久化的数据,并且在计算更改时保持准确

当然,如果这个计算存在性能问题,您可能需要考虑存储结果。但是,您需要记住,只要它所依赖的任何字段发生更改,或者如果计算本身发生更改,都要更新该字段


很难说哪种方案在资源上更容易—您只提到了内存,尽管CPU、IO和网络使用率也都起到了作用—您应该使用一种解决方案,在进行过程中进行测量,并在需要时进行更改。确保您的代码足够灵活,能够适应这种变化。

这实际上是规范化和性能之间非常常见的平衡行为。以下是常见的解决方案:

如果速度够快的话,就直接计算吧

让每个历史插入锁定计算字段并将其自身添加到其中。如果不经常添加历史记录,这是很好的,但如果同时插入了大量历史记录,则会降低系统的锁争用速度


让计算的记录存储总计和总计中的最后一个历史记录。当收到总计请求时,添加自上次请求以来的所有新历史记录并存储。

保留总计将节省工作,但您必须确保数据库事务一致性,以防止存储的总计与实际总计不同步。