如何对随时间缓慢变化的数据建模?

时间:2009-02-04 22:28:29

标签: database sql-server-2005 time

假设我的数据量很大(200万行?),这些数据应该是静态且不变的。应该是。这些数据每月重新发布一次。有哪些方法可以1)了解哪些数据点每月都有变化,2)消耗给定时间点的数据?

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

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

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

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

这根本与数据仓库有关吗?

闻起来......慢慢改变维度?

6 个答案:

答案 0 :(得分:4)

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

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

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

  • 如果密钥相等:比较其余列以查看数据是否已更改。如果行数据相等,则该行已经在数据库中,并且无需执行任何操作;如果它不同,请使用今天的ending_date更新数据库中的现有行,并插入一个first_date为today的新行。从两个文件中读取一个新行。
  • 如果旧文件中的密钥较小:该行已删除。将ending_date更新为今天。从旧文件中读取一个新行。
  • 如果新文件中的密钥较小:插入了一行。使用今天的starting_date将行插入数据库。从新文件中读取一个新行。

重复,直到您从两个文件中读取所有内容。

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

答案 1 :(得分:2)

您还可以从数据仓库书中获取一页。基本上有三种处理数据变化的方法。 看看这个维基百科的SCD文章,但它本质上是表: http://en.wikipedia.org/wiki/Slowly_changing_dimension

答案 2 :(得分:0)

这很大程度上取决于您存储数据的方式。有两个因素需要考虑:

  • 数据如何改变?
  • 数据有多大变化?

区别很重要。如果它经常变化但不多,那么带注释的快照将非常低效。如果它不经常变化但很多,那么它们就是更好的解决方案。

这还取决于您是否需要查看特定时间点的数据。

例如,如果您使用的是Oracle,则可以使用flashback queries在某个任意点查看数据的一致视图。

就我个人而言,我认为最好以增量方式存储它,并且至少使用某种形式的审计来跟踪更改,以便您可以恢复历史快照(如果需要的话)。但就像我说的,这取决于很多因素。

答案 3 :(得分:0)

如果是我,我会每个月保存整件事(不一定是在数据库中,而是作为离线的数据文件或文本文件) - 你会很高兴你做到了。即使行数为4096字节(疯狂猜测),你每个月只谈论8G磁盘。 300G硬盘可以节省很多个月。多年来我做了类似的事情,当时我每天下载超过1G的数据仓库。

答案 4 :(得分:0)

这听起来像是源代码版本控制系统所面临的问题。这些存储修补程序用于在发生更改时创建更改。因此,如果文件没有更改,或者只有几行更改,则需要存储的修补程序相对非常小。系统还存储每个补丁所贡献的版本。因此,在查看特定文件的特定版本时,将恢复初始版本并应用所有补丁,直至所请求的版本。

在您非常普遍的情况下,您需要将数据分成块。希望你可以使用自然分裂,但如果这种分裂必须是任意的,那就应该没问题。每当发生更改时,请存储受影响块的修补程序并记录新版本。现在,当您要查看特定日期时,查找视图日期之前的最新版本,应用已请求的块的修补程序,并显示。

答案 5 :(得分:0)

你能做到以下几点:

1. Each month BCP all data into a temporary table
2. Run a script or stored procedure to update the primary table 
   (which has an additional  DateTime column as  part of a composite key), 
   with any changes made.
3. Repeat each month.

这应该为您提供一个表格,您可以在特定日期查询数据。

此外,每个更改都将被记录,并且表的大小不应随着时间的推移而发生显着变化。

但是,作为对此的备份,我会将每个数据文件存储为Brennan建议的。