database - 数据库设计中的存量和流量

标签 database database-design

我想知道记录存量和流量的最佳做法是什么。您是否仅存储流量并计算存量?还是两者都存储?

似乎坚持的重点是流量。 (例如,在银行数据库中,它会是一个帐户的借方和贷方),并且可以从中计算存量(剩余资金)。但是如果有很多银行账户,并且我想要一个包含多个银行账户的剩余资金表,那么我将不得不为每个账户重新计算这个金额。这看起来很慢。

另一方面,我认为数据库的主要目标之一是不存在重复数据。

是否有储存库存的一般做法?这应该是一个计算字段,还是由程序逻辑插入?

最佳答案

在数据库设计中,我们有Derived Data:

一个表可以有派生列,这些列的值是根据其他表列的值计算的。如果所有列都是派生的,则称它是派生表。

例如:

  • 学生年龄,
  • 账户余额,
  • 帖子和评论(如 stackoverflow)的点赞或赞数以及点赞数。

在这种情况下,我们有 2 个选项,各有利弊:

  1. 删除导出的数据并计算

    • 优点:我们的数据库设计中没有任何冗余
    • 缺点:我们应该在大多数查询中计算聚合数据(Count、Sum、Avg...)
  2. 使用派生的数据而不是计算它们

    • 优点:我们已经准备好所有聚合数据,不需要计算它们
    • 缺点:我们有一点冗余
    • 缺点:我们应该在原始数据发生变化时更新派生数据。


因此我们在选择选项 1 或 2 之间进行权衡。我们应该在我们的应用程序中计算它们的成本并选择其中之一。

第一:冗余
我认为冗余在这种权衡中并不是那么重要。因为没有那么多重复数据,所以我们只用了一个额外的字段(比如Integer of Big Integer)

第二:
我认为我们应该计算这些选项之间的成本:

  1. 在删除派生数据中
    • 检索聚合数据的性能成本
  2. 使用聚合列
    • 更新聚合列的成本

那么,我们如何在我们的应用程序中计算它们呢?有一些与成本直接相关的评估参数:

  1. 原始表(和副表)中的记录数。
  2. 指定时间段内原始表的插入次数。
  3. 指定时间段内原始表的更新(更新和删除)次数。
  4. 在指定时间段内从包含聚合数据的原始数据(或辅助表)中进行选择的次数
  5. 许多其他参数。


最后:要获得非常正式的方法,我建议阅读 DAX Patterns .

关于database - 数据库设计中的存量和流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48391512/

相关文章:

mysql - 备份mysql二进制文件

database-design - 数据库设计 - 文章、博客文章、照片、故事

c# - 从 SQL 存储过程中检索数据

objective-c - 核心数据删除规则和多对多关系

mongodb - 将聊天消息存储在 mongodb 集合中是个好主意吗?

database - 什么时候应该将社会保险号用作数据库主键?

mysql - 如何在mysql中建立表之间的一对一关系

database - 什么是 hyperloglog,它有什么用?

sql - 比较两个表中的两个选择

php - MySql一般错误: 2053