【问题标题】:Movie Database, storing multiple genres电影数据库,存储多种流派
【发布时间】:2013-07-05 10:28:00
【问题描述】:

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

    Title
    Plot
    Genre
    Rating
    Director

唯一困扰我的是大多数电影不只有一种类型,我正在努力弄清楚如何将其存储在 MySQL 数据库中。起初我在想我只会有一个表并将所有类型存储在一列中,用逗号分隔它们,当我想检索它们时使用 PHP 将它们分开,但我不确定这是最好的方法因为我认为我在排序和搜索特定类型时会遇到麻烦,例如列包含“恐怖、惊悚、动作”时的恐怖。

【问题讨论】:

标签: mysql sql database-design join many-to-many


【解决方案1】:

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

表名:电影

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

> sample data:
> 
> 1 titanic Bollywood   10  James Cameron

表名:流派

流派,流派

> sample data:
>  1    Horror
>  2    Thriller
>  3    Action
>  4    Love

表名:电影类型

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
;

fiddle

【讨论】:

  • 我同意这个答案,除了创建任意 UID genreIDmovieID。在关系数据库中,拥有一个额外的任意键是昂贵的,因为不是维护和保证 1 个自然键的唯一性(例如 genre),现在您必须维护 2 个唯一键(genregenreID)。除非您有充分的理由这样做,否则这是不必要且昂贵的。避免这种情况也意味着您不再需要额外的表genres,从而进一步降低关系数据库的维护成本(阅读:提高速度)。
【解决方案2】:

您要在此处建模的内容称为“多对多”关系,在建模“现实世界”分类时非常常见。

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

不要试图通过在每部电影的一个字段中存储多种类型来跳过额外的交集表(例如,逗号分隔的列表)。这是一个非常常见的“反模式”,给你带来麻烦,也许不是今天,也许不是明天,但最终。我建议任何从事数据库设计工作的人阅读 Bill Karwin 的“SQL Antipatterns”(http://pragprog.com/book/bksqla/sql-antipatterns)。它以相对初学者应该可以访问的方式编写,但包含很多我们这些应该了解的人需要不时提醒的内容(多对多关系,字段列表解决方案/问题,以及你应该做的,是本书首先介绍的内容之一。

【讨论】:

    【解决方案3】:

    这个答案是我对上面@Praveen Prasannan 的answer 的评论的详细说明。

    我将消除任意代理键 movieIDgenreID 作为消除关系数据库不必要开销的一种方式。由于titlegenre 是自然的唯一键,我们应该使用它们而不是要求数据库维护额外的、无意义的键和表的唯一性(参考答案中的genres 表)。这应该会提高大型关系数据库的速度和性能,是一种很好的做法。

    表名:电影

    主键:标题

    标题、情节、评级、导演

    > sample data:
    > Titanic  Bollywood   10  James Cameron
    

    表名:电影类型

    主键:标题、流派

    标题,类型

    > sample data:
    > Titanic   Thriller
    > Titanic   Romance
    

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

    【讨论】:

      【解决方案4】:

      有点晚了,不过我根据上面的置顶评论代码做了一个简单的代码

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多