【问题标题】:Database Design for Video-DB with Playlists带有播放列表的视频数据库的数据库设计
【发布时间】:2012-04-12 20:44:21
【问题描述】:

自从我上一次数据库课程以来已经有一段时间了,我对 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. 能否提醒我为什么在这种情况下使用映射表?我记得这是“好习惯”,但我不记得确切的原因。与在t_videos 中包含p_id 作为另一列(FK)相比,使用单独的映射表如何“更好”?这不会让我的查询变得更简单吗?
  2. 有没有更高效的设计可以达到同样的效果?
  3. 我描述的三种情况的 SQL 查询是什么? (我正在使用 MySQL)

【问题讨论】:

  • 对于问题 1,问问自己,您是希望将视频添加到仅 1 个播放列表还是添加到 1 个以上的播放列表,然后您就会得到答案。
  • 啊,是的,我记得。所以如果我想将1 视频添加到n 播放列表中,那么我必须使用映射表,对吧!?无论我是否使用映射表,它在效率方面的差异有多大?我认为如果能大大提高查询效率,一个播放列表就足够了!?
  • 它通常被称为连接表,我真的不明白如何将 1 个视频添加到 n 个播放列表中。就效率而言,如果 1 个视频 = 1 个播放列表,它比 1 个视频 = n 个播放列表要快,因为您只需对 1 个视频进行 1 次查找。
  • 映射表的替代方案是:如果我知道 1 视频属于 3 播放列表最大,那么我可以创建 3 个额外的 FK 列在t_videos。这会比使用映射表更有效吗?
  • 不,你永远不应该有 3 个不同的列用于指向同一个表的外键。

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


【解决方案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  

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

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

【讨论】:

    猜你喜欢
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 2011-10-25
    • 2011-04-05
    相关资源
    最近更新 更多