如何做到像segmentfault那样,筛选出java标签下得票数最多的问题?
在segmentfault中,可以选择自己感兴趣的标签,如java。
然后可以按照得票数对含有java标签的问题进行排序。
看似简单的功能,细思还有点小复杂的。
猜测数据库中有三张表,分别为:
- 问题表。
- 问题标签表,一个问题可有多个标签,一对多。
- 问题得票数表,一对一。
在点击java标签时,在问题标签表中分页找出对应标签的问题即可。
然而,加上按照得票数排序之后,一般的操作是:
- 在问题标签表中筛选出java标签下的所有问题,如 select QuestionId from QuestionTagRelt where tag = “java”。
- 通过查询问题得票数表,对获得的QuestionId列表进行排序分页,如select QuestionId from QuestionVoteRelt where QuestionId in (步骤1得到的QuestionId列表) order by VoteCount desc limit 0 20。
- 根据获得的QuestionId列表从问题表中查找问题title等数据。
以上步骤可以完成分标签按投票数排序的需求,然而第一步筛选出了所有带有java标签的问题。
这样的操作是否可以优化?
当数据量增多时,该如何进一步优化?
如果可以用join操作,如果不允许用join操作,该如何优化?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
QuestionVoteRelt 表反范式设计,冗余tag字段即可优化。
例如:QuestionVoteRelt 表中冗余tags标签字段,存储形式为[all,java,php,c,c++,...].
那么可以第二步骤可以用一下方式查询:
这个count肯定使用空间换时间表的,最简单的方法就是用缓存来记录,增量更新缓存
猜的,这个东西应该也许大概可能是使用缓存来实现的~_~ ~_~
问题表里面是可以添加一字段存储问题的票数的,这样查询的逻辑就是标签筛选出问题id,问题id再排序分页输出,这里的输出可以做memcache缓存,只需要在用户每次添加或更新到相应标签问题时再更新下缓存就好,搜索可另外设置缓存