我想知道记录存量和流量的最佳做法是什么。您是否仅存储流量并计算存量?还是两者都存储?
似乎坚持的重点是流量。 (例如,在银行数据库中,它会是一个帐户的借方和贷方),并且可以从中计算存量(剩余资金)。但是如果有很多银行账户,并且我想要一个包含多个银行账户的剩余资金表,那么我将不得不为每个账户重新计算这个金额。这看起来很慢。
另一方面,我认为数据库的主要目标之一是不存在重复数据。
是否有储存库存的一般做法?这应该是一个计算字段,还是由程序逻辑插入?
最佳答案
在数据库设计中,我们有Derived Data:
一个表可以有派生列,这些列的值是根据其他表列的值计算的。如果所有列都是派生的,则称它是派生表。
例如:
- 学生年龄,
- 账户余额,
- 帖子和评论(如 stackoverflow)的点赞或赞数以及点赞数。
在这种情况下,我们有 2 个选项,各有利弊:
删除导出的数据并计算
- 优点:我们的数据库设计中没有任何冗余。
- 缺点:我们应该在大多数查询中计算聚合数据(Count、Sum、Avg...)
使用派生的数据而不是计算它们
- 优点:我们已经准备好所有聚合数据,不需要计算它们
- 缺点:我们有一点冗余。
- 缺点:我们应该在原始数据发生变化时更新派生数据。
因此我们在选择选项 1 或 2 之间进行权衡。我们应该在我们的应用程序中计算它们的成本并选择其中之一。
第一:冗余
我认为冗余在这种权衡中并不是那么重要。因为没有那么多重复数据,所以我们只用了一个额外的字段(比如Integer of Big Integer)
第二:
我认为我们应该计算这些选项之间的成本:
- 在删除派生数据中
- 检索聚合数据的性能成本
- 使用聚合列
- 更新聚合列的成本
那么,我们如何在我们的应用程序中计算它们呢?有一些与成本直接相关的评估参数:
- 原始表(和副表)中的记录数。
- 指定时间段内原始表的插入次数。
- 指定时间段内原始表的更新(更新和删除)次数。
- 在指定时间段内从包含聚合数据的原始数据(或辅助表)中进行选择的次数
- 许多其他参数。
最后:要获得非常正式的方法,我建议阅读 DAX Patterns .
关于database - 数据库设计中的存量和流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48391512/