如何在mysql中设计商品评价系统

来源:网站主作者:灯下变量头衔:程序员
导读:本期聚焦于小伙伴创作的《如何在mysql中设计商品评价系统》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在mysql中设计商品评价系统》有用,将其分享出去将是对创作者最好的鼓励。

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

如何在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字段,支持运营设置优质评价置顶,查询时优先展示置顶评价

mysql商品评价系统数据库设计表结构设计修改时间:2026-06-25 07:36:20

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。