Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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
Mysql 电影数据库,存储多种类型_Mysql_Sql_Database Design_Join_Many To Many - Fatal编程技术网

Mysql 电影数据库,存储多种类型

Mysql 电影数据库,存储多种类型,mysql,sql,database-design,join,many-to-many,Mysql,Sql,Database Design,Join,Many To Many,我正试图建立一个数据库来存储电影信息 Title Plot Genre Rating Director 唯一让我困扰的是,大多数电影并不只有一种类型,我正在努力找出如何将其存储在MySQL数据库中。起初,我想我只需要一个表,将所有类型存储在一列中,用逗号分隔,当我想检索它们时,用PHP将它们分隔开,但我不确定这是最好的方法,因为我想我在排序和搜索特定类型时会遇到困难,例如,当collumn包含“恐怖、颤栗、,行动。我建议您遵循以下结构: 表名:电影 电影

我正试图建立一个数据库来存储电影信息

    Title
    Plot
    Genre
    Rating
    Director

唯一让我困扰的是,大多数电影并不只有一种类型,我正在努力找出如何将其存储在MySQL数据库中。起初,我想我只需要一个表,将所有类型存储在一列中,用逗号分隔,当我想检索它们时,用PHP将它们分隔开,但我不确定这是最好的方法,因为我想我在排序和搜索特定类型时会遇到困难,例如,当collumn包含“恐怖、颤栗、,行动。

我建议您遵循以下结构:

表名:电影

电影ID、片名、情节、评级、导演

表格名称:体裁

根里德

表名:电影类型

电影导演

查询是:

select m.*,group_concat(g.genre)
from movies m inner join moviegenres mg
on m.movieid=mg.movieid
inner join genres g
on g.genreid=mg.genreid
group by m.movieid
;

请参见

您希望在此处建立的模型被称为“多对多”关系,这在对“真实世界”分类建模时非常常见

关于如何处理此类关系,有很多描述,包括:

  • Praveen的回答是针对你的问题的
  • -在多个/多个关系中连接两个总体的额外表格通常称为交叉表或连接表
  • 这很有帮助地展示了一个表和键/约束设计的示例,一个在不清楚的情况下方便的数据表示图,以及如何在应用程序中建模和使用关系
  • 任何好的数据库设计书籍/教程都会在某个地方介绍这一点
不要试图通过为每部电影在一个字段中存储多个类型(例如逗号分隔的列表)来跳过额外的交集表。这是一个非常常见的“反模式”,它会给你带来问题,也许不是今天,也许不是明天,但最终会。我建议从事数据库设计的人阅读一下Bill Karwin的“SQL反模式”()。它的写作方式应该是相对初学者可以理解的,但它包含了我们这些应该更了解的人需要不时提醒的内容(多对多关系、一个领域中的列表解决方案/问题,以及你应该做什么,是本书涵盖的第一件事).

这个答案是我对@Praveen Prasannan上述评论的详细阐述。 我将消除任意代理键
movieID
genreID
,以消除关系数据库的必要开销。由于
title
genre
是自然唯一的键,我们应该使用它们,而不是要求数据库维护额外的、无意义的键和表的唯一性(参考答案中的
genres
表)。这将提高大型关系数据库的速度和性能,这是一个很好的实践

表名:电影

主键:标题

标题、情节、等级、导演

表名:电影类型

主键:标题、类型

标题、体裁


这也使得用户和机器的查询变得更加容易,因为您不必加入额外的表来通过任意UID对类型进行解码。

有点晚了,但我从上面的注释代码中编写了一个简单的代码

select movieid, title, plot, rating, director, group_concat(genre)
from movies
natural join moviegenres
natural join genres;

别忘了电影可以有惊人的效果,甚至包括它的小提琴。我同意这个答案,除了创作任意的UID
genreID
movieID
。在关系数据库中,拥有一个额外的任意键代价高昂,因为现在您必须维护两个唯一键(
genre
genreID
),而不是维护和保证一个自然键(例如
genre
)的唯一性。除非你有很好的理由这样做,否则这是不必要的,而且代价高昂。避免这种情况也意味着您不再需要额外的表
类型
,从而进一步降低了关系数据库的维护成本(即:提高速度)。您能详细说明一下吗?可以添加一个答案
> sample data:
> 1 1   2
> 2 1   4
select m.*,group_concat(g.genre)
from movies m inner join moviegenres mg
on m.movieid=mg.movieid
inner join genres g
on g.genreid=mg.genreid
group by m.movieid
;
> sample data:
> Titanic  Bollywood   10  James Cameron
> sample data:
> Titanic   Thriller
> Titanic   Romance
select movieid, title, plot, rating, director, group_concat(genre)
from movies
natural join moviegenres
natural join genres;