如何做到像segmentfault那样,筛选出java标签下得票数最多的问题?

发布于 2022-09-06 02:07:57 字数 1032 浏览 34 评论 0

在segmentfault中,可以选择自己感兴趣的标签,如java。
clipboard.png

然后可以按照得票数对含有java标签的问题进行排序。
clipboard.png


看似简单的功能,细思还有点小复杂的。

猜测数据库中有三张表,分别为:

  1. 问题表。
  2. 问题标签表,一个问题可有多个标签,一对多。
  3. 问题得票数表,一对一。

在点击java标签时,在问题标签表中分页找出对应标签的问题即可。

然而,加上按照得票数排序之后,一般的操作是:

  1. 在问题标签表中筛选出java标签下的所有问题,如 select QuestionId from QuestionTagRelt where tag = “java”。
  2. 通过查询问题得票数表,对获得的QuestionId列表进行排序分页,如select QuestionId from QuestionVoteRelt where QuestionId in (步骤1得到的QuestionId列表) order by VoteCount desc limit 0 20。
  3. 根据获得的QuestionId列表从问题表中查找问题title等数据。

以上步骤可以完成分标签按投票数排序的需求,然而第一步筛选出了所有带有java标签的问题

这样的操作是否可以优化?
当数据量增多时,该如何进一步优化?
如果可以用join操作,如果不允许用join操作,该如何优化?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

送君千里 2022-09-13 02:07:57

QuestionVoteRelt 表反范式设计,冗余tag字段即可优化。
例如:QuestionVoteRelt 表中冗余tags标签字段,存储形式为[all,java,php,c,c++,...].

那么可以第二步骤可以用一下方式查询:

select QuestionId from QuestionVoteRelt where find_in_set(tags,"java")  order by VoteCount desc limit 0 20;
情感失落者 2022-09-13 02:07:57

这个count肯定使用空间换时间表的,最简单的方法就是用缓存来记录,增量更新缓存

鸵鸟症 2022-09-13 02:07:57

猜的,这个东西应该也许大概可能是使用缓存来实现的~_~ ~_~

南街九尾狐 2022-09-13 02:07:57

问题表里面是可以添加一字段存储问题的票数的,这样查询的逻辑就是标签筛选出问题id,问题id再排序分页输出,这里的输出可以做memcache缓存,只需要在用户每次添加或更新到相应标签问题时再更新下缓存就好,搜索可另外设置缓存

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文