我正在使用 TMDB api 分别获取热门、即将上映、评分最高和正在播放的电影列表。我想将它们本地存储在每天更新的数据库中。每部返回的电影都有一个唯一的 ID。因此,我想将流行电影存储在名为 popular 的表中,即将上映的电影存储在名为 commoning 的表中,反之亦然。如果我采用这种方法,我将创建四个具有相同属性的表,但我可以保持 movieId 不同以避免像更新数据库时那样出现冗余。
另一方面,如果我创建一个表,那么我不能将 movieId 区分为不同的,因为电影可能既流行又即将上映,这将在我更新数据库时导致冗余。有没有办法只插入电影如果数据库中没有具有相同 ID 和相同标签(热门、评分最高、即将上映、正在播放)的电影?
我如何设计我的数据库,以便我可以轻松地从数据库中获取与从 api 收到的不同的电影列表?
使用一个表:movies
。在两个字段上创建唯一索引。这将只允许每种类型的电影出现一次此唯一 ID:external_id
和 type
:
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
要获得不同的电影列表(本例中即将上映),按类型
过滤:
SELECT * FROM `movies` WHERE `type` = 'upcoming';