系统设计面试题之 怎么设计一个打分系统

本文描述了如何设计一个能应对大量用户评分的系统,包括使用NoSQL数据库存储评分,通过web server、write api、search api三层架构保证性能,并利用memcache缓存提高查询效率。此外,还提出了额外的优化措施,如平均分表和冗余数据来加速查询。
摘要由CSDN通过智能技术生成

上周我参加了一个面试,其中有一道系统设计题:某公司的内网有个质询系统。该公司的每个职员都可以对本公司的任何部门的任何事件提问题,并且所有的其他职员都能看到这些问题,还可以对问题打分,打分的范围是一颗星到五颗星。现在让我们来设计打分系统,不用考虑提问功能。

以下是面试官给出的基本的测试用例:
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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值