【问题标题】:Database design and SQL query for the activity feed?活动提要的数据库设计和 SQL 查询?
【发布时间】:2011-02-05 07:57:32
【问题描述】:

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

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

用户可以互相关注,这里是名为'followers'的表格

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 查询吗)

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

【问题讨论】:

    标签: sql database-design


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      你目前的设计似乎是合理的。但除此之外,它似乎特别缺乏通知用户活动信息的方法。

      到目前为止,我认为它是作为一种队列表实现的,我们称之为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 了解了一种如何从特定用户关注的用户那里获取活动的方法(追随者)。我几乎可以肯定你会得到其他解决方案,而我本来打算特别这样做,但后来我想得更好。

      您似乎对联接有点陌生,或者至少对如何使用它们不是很有信心,我想鼓励您研究ar 为您提供的简单查询,因为它是您的一种模式将需要为问题的新活动通知部分构建查询。也就是说,我建议您先尝试自己完成该部分,这就是为什么我不会用对第二个问题的不同解决方案来分散您的注意力,而是将您指向提到的查询:这都是一个很好的解决方案以及构建您需要的其他查询的有用起点。

      【讨论】:

      • 我喜欢你的解决方案,它让我可以非常有效地获取最近的活动。但是当用户有 100 个关注者时,我必须做 100 次插入来记录他的活动,这似乎非常低效。
      • @Ivan Virabyan:感谢您的反馈。我希望new_activity 表是整个架构中最热门的地方之一。因此,它可能应该被放在一个单独的数据库中,该数据库将被放置在一些高速存储设备上(至少,在服务变得如此受欢迎以至于人们最终拥有大量追随者的阶段)。作为替代方案,followers 表可以有一个last_followed 时间戳列。然后必须根据该时间戳和activity.activity_date 派生新活动。
      猜你喜欢
      • 2020-05-14
      • 1970-01-01
      • 2014-12-29
      • 2014-07-08
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      相关资源
      最近更新 更多