数据库设计用于保存统计信息并保存统计信息的历史记录

时间:2015-02-11 09:48:38

标签: mysql sql database database-design

我目前正在开展一个项目,我希望保存用户的统计信息。让我们假设,我保存了他的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的MAXMIN函数。

如您所见,上述所有情况都很简单。我只想到的是哪一个最好?

从数据库工程师的角度来看?从逻辑的角度来看?哪种情况最有意义?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您只需要一个包含“原始”收集数据的表+一个时间戳(方案3的更简单版本)。然后,您可以从该表中查询在整个日期分组的最小/最大聚合。你没有冗余(好)。

如果表变大并且查询变慢,您可以在timestamp列上放置一个索引,如果这也太慢,您可以通过创建一个新表来引入冗余,该表包含每晚用查询填充的聚合然后从您的应用程序中查询该表。