Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于播放列表的视频数据库设计_Php_Mysql_Database_Database Design_Relational Database - Fatal编程技术网

Php 基于播放列表的视频数据库设计

Php 基于播放列表的视频数据库设计,php,mysql,database,database-design,relational-database,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\u

我上一节数据库课已经有一段时间了,我对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\u id
    ,获取该播放列表中的所有视频
  • 给定
    v_id
    ,获取此视频所属的播放列表
目前,一个视频只能属于一个播放列表

现在回答我的问题:

  • 您能提醒我为什么在这种情况下使用映射表吗?我记得这是“良好的实践”,但我不记得确切的原因。在
    t\u视频
    中,使用一个单独的映射表比将
    p\u id
    作为另一列(FK)包含“更好”是什么?这难道不会让我的问题简单得多吗
  • 有没有更有效的设计可以达到同样的效果
  • 对于我描述的三种情况,SQL查询是什么?(我正在使用MySQL)
  • 如果当前视频和播放列表之间存在一对多关系,则无需映射表,只需在t_视频中包含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  
    
    请注意,为了简单起见,我使用*而不是列名,但是您应该只包含希望显示的列名


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

    对于问题1,问问你自己,你是希望一个视频只添加到一个播放列表中还是添加到多个播放列表中,你就会得到答案。啊,是的,我记得。所以如果我想
    1
    video to被添加到
    n
    播放列表中,那么我必须使用映射表,对吧!?我是否使用映射表对效率有多大影响?我想一个播放列表就足够了,如果它能大大提高查询的效率!?它通常被称为连接表,我真的不明白你是怎么想的否则,可以将1个视频添加到n个播放列表中。从效率角度来看,如果1个视频=1个播放列表,则比1个视频=n个播放列表快,因为您只对1个视频执行1次查找。映射表的另一种替代方法是:如果我知道
    1
    视频最多属于
    3
    播放列表,那么我可以在中创建3个额外的FK列ode>t_videos。这会比使用映射表更有效吗?不会,外键不应该有3个不同的列指向同一个表。