【问题标题】:user activity database structure用户活动数据库结构
【发布时间】:2011-01-06 20:17:48
【问题描述】:

我正在开发一个社区网站。我想在网站的 2 个位置显示用户的活动。

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

例如,表格是:

  • 成员
  • 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、脸书等

【问题讨论】:

  • 那么 11 年后,你用了什么方法,那张桌子怎么样了?我目前处于类似的过程中,不确定如何以有效的方式存储日志/活动。

标签: php sql mysql database data-structures


【解决方案1】:

我认为你是正确的,单表方法在这里是最好的。然而,一个缺点是它不能很好地扩展——如果你想添加链接或评论活动类型怎么办?使用此模型,您必须为每个模型添加另一列。我在 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';

【讨论】:

  • 这很好。但与其创建一个名为activity_types 的新MySQL 表,我只想创建一个数组。它使它更容易和更快。投票 + 选为最佳答案。谢谢。
  • 一个数组?你的意思是在PHP中?我认为在这种情况下最好使用 MySQL 的 ENUM 类型。 dev.mysql.com/doc/refman/5.0/en/enum.html
  • activity_types 表的优点在于您可以添加额外的列,例如 isActive 并控制要记录/查询的类型...等
【解决方案2】:

如果你有大量的行,只要你正确地索引表,这真的不会成为一个实际的缺点。

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

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

【讨论】:

  • 我对 INDEX 功能一无所知。谢谢,我要去搜索一下。
【解决方案3】:
  • 我不明白你为什么需要朋友 ID。对于朋友页面,您首先要为他的所有朋友进行选择,然后从 user_id in (2,6,89 等) 中的活动表中选择

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

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

  • 我将添加一个名为 info 的额外列,其中我将以 json 格式存储其他信息。这是针对并非所有事件都有的额外数据。例如,您可以有一个事件来添加指向配置文件的链接......并且您可以将链接放在那里,因为其他事件没有 url,并且仅为此事件类型添加列不是一个好的解决方案

【讨论】:

  • f_id 表示“X 已与 Y 成为朋友”。感谢其他说明。
  • 好吧,我在额外的列中看到了它,因为只有一个事件需要这个
猜你喜欢
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2018-02-06
  • 2011-02-13
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多