书籍评分模块¶
简介¶
用户可以为书籍评分,系统据此统计书籍的平均分和评分人数。
实现细节¶
- 评论表用于保存多条评论,不宜直接承载“一位用户对一本书至多一条评分”的约束。
也可以在用户书籍关联表中增加评分字段,但这样会将评分与用户的书籍关联记录绑定;删除关联记录时,评分也会随之删除。
若需要独立保留和扩展评分数据,可使用单独的评分表,并以唯一约束确保同一用户对同一本书只有一条评分。
- 可在
book表中增加star_avg(平均分)和star_number(评分人数)等汇总字段。评分人数不等同于阅读人数,除非系统明确以评分行为代表阅读行为。
数据库设计与实现¶
新增数据库表,bookstar,表示书籍评分表。
关键字段 star 为整数,取值范围为 1 至 5。还应对 book_id 和 user_id 建立外键或相应约束,并增加两者组合唯一约束。以下外键示例假设 book.id 和 user.id 均为 INT。
CREATE TABLE `bookstar` (
`id` int NOT NULL AUTO_INCREMENT,
`book_id` int NOT NULL,
`user_id` int NOT NULL,
`star` int NOT NULL CHECK (star >= 1 AND star <= 5),
PRIMARY KEY (`id`),
UNIQUE KEY `bookstar_user_book_unique` (`user_id`, `book_id`),
CONSTRAINT `bookstar_book_fk` FOREIGN KEY (`book_id`) REFERENCES `book` (`id`),
CONSTRAINT `bookstar_user_fk` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
历史方案备注:也可以在 user_book 关联表中增加 star 字段,以减少表数量;选择该方案时,应明确删除关联记录是否同时删除评分。不要同时保留与独立评分表相冲突的两种方案。
后端 API 设计¶
- 增加或更新评分:可以设计为单个 upsert API,也可以分别提供新增和更新接口;服务端应保证用户与书籍的组合唯一。
updateBookStar = (user_id, book_id, star) => {
// 按 user_id 和 book_id 新增或更新评分
}
addBookStar = (user_id, book_id, star) => {
// insert into book_star ...
}
- 统计评分(统计某本书的评分):
每次用户评分后,可以重新计算该书评分,并把平均分写入书籍表;也可以在读取时实时计算,避免维护冗余汇总字段。
star_avg = SELECT AVG(star) FROM bookstar WHERE book_id = ?;
star_number = SELECT COUNT(star) FROM bookstar WHERE book_id = ?;
-- 将汇总结果写回书籍表,或在读取时实时计算。
获取书籍列表时可按评分或热度排序。评分相同时应明确排序规则,且无评分的书籍不应被误显示为 0 分。
- 获取某本书的评分记录并展示:
getBookStars = (book_id) => {
// SELECT * FROM bookstar WHERE book_id = ?
}
- 获取某个用户对某本书的评分:
getBookUserStar = (book_id, user_id) => {
// SELECT * FROM bookstar WHERE book_id = ? AND user_id = ?
}
接口设计与实现¶
增加评分¶
updateStar(username, bookId, star) {
}
展示某本书籍综合评分¶
getBookStar(username, bookId) {
return star_list
// 多少星星多少个等
}
页面效果实现¶
参考豆瓣评分:
https://book.douban.com/subject/36895677/?icn=index-latestbook-subject
前端交互设计¶
1、书籍详情页面:展示当前书籍的平均评分,阅读人数(就是评分人数),具体的评分情况和具体人数(UI 参考豆瓣读书)
注意:如果没有评分记录,那么应该显示没有评分,而不是 0 分。
2、用户给书籍评分,或者用户更新评分:先获取当前用户对书籍的评分,展示到页面上。如果用户继续点击,那么就执行更新评分或者添加评分。
具体请求和响应结构应由 API 文档补充。
测试与验证¶
-
多个用户给同一本书评分后,验证平均分和评分人数。
-
验证评分的新增、修改和删除,以及无评分记录时的展示。
版本历史¶
1.7 版本新增功能。
未来¶
-
评分快照、书评和普通评论是否需要分开,需根据后续产品需求确定。
-
后续可基于用户评分分析阅读偏好,并在具备足够数据和隐私保护措施后探索推荐功能。