我的上一个数据库类已经有一段时间了,我对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
,获取此视频所属的播放列表目前,一个视频只能属于一个播放列表。
现在问我的问题:
p_id
作为t_videos
中的另一列(FK)?不会让我的查询更简单吗?答案 0 :(得分:1)
如果您目前在视频和播放列表之间存在一对多的关系,那么映射表就不需要在t_videos中拥有p_id(FK)。如果你有多对多关系,那么你需要映射表。你是对的,因为在你的情况下你有一对多,在t_videos表中使用p_id会使查询更简单。
就像我说的,除非你有多对多,否则不需要映射表。至于更高效的设计,您所拥有的概念非常简单,设计也是如此。不确定它是否能比这更有效率。
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
请注意,为简单起见,我使用*而不是列名,但是您应该包含要仅显示的列名。
编辑:这是假设你有一对多,这就是你所说的。在我看来,这种关系应该是多对多的。