【发布时间】: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,获取该视频所属的播放列表
目前,一个视频只能属于一个播放列表。
现在回答我的问题:
- 能否提醒我为什么在这种情况下使用映射表?我记得这是“好习惯”,但我不记得确切的原因。与在
t_videos中包含p_id作为另一列(FK)相比,使用单独的映射表如何“更好”?这不会让我的查询变得更简单吗? - 有没有更高效的设计可以达到同样的效果?
- 我描述的三种情况的 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