活动提要的数据库设计和SQL查询?
我想构建一些类似于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查询)
感谢您阅读此长的问题和可能的帮助。
是的,您需要一个表来存储活动数据。否则,你将不得不在其他地方存储这些数据。
编写查询的最简单方法是使用连接。在这种情况下,如果当前用户正在关注,我们只想要活动行,所以我们可以使用内部联接。
select * from activity a
join followers f on a.user_id = f.user_id
where follower_id = 'userB'
你目前的设计似乎是合理的,包括什么。但除此之外,它似乎特别缺乏一种方式来通知用户新的活动信息。
到目前为止,我想它是作为一种队列表来实现的,我们称之为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
已经提供给你,因为它是一种模式,你是需要为新问题的活动通知构建查询部分。也就是说,我建议你先尝试自己做那部分,这就是为什么我不会用第二个问题的另一个解决方案分散注意力,而是指向你提到的查询:这是一个很好的解决方案以及构建您需要的其他查询的有用起点。
非常感谢您提供了如此详细和精彩的回复。 – tcj 2011-02-05 16:52:15