【问题标题】:Best way to model user 'timeline' of activities in the database在数据库中建模用户活动“时间线”的最佳方法
【发布时间】:2014-02-02 11:54:01
【问题描述】:

我目前正在构建一个基于网络的迷你社交网络。像 Facebook 一样,每个用户都有一个发布最近活动的时间线。这些活动包括状态更新、发布到页面、添加新朋友和喜欢页面。

它们在数据库中使用这些具有各自列的表单独建模:

用户

  • user_id
  • 名字
  • 姓氏

状态

  • status_id
  • user_id
  • 内容
  • 时间

发布

  • user_id
  • page_id
  • 内容
  • 时间

朋友

  • 朋友1
  • 朋友2
  • 状态
  • 时间

喜欢

  • page_id
  • user_id
  • 时间

问题是,我需要按时间倒序显示所有这些活动。您可能会注意到,这些表中有一个 time 列,但是如果这些表有不同的列,我将如何查询所有这些活动?关于我将如何执行此操作的任何想法?蒂亚!

【问题讨论】:

    标签: php mysql sql database database-design


    【解决方案1】:

    您可以尝试使用@user_id 作为参数创建一个存储过程,并在其中包含以下查询:

    SELECT status_id AS activity_id, time, "StatusUpdate" AS activity_desc 
    FROM STATUS 
    WHERE user_id = @user_id
    UNION 
    SELECT page_id AS activity_id, time, "LikePage" AS activity_desc 
    FROM LIKE
    WHERE user_id = @user_id
    .
    .
    --Here specify selections from other tables as well
    ORDER BY time DESC
    

    我希望这能给你一个关于如何去做的指导。让我知道这是否是您要找的。​​p>

    附录:

    上面的查询会返回一个按时间顺序排列的不同类型的活动列表。现在有了这个结果在您的业务逻辑层中,您可以通过调用针对特定活动类型的存储过程,根据其ACTIVITY_DESC 字段获取特定活动的其他详细信息。存储过程可能如下所示:

    CREATE PROCEDURE GetStatus @status_id INT
    AS
    SELECT * FROM STATUS
    WHERE status_id = @status_id         
    

    明智地获取活动详细信息也有助于提高性能,因为只有在需要在时间线页面上显示活动的详细信息时才会获取活动的详细信息。

    【讨论】:

    • 感谢您的回答!我对这个解决方案的问题是我必须查询每个表的其他列才能显示每个活动的详细信息,效率不高。例如,如果程序生成的查询结果中的row number 1是用于状态更新,那么我必须查询状态的内容。然后,如果 row number 2 是页面中的帖子,那么我必须查询 page_id 和帖子的内容。有什么建议么?谢谢!
    • 我已经附加了一个附录,请查看我上面的解决方案。
    猜你喜欢
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    相关资源
    最近更新 更多