0

自从我上一次数据库课程以来已经有一段时间了,我对 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)

我要执行的查询如下:

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

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

现在我的问题:

  1. 你能提醒我为什么我们在这种情况下使用映射表吗?我记得这是“好习惯”,但我不记得确切的原因。使用单独的映射表比在中包含p_id作为另一列(FK) “更好”如何t_videos?这不会让我的查询更简单吗?
  2. 有没有更有效的设计可以达到同样的效果?
  3. 我描述的三种情况的 SQL 查询是什么?(我正在使用 MySQL)
4

1 回答 1

1
  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  

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

编辑:这一切都假设你有一个一对多,这就是你所说的。在我看来,这种关系应该是多对多的。

于 2012-04-12T12:38:23.237 回答