【问题标题】:How to design database for movies? [closed]如何为电影设计数据库? [关闭]
【发布时间】:2015-07-15 20:43:23
【问题描述】:

我正在使用 TMDB api 分别获取热门、即将上映、评分最高和正在播放的电影的列表。我想将它们本地存储在每天更新的数据库中。每个返回的电影都有一个唯一的 ID。因此,我想将流行电影存储在名为流行的表中,即将上映的电影存储在名为即将上映的表中,反之亦然。如果我遵循这种方法,我将创建四个具有相同属性的表,但我可以保持 movieId 不同以避免像更新数据库时那样的冗余。

另一方面,如果我创建一个表,那么我不能将 movieId 区分为不同的,因为电影可能既受欢迎又即将上映,这会在我更新数据库时导致冗余。有什么方法可以只插入电影如果数据库中不存在具有相同 ID 和相同标签(流行、评分最高、即将上映、正在播放)的电影,则在数据库中?

如何设计我的数据库,以便我可以轻松地从数据库中获取从 api 接收的不同电影列表?

【问题讨论】:

    标签: mysql database sqlite


    【解决方案1】:

    使用一张表:movies。在两个字段上创建唯一索引。这将只允许每种类型的电影出现一次此唯一 ID:external_idtype

    CREATE TABLE `movies` (
      `id` INT NOT NULL AUTO_INCREMENT,
      `external_id` INT NOT NULL,
      `type` ENUM('popular', 'upcoming', 'top-rated', 'now-playing') NOT NULL,
      `name` VARCHAR(45) NULL,
      `genre` VARCHAR(45) NULL,
      PRIMARY KEY (`id`),
      UNIQUE INDEX `external_id_type_idx` (`external_id` ASC, `type` ASC));
    

    使用此表结构,您可以在尝试添加电影时使用INSERT IGNORE 语句:

    INSERT IGNORE INTO `movies` (`external_id`, `type`, `name`, `genre`) VALUES (?, ?, ?, ?);
    

    INSERT IGNORE 将尝试插入记录,但如果约束导致它失败,它将被忽略(不会插入、更新等)。见https://stackoverflow.com/a/548570/416412

    要获得不同的电影列表(本例中即将上映),请按type 过滤:

    SELECT * FROM `movies` WHERE `type` = 'upcoming';
    

    【讨论】:

    • 非常好的答案。但是我怎么能在 sqlite 中做同样的事情,因为 enum 在 sqlite 中不可用?
    • 枚举只是一个例子。您不需要使用枚举。如果您查看@Xenon 的答案,您会发现他建议不要使用enum,而是使用单独的表格movie_types
    【解决方案2】:
    1. 为了获得最佳实践,您至少应该使用两个表。 “电影”和“电影类型”。它们可以包含任意数量的列,但我将在这里重点介绍所需的列。
    2. “MovieType”存储电影类型的详细信息。列将是 MovieTypeId(主键)和 MovieTypeDescription(非空) - varchar - 大小取决于。在此表中存储 (1, 'Popular')、(2, 'Upcoming') 等值。
    3. “电影”存储电影的详细信息。列将是 MovieId(非空)- int - 自动增量,MovieName(非空)- varchar - 大小取决于,MovieTypeId(非空)- tinyInt。
    4. 您需要为 Movies 表再添加 2 个 CONSTRAINTS。首先,MovieTypeId 将是引用 MovieType 表中 MovieTypeId 列的外键。第二个将是组合(MovieId 和 MovieTypeId)的复合唯一键。

    你已经完成了。

    现在您可以存储诸如

    之类的值

    (电影 1, 1)

    (电影 2、2)

    在电影表中。重复的条目会引发错误。当然,基于API,您希望事先处理它。

    注意:我个人不希望在 MovieType 表中自动增加 MovieTypeId,因为电影的类别可能随时更改,包括从 10 个类别取消到仅 1 个类别,在此期间您会​​遇到问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      • 2015-12-24
      • 2010-09-22
      相关资源
      最近更新 更多