用户活动(ala facebook)DB方法。大加入或多个简单查询?

时间:2010-11-06 19:27:42

标签: php mysql facebook android-activity

我需要在网站上显示用户上次活动。 发布评论,上传图片/视频,投票文章等......

我有两张桌子:

带有'userID','datetime','activityID'和'externalID'列的

' user_activity '表。

带有'activityID'和'activity'的

'活动'表。

让我们说'activityID'= 4,然后我知道它依赖于一个上传的视频(通过查看'activities'表)然后我也知道externalID从第三个叫做''的表中转移到'videoID'视频。

对于每种类型的活动都是相同的,如果它是一个评论,那么'externalID'会在'评论'表中提供'reviewID'。

在显示用户活动时,我不仅要说用户上传了图片,还要显示上传的图片或视频等等。

所以,

在查询用户上次活动时,我可以通过两种方式获取数据:

1)从“user_activity”表中获取数据,然后根据“activityID”对外部表格(评论,视频,图片......)进行另一次查询。

2)将所有表格(user_activity,评论,视频,图片......)放在一起,然后只使用基于'activityID'的相关列。

因此,方式1将导致大量数据库查询,因为我需要为每个活动行提供不同的查询。方式2将导致BIG JOIN。

关于PROS CONS和方法的任何好建议都更好??

2 个答案:

答案 0 :(得分:2)

无。

高流量网站的解决方案是denormalization,这意味着您将拥有一些冗余数据,但您的用户活动查询将非常简单,从单个表格中获取所有必需的数据。

答案 1 :(得分:0)

您设置的内容称为多态关联。这是一个以不同方式一遍又一遍地解决的问题。现在你知道如何找到它,你可以在interwebz上找到很多关于它的信息。

更具体地回答你的问题:这取决于你。如果您将表设置为使用InnoDB并且只加入外键,则数据库上的JOIN可以更容易。不幸的是,InnoDB不支持多态外键。

一般来说,扩展数据库比扩展应用程序更难,因此将工作从数据库层移动到应用程序层的任何事情都是一件好事。然而,这真的只是你担心缩放(并且记住,过早的优化可能对创业公司造成致命打击)。

在Quora上查看此问题的热门答案,了解更多详细信息:What are the scaling issues to keep in mind while developing a social network feed?