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的回答是针对你的问题的
- -在多个/多个关系中连接两个总体的额外表格通常称为交叉表或连接表
- 这很有帮助地展示了一个表和键/约束设计的示例,一个在不清楚的情况下方便的数据表示图,以及如何在应用程序中建模和使用关系
- 任何好的数据库设计书籍/教程都会在某个地方介绍这一点
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;