假设我得到了大量(200 万行?)的数据,这些数据应该是静态和不变的。应该是。这些数据每月都会重新发布。有哪些方法可用于 1) 了解哪些数据点逐月发生了变化,以及 2) 使用给定时间点的数据?

解决方案 1) 天真地保存数据的每个快照,按日期标注。差异意识由​​一些内部程序处理,但按日期消耗数据是微不足道的。缺点,空间需求激增一个数量级。

解决方案 2A) 使用内部程序,跟踪差异发生的时间并将它们存储在 EAV 表中,并按日期进行注释。空间要求低,但与原始数据集成的消耗变得笨拙。

解决方案 2B) 使用内部程序,跟踪差异发生的时间并将它们存储在一个稀疏填充的表中,该表看起来很像原始表,仅填充更改的数据和更改的日期。缺点,模型稀疏,与原始数据集成的消费是不平凡的。

我想,基本上,我如何将时间维度集成到关系数据库中,同时牢记数据的查看和时间段之间差异的意识?

这是否与数据仓库有关?

闻起来像…… 缓慢变化的维度?

最佳答案

我有一个类似的问题 - 每天一次导入数据库的大平面文件。大多数数据是不变的。

向表中添加两个额外的列,starting_date 和ending_date。 end_date 的默认值应该是将来的某个时间。

要将一个文件与下一个文件进行比较,请按关键列对它们进行排序,然后从每个文件中读取一行。

  • 如果键相等:比较其余的列以查看数据是否已更改。如果行数据相等,则该行已经在数据库中,无事可做;如果不同,则使用今天的结束日期更新数据库中的现有行,并使用今天的开始日期插入新行。从两个文件中读取一个新行。
  • 如果旧文件中的键较小:该行已被删除。将ending_date 更新为今天。从旧文件中读取新行。
  • 如果新文件中的键较小:插入了一行。将起始日期为今天的行插入到数据库中。从新文件中读取新行。

  • 重复直到读完这两个文件中的所有内容。

    现在要查询在任何日期有效的行,只需在 start_date 和 end_date 之间使用 where 子句 test_date 进行选择。

    关于database - 如何对随时间缓慢变化的数据建模?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/513677/

    10-11 02:57
    查看更多