Cassandra不支持关联查询时如何获取videos与comments两张表的关联数据
Cassandra无关联查询下获取带评论视频的可行方案
你当前提供的是关系型数据库的建表逻辑,不符合Cassandra查询驱动建模的核心设计原则,针对你要获取20条带对应评论的视频的需求,可根据场景选择以下3种可行方案:
方案1:重构表结构(最高效,优先推荐)
利用Cassandra的静态列特性,直接按查询需求设计单表,一次查询即可拿到所需数据:
CREATE TABLE videos_with_comments ( video_id bigint, -- 视频基础属性设为静态列,同一视频下所有评论行共享,无需重复存储 userid bigint STATIC, name text STATIC, description text STATIC, location text STATIC, location_type int STATIC, added_date timestamp STATIC, -- 评论属性 comment_id bigint, comment_user_id bigint, comment_text text, comment_time timestamp, PRIMARY KEY ((video_id), comment_time) ) WITH CLUSTERING ORDER BY (comment_time DESC);
使用逻辑:
- 新增视频时写入该表的静态列字段,新增评论时对应写入该视频分区下的评论行
- 单独维护一张
latest_videos表用于快速拉取最新20条视频的ID,主键可设计为((time_bucket), added_date, video_id),time_bucket按天/小时拆分避免分区热点 - 用拿到的20个视频ID批量查询
videos_with_comments表,直接返回每个视频的基础信息+所有对应评论,无需任何关联操作
方案2:应用层手动关联(适合存量数据不愿改表的场景)
如果不想调整现有表结构,可在应用侧完成数据拼接:
- 第一步:查询视频表获取20条目标视频数据,提取所有视频ID的集合
- 第二步:以视频ID集合为条件,批量查询评论表(需提前给
comments表的videoId字段建二级索引,或者新增comments_by_video辅助表,主键设计为((videoId), comment_time)提升查询效率),获取所有匹配的评论 - 第三步:在应用代码中按
videoId对评论做分组,和对应视频数据拼接即可
该方案需要两次查询,适合数据量较小的场景,性能略低于方案1。
方案3:固定字段冗余(适合仅展示少量评论的场景)
如果你的业务只需要展示每个视频的前N条最新评论(比如前3条),可以直接把评论字段冗余到视频表中:
CREATE TABLE videos_with_top_comments ( video_id bigint PRIMARY KEY, userid bigint, name text, description text, location text, location_type int, added_date timestamp, -- 冗余最新3条评论字段,可按需调整数量 recent_comment_1_userid bigint, recent_comment_1_text text, recent_comment_1_time timestamp, recent_comment_2_userid bigint, recent_comment_2_text text, recent_comment_2_time timestamp, recent_comment_3_userid bigint, recent_comment_3_text text, recent_comment_3_time timestamp )
使用逻辑:
每次新增评论时异步更新视频表的最新评论字段,查询时仅需查一次视频表即可拿到所有需要的数据,性能最高,但灵活性差,仅适合评论展示条数固定的场景。
内容的提问来源于stack exchange,提问作者localdata01
相关产品推荐
相关产品推荐

