如何设计电影数据库?

时间:2015-07-15 20:43:24

标签: mysql database sqlite

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

另一方面,如果我创建一个单独的表,那么我就不能将movieId视为独特的,因为电影既可以流行也可以即将发布,这将导致我更新数据库时出现冗余。是否有任何方式只插入电影在数据库中,如果数据库中不存在具有相同ID和相同标签(流行,评级最高,即将播放,正在播放)的电影?

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

2 个答案:

答案 0 :(得分:3)

使用一个表: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';

答案 1 :(得分:0)

  1. 至少在最佳做法中,您应该使用两个表格。 '电影'和'MovieType'。它们可以包含任意数量的列,但我将重点关注所需的列。
  2. 'MovieType'存储电影类型的详细信息。列将是MovieTypeId(主键)和MovieTypeDescription(非null) - varchar - size取决于。在此表中存储诸如(1,'热门'),(2,'即将')等值。
  3. '电影'存储电影的详细信息。列将是MovieId(非null) - int - 自动增量,MovieName(非null) - varchar - size依赖,MovieTypeId(非null) - tinyInt。
  4. 您需要为Movies表添加2个CONSTRAINTS。首先,MovieTypeId将是引用MovieType表中的MovieTypeId列的外键。 2nd将是一个组合的复合唯一键(MovieId和MovieTypeId)。
  5. 你完成了。

    现在您可以存储

    等值

    (Movie1,1)

    (Movie2,2)

    电影表格中的

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

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