如果 2 个不同的表共享相同的点赞/投票表

Posted

技术标签:

【中文标题】如果 2 个不同的表共享相同的点赞/投票表【英文标题】:Should 2 different tables share the same like/vote table 【发布时间】:2019-02-13 13:25:21 【问题描述】:

我有点怀疑何时应该提供共享的“喜欢”表或将其拆分为两个不同的表。

该应用程序将以类似“墙”的方式显示视频/图像,就像 Facebook 和许多其他平台一样。

如果用户已经喜欢过某张图片或视频,那么“喜欢”按钮将被着色以表明该内容已被点过。

视频表

id    title    desc     url    src
------------------------------------
 1    soms     thing   wwww    .png

图像表

id    title    desc      src
------------------------------
 1    soms     thing    .jpg

选项1两张表

投票表视频

id    video_fk    user_fk    voted
-----------------------------------------
 1        1           1          2  

投票表图片

id    image_fk    user_fk    voted
-----------------------------------------
 1        1           1          2  

选项 2 1 表

投票表共享(type_fk 标识它是哪种类型,1 表示图像 2 表示视频)

id    content_fk    user_fk    type_fk    voted
-------------------------------------------------
 1        1           1          2          2

2 个表的问题是,当我必须查找用户是否喜欢该内容时(当滚动墙壁并获得许多结果时)我将不得不将结果存储在具有 id 和标识符的多维数组中决定它是哪种内容类型(图像或视频)。

你会是更好的方法,还是第三种方法?

【问题讨论】:

我已经给你答案了,但我会在这里详细说明。如果您选择我的方法,这意味着将两个表都减少到 contentvotes,您可以将内容类型存储在 content 表中,从而将其从 votes 中删除,因为它是一个相当反模式,因为您正在存储关于用于保存投票信息的表格中的内容。 不管你走哪条路,去掉id,因为有一个“自然的”PRIMARY KEY,它是2或3列的“复合”。 【参考方案1】:

您应该尽可能少地保留表格,因为这样可以减少请求的数量和代码的复杂性。

我什至会将视频和图像放在同一个名为“内容”的表中,看看您的所有列几乎都是一样的。

【讨论】:

我想过,但你看,内容类型不止 2 种,还有文章 + 类似 5 种以上,这些表格非常简化 :) 但是你会建议 1 个表格来表示喜欢,这也是我认为更好的解决方案,它确实简化了很多 @iiiml0sto1 如果您有类似articlesimagesvideosmusic 之类的内容。我会将它们分为几类:imagesvideosmusicmedia,因为实际上您需要的唯一列是 idtitledesctype (enum)url (but renamed to src),如果您知道如何使用 MIME 类型检测,则存储文件扩展名已过时。对于其他类型的内容,我会保留适当的表格,除非它们也可以分类。 给了一些思考,感谢您的帮助 我也打算对此添加评论 - 您只有两种类型的内容,但将来可能会扩展,您不想继续添加新表格。我肯定会使用包含对内容类型的引用的单个内容表。 如果您必须使用 content_fk 重新访问视频,代码会变得混乱。

以上是关于如果 2 个不同的表共享相同的点赞/投票表的主要内容,如果未能解决你的问题,请参考以下文章

从同一个包更新和插入到 2 个不同的表

在时间戳略有不同的2个不同数据库中的表之间连接(MySQL)

从不相关的表中选择不同的相同列值

将行动态添加到同一 HTML 中的 2 个不同表中

如果相同的表但不同的模式,如何避免重复 jpa 映射(实体、服务、存储库..)?

SQLITE:选择共享相同外键的所有项目