活动源的数据库设计和SQL查询?

时间:2011-02-05 07:57:33

标签: sql database-design

我想构建一些类似于facebook的活动Feed。在我提出问题之前,我想解释一下我的mySQL数据库设计。我有一个用户表,即

user_id     name     other columns
userA       -           -
userB       -           -
userC       -           -
userD       -           -

用户可以互相关注,这里是名为“粉丝”的表格

id      user_id         follower_id
1        userA            userB
2        userD            userB
3        userB            userA
-
-
-

如我们所见,在上表中,userB遵循userA和userD。

现在我的问题是,当userB所关注的user_id中的任何用户进行活动时,应该通知。我应该制作另一张桌子,比方说,“活动”,如:

user_id     activity_type   activity_link  activity_date  
userA           note
userB           photo
userC           note
userD           photo

问题1:我是否需要制作额外的表格(如上所示)来存储活动,或者可以在没有这些活动的情况下完成?

问题2:由于userB只关注userA和userD,因此userB只关注他所关注的用户,我该如何构建sql查询呢? ......喜欢:

 Select * from activity where user_id exists in user_id in followers table where follower_id = userB 

(这是我的想法,你能帮我构建SQL查询)

感谢您阅读这个长期问题和可能的帮助。

2 个答案:

答案 0 :(得分:3)

是的,您需要一个表来存储活动数据。否则,您必须将此数据存储在其他位置。

编写查询的最简单方法是使用连接。在这种情况下,如果当前用户关注,我们只需要活动行,因此我们可以使用内部联接。

select * from activity a
    join followers f on a.user_id = f.user_id
where follower_id = 'userB' 

答案 1 :(得分:1)

您目前的设计对于所包含的内容似乎是合理的。但是,否则似乎特别缺乏通知用户活动信息的方法。

到目前为止,我想它实现为一种队列表,我们称之为new_activity。可能的设计可能是这样的:

follower_id int
activity_id int

可能两者应该是PK。

通过插入activity来触发通知。 '触发......触发...啊哈,然后它应该是activity上的插入触发器!'。但是当然。当出现新的活动信息时,您应该将新活跃的用户与关注者相关联,以形成正确的follower/activity对列表,并将其插入new_activity

另外,我认为,followers上也可能存在插入触发器。当出现新的user/follower对时,您可能希望在最近一段时间内(例如一周或一天)为该用户运行activity,以便能够通知新关注者最近有一些(或者没有)活动。

一旦收到有关新活动的信息,应立即通知用户,即我理解,应立即删除通知。现在看起来有点棘手,然后插入。我认为应该有一个像GetNewActivity (@follower_id int)这样的存储过程从new_activity读取指定关注者的所有行,将它们作为表返回,并将它们从new_activity中删除,这样就不会通知用户关于那些再次。到目前为止,我还没有看到为什么所有操作都无法在事务中进行分组。如果您设法设计系统的方式只能通过GetNewActivity方式获取新活动信息,那么我认为重复或错过新活动通知应该没有问题。

到目前为止,我不会剥夺你设计概念和实际查询的乐趣。然而,如果这对你来说是一个挑战,那么我很乐意提供帮助,我相信,所有社区都是。而且我邀请后者对他们不可避免地拥有的设计提出批评。 :)

关于你的问题#2以及为什么我到目前为止限制不给你提供查询示例......好吧,你已经provided了解了如何从用户那里获得活动的{{3}}特定用户(关注者)。我几乎肯定你会得到替代解决方案,而我,其中一个,特别是那个,但后来我认为更好。

您似乎对某些人来说是新手,或者至少对如何使用它们没有信心,我们鼓励您研究ar为您提供的简单查询,因为它是一个模式,您将需要为问题的新活动通知部分构建查询。也就是说,我建议你先尝试自己做这个部分,这就是为什么我不会用你的第二个问题的另一个解决方案来分散你的注意力,而是指向你提到的问题:这是一个很好的解决方案并且是构建您需要的其他查询的有用起点。