gpt4 book ai didi

php - 带播放列表的视频数据库的数据库设计

转载 作者:行者123 更新时间:2023-11-29 14:30:28 25 4
gpt4 key购买 nike

自从上一次数据库类(class)以来已经有一段时间了,我对 PHP/MySQL 应用程序的以下基本数据库设计有一些疑问,该应用程序是带有播放列表的视频数据库:

t_playlists
p_id (PK) | name | description

t_videos
v_id (PK) | name | description | playcount

t_mapping
v_id (FK) | p_id (FK)

我要执行的查询如下:

  • 获取所有播放列表 - 包括每个播放列表中的视频数量,但不包括视频本身
  • 给定 p_id,获取该播放列表中的所有视频
  • 给定一个v_id,获取该视频所属的播放列表

目前,一个视频只能属于一个播放列表。

现在回答我的问题:

  1. 您能提醒我为什么我们在这种情况下使用映射表吗?我记得这是“好的做法”,但我不记得确切的原因。使用单独的映射表比将 p_id 作为另一列 (FK) 包含在 t_videos 中“更好”吗?这不是会让我的查询变得更加简单吗?
  2. 是否有更高效的设计可以实现相同的效果?
  3. 我所描述的三种情况的 SQL 查询是什么? (我使用的是MySQL)

最佳答案

  1. 如果当前视频和播放列表之间存在一对多关系,则映射表无需仅在 t_videos 中包含 p_id (FK)。如果您要建立多对多关系,那么您将需要映射表。你是对的,因为在你的情况下你有一个一对多,在 t_videos 表中包含 p_id 将使查询更简单。

  2. 就像我说的,除非你有多对多,否则不需要映射表。至于更高效的设计,你的概念很简单,设计也很简单。不太确定它是否可以比这更有效。

3.第一个需要一个嵌套语句来获取视频的计数,这样它就会像这样。

SELECT "name", description, (SELECT COUNT(*) FROM t_videos WHERE fk_p_id = p_id) AS VideoCount FROM t_playlists      

这将在名为 VideoCount 的列中显示每个播放列表的计数

SELECT * FROM t_videos WHERE fk_p_id = given_p_id 

(这是如果您要删除映射表并将 p_id 包含在视频表中

SELECT * FROM t_playlists 
INNER JOIN t_videos
ON t_playlists.p_id = t_videos.fk_p_id
WHERE v_id = given_v_id

请注意,为了简单起见,我用 * 代替了列名称,但您应该仅包含要显示的列名称。

编辑:这一切都假设您有一对多,正如您所说的那样。在我看来,这种关系应该是多对多的。

关于php - 带播放列表的视频数据库的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10123267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com