在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操作,该如何优化?
QuestionVoteRelt 表反范式设计,冗余tag字段即可优化。
例如:QuestionVoteRelt 表中冗余tags标签字段,存储形式为[all,java,php,c,c++,...].
那么可以第二步骤可以用一下方式查询: