首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相关视频数据库表结构

相关视频数据库表结构
EN

Stack Overflow用户
提问于 2020-01-08 08:31:31
回答 1查看 145关注 0票数 0

我正在尝试找出最适合相关视频的表结构。我有一个表videos,其中包含所有视频的详细信息。我正在计划一个视频推荐的新功能,我将手动创建现在。

我在考虑将其存储在videos表videos.relatedVideos中的表列中,并存储相关视频ID的JSON数据。但是,我希望它也能向后兼容。

因此,假设将带有ID = 5的视频添加为具有ID = 10的视频的相关视频,则表结构将为

代码语言:javascript
复制
   | id | videoId | ..... | relatedVideos|

   | 1  | 10      | ..... | [5]          |
   | 2  | 4       | ..... | [3,6,7]      |

我还希望与ID = 10的视频作为与ID = 5视频的相关视频。一种方法是在为#5创建条目时,在videos表上为#10创建一个新条目

代码语言:javascript
复制
   | id | videoId | ..... | relatedVideos|

   | 1  | 10      | ..... | [5]          |
   | 2  | 4       | ..... | [3,6,7]      |
   | 3  | 5       | ..... | [10]         |

但我正在寻找更合适的东西,在那里我可以绘制视频之间的多对多关系。

一种选择是创建表relatedVideos,并为与主视频相关的每个相关视频创建新条目,但是当为任何特定视频添加/编辑相关视频时,这可能导致重复记录。

代码语言:javascript
复制
|id | videoID | relatedVideoID|
|1  | 5       | 10            |
|2  | 5       | 15            |
|3  | 5       | 13            |
|4  | 13      | 19            |

现在,我正在做的是,如果我正在浏览视频页面,我将执行两个查询(Select relatedVideoID from relatedVideos where videoID = 13)(Select videoID from relatedVideos where relatedVideoID = 13)。我相信我可以用SQL joins或unions做类似的事情,我还没有探索这些选项。

然后,我将合并两个数组结果以获得[19, 5] (我只保留不同的ID)。这就完成了工作,然而,我真的很期待实现一个更合适的解决方案。

只是在寻找一些关于什么是一个好的方法的建议。

EN

回答 1

Stack Overflow用户

发布于 2020-01-08 08:42:59

我建议使用最后列出的选项,即建立一个桥接表来存储视频之间的N-M关系。

一般来说,关系数据库不擅长管理JSON或CSV数据(尽管它们中的一些具有很好的供应商特性)。基本的SQL查询很快就会变得更加难以编写,性能也会受到影响(是一篇关于在数据库列中存储CSV的著名文章)。

您需要存储的附加数据的结构简单且定义良好,并且对应于基本的数据库规范化模式,因此实际上没有理由遵循JSON或CSV路径。

附注:为了保持数据的完整性和避免重复,你需要确保你没有存储像(1, 2)(2, 1)这样的对。如果您运行的是MySQL 8.0,则可以对此使用检查约束。表的DDL可能如下所示:

代码语言:javascript
复制
create table related_videos (
    video_id1 int,
    video_id2 int,
    check(video_id1 < video_id2),
    primary key(video_id1, video_id2),
    constraint fk_related_video1 foreign key (video_id1) references video(id),
    constraint fk_related_video2 foreign key (video_id2) references video(id)
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59637968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档