2011-02-05 39 views
3

我想构建一些类似于Facebook的活动源。在问我的问题之前,我想解释一下我的mySQL数据库设计。我有一个用户表,即。活动提要的数据库设计和SQL查询?

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

的用户可以按照对方,这里就是所谓的“追随者”

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

正如我们看到的,在上面的表中,用户B是继用户A和userD表。

现在我的问题是,当user_id中的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查询)

感谢您阅读此长的问题和可能的帮助。

回答

3

是的,您需要一个表来存储活动数据。否则,你将不得不在其他地方存储这些数据。

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

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

你目前的设计似乎是合理的,包括什么。但除此之外,它似乎特别缺乏一种方式来通知用户新的活动信息。

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

follower_id int 
activity_id int 

大概这两个应该是一个联合PK。

通知通过插入activity来触发。 '触发...触发... aha,那么它应该是插入的activity上的触发器!'。但是当然。当出现新的活动信息时,您应该将新近活动的用户与关注者链接起来,以形成一个适当的follower/activity对列表,该列表相应地插入到new_activity中。

另外,我认为,插入的followers也可能是触发器。当一个新的user/follower对出现时,您可能想要在该用户的最近一段时间(例如,一周或一天)内通过activity运行,以便能够通知新的跟随者已经存在一些(或不存在)最近刚刚开始的活动)。

一旦用户被通知,即我明白,一旦有关于新活动的信息被请求,应立即删除通知。现在似乎有点棘手,然后插入。我认为应该有一个像GetNewActivity (@follower_id int)这样的存储过程,它从指定的跟随者中读取new_activity的所有行,并将它们作为表格返回,并将其从new_activity中删除,以免用户再次收到有关这些行的通知。到目前为止,我还没有看到为什么所有的操作都不能在交易中进行分组。如果你设法设计你的系统,只能通过GetNewActivity这种方式获得新的活动信息,那么我认为应该没有问题重复或错过新的活动通知。

到目前为止,我不打算设计概念性和实际查询的乐趣。但是,如果这对你有一些挑战,我已经准备好帮助,我相信,所有的社区都是如此。我正在邀请后者对他们不可避免地拥有的设计提出批评。 :)

至于你的问题#2,以及为什么我迄今为止限制不给你查询的例子......那么,你已经provided用一种方法如何从用户的活动后跟特定用户(追随者)。我几乎可以肯定,你会得到另一种解决方案,而我,其中之一就是要特别做到这一点,但后来我认为它更好。

看起来你似乎有些新的加入或至少不是很有信心如何使用它们,我想鼓励你学习简单的查询ar已经提供给你,因为它是一种模式,你是需要为新问题的活动通知构建查询部分。也就是说,我建议你先尝试自己做那部分,这就是为什么我不会用第二个问题的另一个解决方案分散注意力,而是指向你提到的查询:这是一个很好的解决方案以及构建您需要的其他查询的有用起点。

+0

非常感谢您提供了如此详细和精彩的回复。 – tcj 2011-02-05 16:52:15