如何为向用户1展示不含其评论的帖子的需求正确构建数据模型?
数据模型改造方案
核心思路是把「用户未评论」的反向过滤条件转换为可正向匹配的字段,全程不需要使用not-in操作符。
方案1:用户侧新增评论过的帖子索引(适合先查用户再拉帖子的场景)
直接在用户实体下加commented_posts字段,存该用户所有评论过的帖子ID集合,示例结构如下:
{ user: { user1: { // 原有用户字段保留 commented_posts: ["post1"] }, user2: { // 原有用户字段保留 commented_posts: [] } } }
查询逻辑:
- 先拉取当前登录用户(此处为user1)的
commented_posts列表,拿到他已经评论过的所有帖子ID - 拉取全量帖子ID列表,在应用层做差集得到未评论的帖子ID,再批量查询这些帖子的详情即可。
方案2:帖子侧新增评论用户标记(适合直接过滤帖子列表的场景)
在每个帖子实体下加has_comment_from字段,用键值对存储所有在该帖子下发过评论的用户ID,值固定为true方便查询,示例结构如下:
{ post: { post1: { title: 'hi', text: 'Good post', comment: { user1: { msg: "my comment" } }, // 新增字段:存储所有评论过该帖子的用户ID has_comment_from: { "user1": true } }, post2: { title: 'hi 2', text: 'Good post 2', has_comment_from: {} }, post3: { title: 'hi 3', text: 'Good post 3', has_comment_from: {} } } }
查询逻辑:直接在数据库层查询所有has_comment_from.user1不存在/不等于true的帖子即可,这个是普通的字段存在性/等值校验,不属于not-in操作符,符合需求。
选型建议
- 单用户查询场景多、用户量不大选方案1,数据库侧无复杂查询,性能更高
- 帖子列表页直接过滤的需求多选方案2,不需要应用层二次计算,开发更简单
内容的提问来源于stack exchange,提问作者Менеджер Типографии
相关产品推荐
相关产品推荐

