Cassandra电影数据建模:如何按类型检索多类型归属的电影?
Cassandra多分类电影数据建模方案
核心结论
是的,你需要为每部电影所属的每个类型单独创建一条记录,这是符合Cassandra面向查询设计原则的必要做法。
原因说明
Cassandra是典型的查询优先数据库,你的movies_by_genre表设计目标是快速通过genre查询对应电影列表——将genre作为分区键后,同类型的所有电影会被存储在同一个分区中,查询时能直接定位到目标分区,获得最优性能。
由于单部电影属于多个类型,若只存一条包含多值genres的记录,查询时无法高效过滤出特定类型的电影(Cassandra不擅长处理多值字段的筛选),反而会导致查询性能下降,违背表的设计初衷。这种数据冗余是Cassandra用空间换时间的典型设计思路,完全合理。
表结构定义
建议在表中加入movie_id作为聚类键,避免同类型下出现重复记录(比如同名电影),最终表结构如下:
CREATE TABLE movies_by_genre ( genre TEXT, movie_id INT, title TEXT, year INT, PRIMARY KEY (genre, movie_id) );
genre:分区键,用于按类型分区存储数据movie_id:聚类键,保证同类型下每条记录唯一,同时可对同类型电影进行有序存储
数据插入示例
以你的电影数据为例,每部电影需按其所属类型拆分插入:
-- 《壮志凌云:独行侠》(3个类型) INSERT INTO movies_by_genre (genre, movie_id, title, year) VALUES ('action', 1, '《壮志凌云:独行侠》', 2022); INSERT INTO movies_by_genre (genre, movie_id, title, year) VALUES ('drama', 1, '《壮志凌云:独行侠》', 2022); INSERT INTO movies_by_genre (genre, movie_id, title, year) VALUES ('adventure', 1, '《壮志凌云:独行侠》', 2022); -- 《黑豹:永远的瓦坎达》(3个类型) INSERT INTO movies_by_genre (genre, movie_id, title, year) VALUES ('action', 2, '《黑豹:永远的瓦坎达》', 2019); INSERT INTO movies_by_genre (genre, movie_id, title, year) VALUES ('sci-fi', 2, '《黑豹:永远的瓦坎达》', 2019); INSERT INTO movies_by_genre (genre, movie_id, title, year) VALUES ('superhero', 2, '《黑豹:永远的瓦坎达》', 2019); -- 《雷神4:爱与雷霆》(4个类型) INSERT INTO movies_by_genre (genre, movie_id, title, year) VALUES ('comedy', 3, '《雷神4:爱与雷霆》', 2015); INSERT INTO movies_by_genre (genre, movie_id, title, year) VALUES ('action', 3, '《雷神4:爱与雷霆》', 2015); INSERT INTO movies_by_genre (genre, movie_id, title, year) VALUES ('superhero', 3, '《雷神4:爱与雷霆》', 2015); INSERT INTO movies_by_genre (genre, movie_id, title, year) VALUES ('sci-fi', 3, '《雷神4:爱与雷霆》', 2015);
查询效果
当执行查询语句:
SELECT title, year FROM movies_by_genre WHERE genre = 'action';
将返回你期望的结果:
| genre | title | year |
|---|---|---|
| action | 《壮志凌云:独行侠》 | 2022 |
| action | 《黑豹:永远的瓦坎达》 | 2019 |
| action | 《雷神4:爱与雷霆》 | 2015 |
内容的提问来源于stack exchange,提问作者vrnvlk
相关产品推荐
相关产品推荐

