我正在尝试建立一个存储电影信息的数据库。
Title
Plot
Genre
Rating
Director
唯一让我困扰的是,大多数电影不仅有一个流派,我正在努力想出如何在MySQL数据库中存储这些信息。起初,我考虑只创建一个表格,并将所有流派存储在一个列中,用逗号分隔,当我需要检索时,使用PHP进行分离,但我不确定这是否是最佳方法,因为我认为我会遇到麻烦,例如当该列包含“恐怖、惊悚、动作”时,我要搜索和排序特定的流派,例如“恐怖”。
我正在尝试建立一个存储电影信息的数据库。
Title
Plot
Genre
Rating
Director
唯一让我困扰的是,大多数电影不仅有一个流派,我正在努力想出如何在MySQL数据库中存储这些信息。起初,我考虑只创建一个表格,并将所有流派存储在一个列中,用逗号分隔,当我需要检索时,使用PHP进行分离,但我不确定这是否是最佳方法,因为我认为我会遇到麻烦,例如当该列包含“恐怖、惊悚、动作”时,我要搜索和排序特定的流派,例如“恐怖”。
我建议你应该遵循以下结构:
表名:电影
电影ID、标题、剧情、评分、导演
> sample data:
>
> 1 titanic Bollywood 10 James Cameron
表名:genres
列名:genreid,genre
> sample data:
> 1 Horror
> 2 Thriller
> 3 Action
> 4 Love
表名:moviegenres
字段:moviegenresid、movieid、genreid
> 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
;
查看示例
为了减少关系数据库不必要的开销,我建议消除任意的代理键movieID
和genreID
。由于title
和genre
已经是自然唯一键,我们应该使用它们,而不是让数据库维护额外的无意义键和表(genres
表)的唯一性。这可以提高大型关系型数据库的速度和性能,并且是良好的实践。
表名: movies
主键: title
title, plot, rating, director
> sample data:
> Titanic Bollywood 10 James Cameron
表名:电影类型 |
---|
主键:标题、类型 |
标题、类型 |
> sample data:
> Titanic Thriller
> Titanic Romance
这也使得查询对用户和机器来说更加容易,因为您不需要加入额外的表来通过任意UID解码类型。
虽然有点晚了,但我从上面的评论中的代码中制作了一个简单的代码
select movieid, title, plot, rating, director, group_concat(genre)
from movies
natural join moviegenres
natural join genres;