Chr*_*ini 2 mysql sql database database-design ruby-on-rails-3
我有一张表可以跟踪文章视图.它包含以下列:
id, article_id, day, month, year, views_count.
Run Code Online (Sandbox Code Playgroud)
假设我想跟踪每篇文章的每日观看次数.如果我有1000个用户写的文章.行数将计算为:
365 (1 year) * 1,000 => 365,000
Run Code Online (Sandbox Code Playgroud)
哪个也不错.但是,请说.文章数量增长到1M.随着时间的推移,到了3年.行数将计算为:
365 * 3 * 1,000,000 => 1,095,000,000
Run Code Online (Sandbox Code Playgroud)
显然,随着时间的推移,这张桌子将继续增长.并且非常快.这会引起什么问题?或者我不应该担心,因为RDBM处理这种情况很常见?
我计划在报告中使用观看数据.要么将其分解为数月甚至数年.我应该担心表中的1B +行吗?
问自己(或您的利益相关者)的问题是:您是否真的需要对旧数据进行1天分辨率?
了解MRTG等产品如何通过RRD进行日志记录.理论上,您不会无限期地以最大分辨率存储所有数据,但会定期将它们聚合为越来越大的摘要.
这样你可以在最后5分钟内获得1秒的分辨率,然后是最后一小时的5分钟平均值,然后是每小时一天,每天一个月,依此类推.
所以,例如,如果你有一堆像这样的记录用于一篇文章:
year | month | day | count | type
-----+-------+-----+-------|------
2011 | 12 | 1 | 5 | day
2011 | 12 | 2 | 7 | day
2011 | 12 | 3 | 10 | day
2011 | 12 | 4 | 50 | day
Run Code Online (Sandbox Code Playgroud)
然后,您将定期创建一个汇总这些数据的新记录,在此示例中只是该月的总计数
year | month | day | count | type
-----+-------+-----+-------|------
2011 | 12 | 0 | 72 | month
Run Code Online (Sandbox Code Playgroud)
或者每天的平均值:
year | month | day | count | type
-----+-------+-----+-------+------
2011 | 12 | 0 | 2.3 | month
Run Code Online (Sandbox Code Playgroud)
当然,你可能需要一些标志,表示该数据的"总结"的地位,在这种情况下,我用了一个"类型"栏中查找"原始"记录和处理的记录,让您清除了一天的记录按要求.
INSERT INTO statistics (article_id, year, month, day, count, type)
SELECT article_id, year, month, max(day), sum(count), 'month'
FROM statistics
WHERE type = 'day'
GROUP BY article_id, year, month, type
Run Code Online (Sandbox Code Playgroud)
(我还没有测试过那个查询,这只是一个例子)