我目前正在开展一个项目,我希望保存用户的统计信息。让我们假设,我保存了他的Facebook页面的统计数据。 (Page-Likes,Comment-Count当天所有帖子,Share-Count当天所有帖子。
问题是,我想保存计数,但也将数据保存为sperate表中的历史记录。我还希望获得这些值的min/max
值。
现在我遇到的问题如下。我究竟会在哪里保存当天的数据,哪里可以保存最大/最小值?我是否会将包含max/min/current
值的最新数据保存到表facebook_pages
中并保存到facebook_history
?
现在我有几个场景
场景1:将最新数据保存在一个表格中
//Table 1: facebook_pages
id
facebook_page_id
page_likes
page_likes_MAX
page_likes_MIN
post_likes
post_likes_MAX
post_likes_MIN
post_shares
post_shares_MAX
post_shares_MIN
post_comments
post_comments_MAX
post_comments_MIN
//Table 2: facebook_history
id
facebook_pages_id (referencing the id on the table facebook_pages)
page_likes
post_likes
post_shares
post_comments
checkDate (date when the data got gathered)
这里很简单。当我想要用户的所有数据时,我只需要运行查询
"SELECT * FROM facebook_pages WHERE id = {ID}";
情景2:仅将最大/最小值保存到一个表格中
//Table 1: facebook_pages
id
facebook_page_id
page_likes_MAX
page_likes_MIN
post_likes_MAX
post_likes_MIN
post_shares_MAX
post_shares_MIN
post_comments_MAX
post_comments_MIN
//Table 2: facebook_history
id
facebook_pages_id (referencing the id on the table facebook_pages)
page_likes
post_likes
post_shares
post_comments
checkDate (date when the data got gathered)
这个也很简单(小心,这里只是伪代码)
"SELECT * FROM facebook_pages INNER JOIN facebook_history
WHERE id = {ID} AND checkDate = {TODAY}";
场景3:仅保存历史记录并在需要数据时查询最大值/最小值
//Table 1: facebook_pages
id
facebook_page_id
page_likes
post_likes
post_shares
post_comments
//Table 2: facebook_history
id
facebook_pages_id (referencing the id on the table facebook_pages)
page_likes
post_likes
post_shares
post_comments
checkDate (date when the data got gathered)
这里的这个也很简单。只需查询ID,然后选择MySQL的MAX
和MIN
函数。
如您所见,上述所有情况都很简单。我只想到的是哪一个最好?
从数据库工程师的角度来看?从逻辑的角度来看?哪种情况最有意义?
答案 0 :(得分:0)
如果我理解正确,您只需要一个包含“原始”收集数据的表+一个时间戳(方案3的更简单版本)。然后,您可以从该表中查询在整个日期分组的最小/最大聚合。你没有冗余(好)。
如果表变大并且查询变慢,您可以在timestamp列上放置一个索引,如果这也太慢,您可以通过创建一个新表来引入冗余,该表包含每晚用查询填充的聚合然后从您的应用程序中查询该表。