我存储了从1970年到现在的3500个不同股票的价格历史数据(每天运行cron作业来更新它)。
存储此数据的最佳方式是什么?它将用于基于每日数据和每周数据运行计算。目前我将其存储为:
stock_id, date, closing_price, high, low, open, volume
既然我也想要一周的价格,我是否应该创建一个单独的表来存储:
stock_id, week_end_date, weekly_closing_price, weekly_high, weekly_low, week_open_price, average_daily_volume, total_weekly_volume
既然这些数据都可以从第一个表中计算出来,那么有必要再次存储它吗?我考虑的唯一原因是有很多行的数据要进行计算……
发布于 2013-04-25 03:48:53
这取决于您有多少数据,以及您的其他事务需求是什么。
如果您有源/OLTP系统,则在源/OLTP系统中复制此数据没有任何意义。我是一名SQL Server程序员,不是MySQL,但我想他们和其他所有的关系型数据库一样都有日期部分函数,所以从日期确定星期数是很简单的。
但是,当您使用OLAP或reporting时,您可能希望创建另一个包含周粒度数据的表。这将使报告变得更快,特别是对于聚合这样的东西,当针对函数的输出运行时,这些东西通常不能很好地执行。
这两者都取决于数据的规模。如果每天有成百上千的行,那么可能不值得为此创建一个物化的周表。如果您每天有数万条记录,那么性能优势可能会使其成为一个合理的选择。
发布于 2013-04-25 03:54:01
你问有没有必要这样做?谁知道呢。这取决于您有多少磁盘空间。但是,您所描述的是一个“老式”聚合表,通常用于提高报告性能。在处理历史数据时,由于数据不会更改,因此不需要重新计算每周总数等内容。
事实上,如果我这样做,我还会定义“每月”和“年度”汇总表,以获得更大的灵活性,特别是对于如此多的历史记录。您可以考虑以这样一种方式对数据进行“标准化”,即每个周期都是可比较的。日历月和周有不同的交易日,所以像“日均成交量”这样的东西可能会产生误导。
如果你真的想变得花哨,那就研究一下ROLAP解决方案吧。这是一个非常广泛的主题,但您可能会发现它很有用。
发布于 2013-04-25 11:33:14
既然这些数据都可以从第一个表中计算出来,那么有必要再次存储它吗?
没有必要对其进行汇总和存储。您可以只创建一个执行所有汇总计算的视图,并查询该视图。
但是,如果您要对整个数据范围内的数据运行大量报告,那么汇总一次并存储结果是有意义的。您将从大约4000万行开始。(3500个股票* 43年*大约265天/年)
如果我处于您的位置,我会加载数据,编写每周价格的查询,并测试性能。如果速度太慢,可以将汇总数据插入到表中。
https://stackoverflow.com/questions/16200320
复制相似问题