上周我参加了一个面试,其中有一道系统设计题:某公司的内网有个质询系统。该公司的每个职员都可以对本公司的任何部门的任何事件提问题,并且所有的其他职员都能看到这些问题,还可以对问题打分,打分的范围是一颗星到五颗星。现在让我们来设计打分系统,不用考虑提问功能。
以下是面试官给出的基本的测试用例:
1.用户可以对任意一个问题评分,打分范围是一颗星到五颗星;
2.公司的分析部门需要一个查询api,这个api可以:
a.查询某条问题的平均分;
b.查询某个问题的top 10的高分以及用户名;
c.查看某个用户评过分的所有问题;
注意:
1.这个公司的职员有几十万之多,因此评分系统需要考虑性能问题。并且每天早上上班的时候是评分系统负载最大的时间点。
2.不需要考虑安全问题。
3.所有数据都需要长期保存,不用考虑删除问题。
以下是我的设计:
1.数据库的设计:
数据库有4个表,如下图。
comments表,用来记录问题,每条问题都有一个唯一的id;user表用来保存用户的信息,每个用户都有唯一的id。这两个表都是RMDB表,因为他们的数据相对来说比较固定,不会被频繁修改。
rating_comments表,用来记录用户对每个问题的评分。如果这个表使用RMDB的话,它与comments表和user表做join的成本会很高;而且这个表必然需要对用户id和问题id做索引以加速查询,又因为这个表的数据会被频繁的更新,所以维护索引的开销会很大。因此,这个表会使用基于key-value的NoSQ