我有一个网站,人们可以添加自己喜欢的电视节目 我想有一些趋势统计数据。例如:
我不知道如何为此设计数据库,但这是我的想法:
这种做法好吗?你会怎么做? :)
PS。我是一个Rails编码器,但这并不重要,除非有一些插件已经用于类似目的。
答案 0 :(得分:1)
MovieVotes
表跟踪每天的投票。 MovieRating
表是定期(每周)快照。
Calendar
表中的一行是一天。
CalendarId
表格中的MovieRating
指向评分期的最后一天,在本例中为WHERE DayInWeek = 7
。
CalendarId
表格中的MovieVotes
指向当天。
从MovieRating
您可以查看每周评分和投票。
从MovieVotes
开始,您可以在任意时间内汇总投票。
答案 1 :(得分:0)
您可以向数据表中添加两个索引:
t_1,t_2
然后每周一次cronjob在t_2上复制t_1并重新计算每个t_1
我觉得它很有效,因为你只为数据表上的2个索引“付费”,但在阅读数据时你不需要任何连接。
答案 2 :(得分:0)
以Damir的模型为例。我会按照MovieID和CalID的顺序翻转...你会想要查询不同的CalendarID以获得相同的移动而不是反过来。
他的MovieVotes表已经是当天的聚合。在过去几周内总共添加7个值对于数据库来说并不是一个挑战,并且不需要将MovieRating表作为聚合。如果MovieVotes有一个日期时间列来存储每次投票的确切时间,则需要使用MovieRating作为每日聚合...每次需要显示总数时,无需浏览数千条记录。这是预先聚集的地方。
现在如果你将数据集中在MovieID的PK上,那么DateID就是黄金。要计算任何电影的任何日期范围,您的数据库将走b-tree以获取该电影ID,然后走到树的其余部分以到达您的开始日期,现在您在第一个日期的叶块上无论如何,你的所有日期都很有可能在那个区块上。所以你会知道额外的I / O总和7天,只需要更多的CPU来读取块外的行然后对值进行求和。