用户活动数据库结构

时间:2010-01-19 14:46:59

标签: php sql mysql database data-structures

我正在社区网站上工作。我想在网站的 2 位置显示用户的活动。

  1. 用户“A”个人资料。
  2. 用户“A”朋友的好友页面。 “你的朋友在做什么?”

  3. 例如,表格是:

    • 成员
    • members_gallery
    • members_videos
    • members_friends

    我的问题在于Sql结构。我已经阅读了这个问题"User recent activities - PHP MySql"

    “联盟”的想法很好但我有另一个想法。我打算创建一个名为

    的新表
    • members_activity

    字段:

    id | user_id | photo | video | friend | p_id | v_id | f_id | datetime
    

    假设用户只是上传了图片

    id | user_id | photo | video | friend | p_id | v_id | f_id | datetime
    1  |   15    |   1   |   0   |    0   | 1203 |   0  |   0  |  NOW()
    

    的优点:

    • 当我进行SELECT QUERY时,我可以很容易地知道它是照片,视频还是友谊活动。
    • 用户可以删除“照片活动”但保留照片。
    • 可以轻松通知用户的朋友。

    缺点:

    • 大量的表格行?

    任何想法或建议大型网站如何处理它? digg,facebook等。

3 个答案:

答案 0 :(得分:8)

我认为你在这里采用单表方法是正确的。然而,一个缺点是它不能很好地扩展 - 如果你想添加链接或评论活动类型怎么办?使用此模型,您必须为每个模型添加另一列。我在Rails-land中看到的一种方法是使用多态模型,它看起来像这样:

id | user_id | activity_type_id | p_id | v_id | f_id | datetime

您可以看到我已使用activity_type_id替换了视频,照片等。然后会有第二个名为activity_types的表:

 id | name
----+-------
  1 | photo
  2 | video
  3 | ...

然后,当您创建members_activity记录时,您可以指定相应的activity_type_id,如果您想稍后创建新的活动类型,则相对轻松,您可以SELECT特定一种简单JOIN的活动,例如:

SELECT * FROM members_activity
  JOIN activity_types ON members_activity.activity_type_id = activity_types.id
 WHERE activity_types.name = 'photo';

答案 1 :(得分:2)

如果你有大量的行,只要你正确地索引表,它实际上不会是一个实际的缺点。

至少我会索引user_iddatetime,假设您将为特定用户选择活动并按日期排序。

使用MySQL的EXPLAIN (<query>)确保您的索引针对您经常运行的查询进行了优化。

答案 2 :(得分:2)

  • 我不明白为什么你需要朋友的ID。对于朋友页面,你首先要为他的所有朋友做一个选择,然后从活动表中选择user_id in(2,6,89 etc)

  • 我会将照片和视频字段设为一个名为type的字段,其中照片和视频将是值,这样您以后可以添加更多活动类型

  • 我会将p_id和v_id设为一个名为item_id的列。不需要2列

  • 我会添加一个名为info的额外列,我将以json格式存储其他信息。这是针对并非所有事件都具有的额外数据。例如,你可以有一个事件来添加一个链接到配置文件...你可以把链接放在那里,因为其他事件没有网址,只为这个事件类型添加一个列不是一个好的解决方案< / p>