Mysql数据库设计-捕获视频使用情况指标

时间:2018-10-31 13:21:15

标签: mysql sql database-design

我最近移交了这个现有的应用程序。有一个mysql数据库表,该表用于跟踪用户最后一次观看视频的时间。

表格的简单裸版是

id -> Primary_key
user_id
video_id
last_watched_time
last_viewed_time (DateTime)

在last_watched_time列中,它们存储从几秒开始播放视频的时间。

方法是,当用户开始播放视频时,将在表中插入一条新记录(如果该用户的记录不存在并且视频不存在),然后在用户观看视频时-每20个秒-对该记录进行更新以捕获上次观看时间。因此,如果用户在不按下停止按钮的情况下点击下一个视频,我们就知道他停止的时间。

因此,如果用户观看新视频1分钟并关闭浏览器,则last_watched_time列将更新3次20、40、60。存储的最后一个值是60。因此,当他回来时-视频从1分钟标记开始播放。


id  |  user_id  |  video_id  |  last_watched_time  |  last_viewed_time
-------------------------------------------------------------------------
1   |     10    |     6      |       60            | 2018-10-01 10:10:10

这是一个包含实时数据的现有表。

现在,他们想开始衡量用户使用情况的详细指标,例如 -最近7天内,用户每天观看了多少小时的视频 -在最近6小时内,用户观看的视频小时数按小时细分了

所以我首先想到的是做以下事情 -在此表中添加另一个名为view_time的列 -每20秒更新一次以插入语句

因此,对于上述相同情况,表中的数据应为

id  |  user_id  |  video_id  |  last_watched_time  |  view_time  |  last_viewed_time
-----------------------------------------------------------------------------------------
1   |     10    |     6      |         0           |      0      |   2018-10-01 13:10:10
2   |     10    |     6      |        20           |     20      |   2018-10-01 13:10:30
3   |     10    |     6      |        40           |     20      |   2018-10-01 13:10:50
4   |     10    |     6      |        60           |     20      |   2018-10-01 13:11:10

现在,如果同一用户在2小时后返回,则将视频转发10分钟并观看25秒

5   |     10    |     6      |       660           |    600      |   2018-10-01 15:11:10
6   |     10    |     6      |       680           |     20      |   2018-10-01 15:11:30

通过这种方式,我仍在跟踪last_watched_time,如果他们想要每日或每小时的指标,我可以按天或小时进行分组并汇总view_time,以了解用户当天或小时观看了多少分钟。

我用这种方法看到的一个明显问题是,如果用户观看视频达4个小时-经过20秒的插入语句以捕获last_watched_time-大约720行将插入到该表中。而且,如果我们说的是100个用户-这个数字只会成倍增加。

这种方法是否正确?我该怎么办?

1 个答案:

答案 0 :(得分:0)

INSERT而不是SELECT上进行工作。这样,需要存储的数据要少得多,而SELECTs则要快得多。

如果您想要的只是总计观看时间,则仅存储该时间。也就是说,当有新记录出现时,请在20秒前添加现有记录

由于您需要每天和每小时的观看时间,因此每隔一个小时,就不要添加到现有记录中,而是开始一个新记录。在极端情况下,这会将行数减少180倍(60分钟@ 20秒间隔)。对于“冲浪”,可能没有收缩。