假设我的数据量很大(200万行?),这些数据应该是静态且不变的。应该是。这些数据每月重新发布一次。有哪些方法可以1)了解哪些数据点每月都有变化,2)消耗给定时间点的数据?
解决方案1)天真地保存按日期注释的每个数据快照。差异意识由一些内部程序处理,但按日期消耗数据是微不足道的。缺点,空间需求量级增加一个数量级。
解决方案2A)使用内部程序,跟踪差异发生的时间并将其存储在EAV表中,并按日期注释。空间要求很低,但与原始数据集成的消耗变得笨拙。
解决方案2B)使用内部程序,跟踪差异何时发生,并将它们存储在一个看起来很像原始表的稀疏填充表中,只填充已更改的数据和更改日期。缺点,模型稀疏,与原始数据集成的消费是非常重要的。
我想,基本上,我如何将时间维度整合到关系数据库中,同时记住数据的查看和时间段之间差异的意识?
这根本与数据仓库有关吗?
闻起来......慢慢改变维度?
答案 0 :(得分:4)
我遇到了类似的问题 - 每天一次导入数据库的大平面文件。大多数数据都是不变的。
向表中添加两个额外的列,starting_date和ending_date。 ending_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建议的。