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

时间:2012-04-12 12:08:27

标签: php mysql database database-design relational-database

我的上一个数据库类已经有一段时间了,我对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作为t_videos中的另一列(FK)?不会让我的查询更简单吗?
  2. 是否有更高效的设计可以达到同样的效果?
  3. 我描述的三种情况的SQL查询是什么? (我正在使用MySQL)

1 个答案:

答案 0 :(得分:1)

  1. 如果您目前在视频和播放列表之间存在一对多的关系,那么映射表就不需要在t_videos中拥有p_id(FK)。如果你有多对多关系,那么你需要映射表。你是对的,因为在你的情况下你有一对多,在t_videos表中使用p_id会使查询更简单。

  2. 就像我说的,除非你有多对多,否则不需要映射表。至于更高效的设计,您所拥有的概念非常简单,设计也是如此。不确定它是否能比这更有效率。

  3. 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  
    

    请注意,为简单起见,我使用*而不是列名,但是您应该包含要仅显示的列名。

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