我正在社区网站上工作。我想在网站的 2 位置显示用户的活动。
例如,表格是:
我的问题在于Sql结构。我已经阅读了这个问题"User recent activities - PHP MySql"
“联盟”的想法很好但我有另一个想法。我打算创建一个名为
的新表字段:
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()
的优点:
缺点:
任何想法或建议大型网站如何处理它? digg,facebook等。
答案 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_id
和datetime
,假设您将为特定用户选择活动并按日期排序。
使用MySQL的EXPLAIN (<query>)
确保您的索引针对您经常运行的查询进行了优化。
答案 2 :(得分:2)
我不明白为什么你需要朋友的ID。对于朋友页面,你首先要为他的所有朋友做一个选择,然后从活动表中选择user_id in(2,6,89 etc)
我会将照片和视频字段设为一个名为type的字段,其中照片和视频将是值,这样您以后可以添加更多活动类型
我会将p_id和v_id设为一个名为item_id的列。不需要2列
我会添加一个名为info的额外列,我将以json格式存储其他信息。这是针对并非所有事件都具有的额外数据。例如,你可以有一个事件来添加一个链接到配置文件...你可以把链接放在那里,因为其他事件没有网址,只为这个事件类型添加一个列不是一个好的解决方案< / p>