Skip to content

书籍评分模块

简介

用户可以为书籍评分,系统据此统计书籍的平均分和评分人数。

实现细节

  1. 评论表用于保存多条评论,不宜直接承载“一位用户对一本书至多一条评分”的约束。

也可以在用户书籍关联表中增加评分字段,但这样会将评分与用户的书籍关联记录绑定;删除关联记录时,评分也会随之删除。

若需要独立保留和扩展评分数据,可使用单独的评分表,并以唯一约束确保同一用户对同一本书只有一条评分。

  1. 可在 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 设计

  1. 增加或更新评分:可以设计为单个 upsert API,也可以分别提供新增和更新接口;服务端应保证用户与书籍的组合唯一。
updateBookStar = (user_id, book_id, star) => {
    // 按 user_id 和 book_id 新增或更新评分
}


addBookStar = (user_id, book_id, star) => {
    // insert into book_star ...
}
  1. 统计评分(统计某本书的评分):

每次用户评分后,可以重新计算该书评分,并把平均分写入书籍表;也可以在读取时实时计算,避免维护冗余汇总字段。

star_avg = SELECT AVG(star) FROM bookstar WHERE book_id = ?;


star_number = SELECT COUNT(star) FROM bookstar WHERE book_id = ?;

-- 将汇总结果写回书籍表,或在读取时实时计算。

获取书籍列表时可按评分或热度排序。评分相同时应明确排序规则,且无评分的书籍不应被误显示为 0 分。

  1. 获取某本书的评分记录并展示:
getBookStars = (book_id) => {
    // SELECT * FROM bookstar WHERE book_id = ?
}
  1. 获取某个用户对某本书的评分:
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. 多个用户给同一本书评分后,验证平均分和评分人数。

  2. 验证评分的新增、修改和删除,以及无评分记录时的展示。

版本历史

1.7 版本新增功能。

未来

  1. 评分快照、书评和普通评论是否需要分开,需根据后续产品需求确定。

  2. 后续可基于用户评分分析阅读偏好,并在具备足够数据和隐私保护措施后探索推荐功能。