我需要在网站上显示用户的上一个活动.
评论发布,图像/视频上传,投票文章等…
我有两张桌子:
‘user_activity’表包含’userID’,’datetime’,’activityID’和’externalID’列.
带有’activityID’和’activity’的’activities’表.
假设’activityID’= 4,那么我知道它依赖于上传的视频(通过查看’活动’表),然后我也知道externalID会从第三个名为’videos’的表中转移到’videoID’.
对于每种类型的活动都是相同的,如果它是一个评论,那么’externalID’会在’评论’表中提供’reviewID’.
在显示用户活动时,我不仅要说用户上传了图像,还要显示上传的图像或视频等等.
所以,
查询用户上次活动时,我可以通过两种方式获取数据:
1)从’user_activity’表中获取数据,然后根据’activityID’对每个行进行另一个查询到外部表(评论,视频,图像……).
2)将所有表格(user_activity,评论,视频,图像……)放在一起进行大型LEFT OUTER JOIN,然后仅使用基于“activityID”的相关列.
因此,方式1将导致大量数据库查询,因为我需要为每个活动行提供不同的查询.方式2将导致BIG JOIN.
关于PROS CONS和方法的任何好建议都比较好?
最佳答案 您设置的内容称为多态关联.这是一个以不同方式一遍又一遍地解决的问题.现在您已经知道如何找到它,您可以在interwebz上找到关于此的大量信息.
更具体地回答你的问题:这取决于.如果您将表设置为使用InnoDB并且只加入外键,则数据库上的JOIN可以更容易.不幸的是,InnoDB不支持多态外键.
一般来说,扩展数据库比扩展应用程序更困难,因此将工作从数据库层移动到应用程序层的任何事情都是一件好事.然而,这真的只是你担心缩放(并且记住,过早的优化可能对创业公司造成致命打击).
有关更多详细信息,请查看Quora上此问题的最佳答案:What are the scaling issues to keep in mind while developing a social network feed?