商品评价系统需要支持用户提交评价、查看商品评价列表、统计评价相关数据等核心功能,在mysql中设计该系统时,需要优先梳理清楚核心实体和实体之间的关联关系,再逐步完善表结构和相关优化逻辑。

核心业务需求梳理
在设计表结构前,先明确系统需要支撑的核心场景:
- 用户可以对已购买的商品提交评价,评价内容包含评分、文字描述、图片列表
- 每个商品可以展示对应的所有评价,支持按评分、时间排序
- 用户可以查看自己提交的所有评价,也可以修改、删除自己的评价
- 系统需要统计每个商品的平均评分、各评分档位的评价数量
- 评价支持点赞功能,用户可以对自己认可的优质评价点赞
核心表结构设计
1. 用户表 user
存储用户的基础信息,评价系统只需要关联用户ID即可,用户表可以和其他业务共用:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', `username` varchar(50) NOT NULL COMMENT '用户名', `avatar` varchar(255) DEFAULT NULL COMMENT '用户头像地址', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `idx_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
2. 商品表 product
存储商品的基础信息,评价系统同样只需要关联商品ID,商品表可和其他业务共用:
CREATE TABLE `product` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品ID', `product_name` varchar(100) NOT NULL COMMENT '商品名称', `price` decimal(10,2) NOT NULL COMMENT '商品价格', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
3. 商品评价表 product_review
这是评价系统的核心表,存储用户提交的评价基础信息:
CREATE TABLE `product_review` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '评价ID', `user_id` int(11) NOT NULL COMMENT '评价用户ID', `product_id` int(11) NOT NULL COMMENT '评价商品ID', `order_id` int(11) NOT NULL COMMENT '关联订单ID,确保用户是购买后评价', `score` tinyint(1) NOT NULL COMMENT '评分 1-5分', `content` text COMMENT '评价文字内容', `like_count` int(11) NOT NULL DEFAULT 0 COMMENT '点赞数量', `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态 1正常 0删除', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '评价时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_product_id` (`product_id`), KEY `idx_user_id` (`user_id`), KEY `idx_order_id` (`order_id`), KEY `idx_product_score` (`product_id`,`score`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品评价表';
4. 评价图片表 review_image
一个评价可以包含多张图片,因此需要单独建表存储评价图片信息:
CREATE TABLE `review_image` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '图片ID', `review_id` int(11) NOT NULL COMMENT '关联评价ID', `image_url` varchar(255) NOT NULL COMMENT '图片地址', `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序序号', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), KEY `idx_review_id` (`review_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='评价图片表';
5. 评价点赞表 review_like
记录用户对评价的点赞行为,避免重复点赞:
CREATE TABLE `review_like` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '点赞记录ID', `review_id` int(11) NOT NULL COMMENT '关联评价ID', `user_id` int(11) NOT NULL COMMENT '点赞用户ID', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '点赞时间', PRIMARY KEY (`id`), UNIQUE KEY `idx_review_user` (`review_id`,`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='评价点赞表';
常用查询语句示例
查询商品的所有评价列表
按评价时间倒序查询某个商品的前20条评价,同时关联用户信息:
SELECT r.id, r.score, r.content, r.like_count, r.create_time, u.username, u.avatar FROM product_review r LEFT JOIN user u ON r.user_id = u.id WHERE r.product_id = 1001 AND r.status = 1 ORDER BY r.create_time DESC LIMIT 20;
统计商品评价相关数据
统计某个商品的平均评分、各评分档位的评价数量:
SELECT COUNT(*) AS total_review, AVG(score) AS avg_score, SUM(CASE WHEN score = 5 THEN 1 ELSE 0 END) AS score_5_count, SUM(CASE WHEN score = 4 THEN 1 ELSE 0 END) AS score_4_count, SUM(CASE WHEN score = 3 THEN 1 ELSE 0 END) AS score_3_count, SUM(CASE WHEN score = 2 THEN 1 ELSE 0 END) AS score_2_count, SUM(CASE WHEN score = 1 THEN 1 ELSE 0 END) AS score_1_count FROM product_review WHERE product_id = 1001 AND status = 1;
查询用户自己的所有评价
查询某个用户提交的所有评价,同时关联商品信息:
SELECT r.id, r.score, r.content, r.create_time, p.product_name, p.price FROM product_review r LEFT JOIN product p ON r.product_id = p.id WHERE r.user_id = 123 AND r.status = 1 ORDER BY r.create_time DESC;
设计优化建议
- product_review表的product_id和user_id字段需要建立普通索引,提升查询效率,联合索引idx_product_score可以优化按商品评分筛选的场景
- 评价内容content字段使用text类型,避免长度限制,若评价内容普遍较短,也可以换成varchar(1000)类型减少存储开销
- 评价点赞数量like_count可以在用户点赞时直接更新评价表,避免每次查询都关联点赞表统计,提升查询性能
- 如果评价数据量过大,可以按照时间或者商品ID进行分表,比如按年分表或者按商品ID哈希分表,降低单表数据量
- 可以给product_review表增加is_top字段,支持运营设置优质评价置顶,查询时优先展示置顶评价