我正在使用TMDB api分别获取热门,即将上映,评分最高和正在播放的电影列表。我想将它们本地存储在每天更新的数据库中。每个返回的电影都有唯一的ID。因此,我希望将流行电影存储在名为“即将发布”的表格中的热门电影即将上映的电影中,反之亦然。如果我遵循这种方法,我将创建四个具有相同属性的表,但我可以保持movieId不同,以避免像数据库更新时的冗余。
另一方面,如果我创建一个单独的表,那么我就不能将movieId视为独特的,因为电影既可以流行也可以即将发布,这将导致我更新数据库时出现冗余。是否有任何方式只插入电影在数据库中,如果数据库中不存在具有相同ID和相同标签(流行,评级最高,即将播放,正在播放)的电影?
如何设计我的数据库,以便我可以轻松地从api收到不同数据库的电影列表?
答案 0 :(得分:3)
使用一个表: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
要获取不同的电影列表(本例中即将推出),请按type
:
SELECT * FROM `movies` WHERE `type` = 'upcoming';
答案 1 :(得分:0)
你完成了。
现在您可以存储
等值(Movie1,1)
(Movie2,2)
电影表格中的。重复的条目会引发错误。当然,基于API,您希望事先处理它。
注意:我个人不希望不在MovieType表中自动增加MovieTypeId,因为电影的类别可能会随时更改,包括从10个类别中删除只有1个类别,在此期间您将遇到问题。