我需要在网站上显示用户上次活动。 发布评论,上传图片/视频,投票文章等......
我有两张桌子:
带有'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和方法的任何好建议都更好??
答案 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?