电影数据库,存储多个类型

6

我正在尝试建立一个存储电影信息的数据库。

    Title
    Plot
    Genre
    Rating
    Director

唯一让我困扰的是,大多数电影不仅有一个流派,我正在努力想出如何在MySQL数据库中存储这些信息。起初,我考虑只创建一个表格,并将所有流派存储在一个列中,用逗号分隔,当我需要检索时,使用PHP进行分离,但我不确定这是否是最佳方法,因为我认为我会遇到麻烦,例如当该列包含“恐怖、惊悚、动作”时,我要搜索和排序特定的流派,例如“恐怖”。


不要忘记电影也可以有http://www.filmsite.org/subgenres.html - Neil McGuigan
这个回答解决了你的问题吗?在数据库列中存储分隔列表真的很糟糕吗? - philipxy
4个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
12

我建议你应该遵循以下结构:

表名:电影

电影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
;

查看示例


1
除了创建任意的UID“genreID”和“movieID”,我同意这个答案。在关系型数据库中,拥有额外的任意键是昂贵的,因为现在你不仅要维护和保证一个自然键(例如“genre”)的唯一性,而且还要维护两个唯一键(“genre”和“genreID”)。除非你有非常好的理由这样做,否则这是不必要和昂贵的。避免这种情况也意味着你不再需要那个额外的表“genres”,进一步降低了关系型数据库的维护成本(即提高了速度)。 - Renel Chesak

10
你想建模的是一个称为“多对多”关系的模型,这在建模“现实世界”分类时非常常见。 有许多描述如何处理此类关系的方法,包括: - Praveen在这里给出了特定于您问题的答案。 - http://en.wikipedia.org/wiki/Junction_table - 在许多/多个关系中链接两个人口的额外表通常称为交叉表或联接表。 - http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php 有助于展示带有表格和键/约束设计的示例,以及方便的数据表示图表(如果不清楚),以及如何在应用程序中建模和使用关系。 - 任何好的数据库设计书籍/教程都会在某个地方涵盖这一点。 不要尝试通过在每个电影的一个字段中存储多个流派(例如逗号分隔列表)来跳过额外的交叉表。这是一种非常常见的“反模式”,导致问题,也许不是今天,也许不是明天,但最终肯定会有问题。我建议任何从事数据库设计的人都应该阅读Bill Karwin的《SQL Antipatterns》(http://pragprog.com/book/bksqla/sql-antipatterns)。它的写作方式应该对于相对初学者来说很容易理解,但其中包含了我们这些应该知道更好的人需要时常提醒自己的内容(多对多关系、字段列表解决方案/问题以及你应该做什么等等都是这本书所涵盖的最早的内容)。

5

这篇答案是我对 @Praveen Prasannan 的 回答 评论的解释。

为了减少关系数据库不必要的开销,我建议消除任意的代理键movieIDgenreID。由于titlegenre已经是自然唯一键,我们应该使用它们,而不是让数据库维护额外的无意义键和表(genres表)的唯一性。这可以提高大型关系型数据库的速度和性能,并且是良好的实践。

表名: movies

主键: title

title, plot, rating, director

> sample data:
> Titanic  Bollywood   10  James Cameron
表名:电影类型
主键:标题、类型
标题、类型
> sample data:
> Titanic   Thriller
> Titanic   Romance
这也使得查询对用户和机器来说更加容易,因为您不需要加入额外的表来通过任意UID解码类型。

0

虽然有点晚了,但我从上面的评论中的代码中制作了一个简单的代码

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,