【问题标题】:Creating a SQL movie database. Do I really a "genre_linker" table for the relationship between "movies" and "genres"创建 SQL 电影数据库。我真的是“电影”和“流派”之间关系的“流派链接器”表吗
【发布时间】:2021-12-03 08:59:16
【问题描述】:

我正在为我拥有的所有 dvd 和蓝光建立一个 sql 电影数据库。我目前有以下表格...

电影(id(主键)、标题、年份、格式、运行时间) 人(id(主键)、性别、出生日期、出生日期、姓名) 学分(person_id(外键)、movie_id(外键)、工作、角色) 流派(id(主键),流派) movie_genres(movie_id(外键),genre_id(外键))

我的问题是我是否需要/是否有逻辑上的好处,即内存管理等。为流派设置 2 个单独的表,或者最好只有 1 个表示......

流派(movie_id(外键),流派)

【问题讨论】:

    标签: mysql


    【解决方案1】:

    movies_genres 表是用于创建多对多关系的映射表。这样一来,您就可以将许多电影与多种类型相关联,反之亦然。

    【讨论】:

    • 这比我描述的一对多有优势吗?对我来说,有 2 张桌子就足够了。
    • 如果我理解正确的话,多对多的例子会是这样的......流派10 | “行动” 11 | “科幻”12 | “惊悚片” Movie_genres 267 | 10 267 | 11 267 | 12 与这样的一对多... 流派 267 | “行动” 267 | 《科幻》267 | “惊悚”
    • 使用这样的映射表的示例使您可以将电影 1 链接到流派 A、B 和 C;电影 2 到流派 B、C、F。翻转,流派 B 与电影 1 和 2 相关联。换句话说,电影可以根据需要与尽可能多的流派相关联,并且流派可以与尽可能多的电影相关联需要。这不可能发生在一张桌子上。使用一张表,您将被限制为将一种流派与一部电影或一部电影与一种流派相关联。
    【解决方案2】:

    您对使用genres(movie_id(foreign key), genres) 的最终建议可能是最糟糕的选择,因为您有一个额外的连接来访问可以轻松存储在电影表中的列。为了开销,这确实是开销。

    如果您决定放弃多对多,您可以将流派直接存储在电影表中,但以逗号分隔的流派字符串值列表在存储和查询方面效率非常低。您可以将流派列表存储在电影表的 SET 列中。这将使用一小部分存储空间,并且可以非常有效地进行查询。

    多对多和 SET 选项都广泛用于此特定用例。我会选择多对多,因为它是标准化的形式并且更易于管理。

    【讨论】:

    • 您能否解释一下这需要额外加入吗?我在想它会少一个,因为它只加入 2 个表而不是 3 个?或者您是说此时它与电影表中的逗号分隔列表没有什么不同?
    • 这将是额外的,因为它直接存储在电影表中没有任何好处(因为它是一对一的关系)。无论是在您提议的单独表还是电影表中,逗号分隔的值列表都是坏消息,除非它永远不会用作搜索条件。
    • 这是一个链接到以前的帖子 - stackoverflow.com/questions/17520720/…
    • 好吧,这是有道理的。谢谢
    猜你喜欢
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多