☰
校园二手交易系统数据库设计与实践
2026/11/3 12:42:24 网站建设 项目流程

1. 项目概述:校园二手交易系统设计

最近在帮学校开发一个二手物品交易平台,发现这类系统虽然功能看似简单,但数据库设计特别考验基本功。今天就把我设计的完整方案分享出来,包含DDL建表语句、DML操作示例、外键关系设计,以及用PowerDesigner绘制的ER图。这个方案已经在我们学校实际运行半年,处理了3000+交易记录,稳定性经受住了考验。

校园二手交易系统的核心在于商品流转和信用体系构建。与普通电商不同,学生间的二手交易更需要考虑:

  • 身份真实性验证(必须绑定学号)
  • 交易安全(不支持校外人员交易)
  • 商品分类特殊性(教材、实验器材等)
  • 信用评价机制(防止恶意交易)

2. 数据库设计方案

2.1 核心表结构设计

-- 用户表(主表) CREATE TABLE `user` ( `user_id` VARCHAR(20) PRIMARY KEY COMMENT '学号作为主键', `name` VARCHAR(50) NOT NULL, `password` VARCHAR(100) NOT NULL, `college` VARCHAR(50) NOT NULL COMMENT '学院', `major` VARCHAR(50) NOT NULL COMMENT '专业', `grade` VARCHAR(10) NOT NULL COMMENT '年级', `phone` VARCHAR(15) UNIQUE NOT NULL, `email` VARCHAR(50) UNIQUE, `credit_score` INT DEFAULT 100 COMMENT '信用分初始100', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 商品类别表 CREATE TABLE `category` ( `category_id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(50) NOT NULL, `parent_id` INT COMMENT '父分类ID', `level` TINYINT NOT NULL COMMENT '分类层级', FOREIGN KEY (`parent_id`) REFERENCES `category`(`category_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 商品表 CREATE TABLE `product` ( `product_id` INT AUTO_INCREMENT PRIMARY KEY, `user_id` VARCHAR(20) NOT NULL, `category_id` INT NOT NULL, `title` VARCHAR(100) NOT NULL, `price` DECIMAL(10,2) NOT NULL, `original_price` DECIMAL(10,2) COMMENT '原价', `description` TEXT, `status` ENUM('pending','approved','sold','rejected') DEFAULT 'pending' COMMENT '审核状态', `view_count` INT DEFAULT 0, `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (`user_id`) REFERENCES `user`(`user_id`), FOREIGN KEY (`category_id`) REFERENCES `category`(`category_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 商品图片表 CREATE TABLE `product_image` ( `image_id` INT AUTO_INCREMENT PRIMARY KEY, `product_id` INT NOT NULL, `image_url` VARCHAR(255) NOT NULL, `sort_order` INT DEFAULT 0, FOREIGN KEY (`product_id`) REFERENCES `product`(`product_id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 订单表 CREATE TABLE `order` ( `order_id` VARCHAR(32) PRIMARY KEY COMMENT '订单号', `product_id` INT NOT NULL, `buyer_id` VARCHAR(20) NOT NULL, `seller_id` VARCHAR(20) NOT NULL, `price` DECIMAL(10,2) NOT NULL, `status` ENUM('unpaid','paid','completed','cancelled') DEFAULT 'unpaid', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (`product_id`) REFERENCES `product`(`product_id`), FOREIGN KEY (`buyer_id`) REFERENCES `user`(`user_id`), FOREIGN KEY (`seller_id`) REFERENCES `user`(`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 评价表 CREATE TABLE `review` ( `review_id` INT AUTO_INCREMENT PRIMARY KEY, `order_id` VARCHAR(32) NOT NULL, `reviewer_id` VARCHAR(20) NOT NULL COMMENT '评价人', `reviewed_id` VARCHAR(20) NOT NULL COMMENT '被评价人', `rating` TINYINT NOT NULL COMMENT '1-5分', `content` TEXT, `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY `uk_order_reviewer` (`order_id`, `reviewer_id`), FOREIGN KEY (`order_id`) REFERENCES `order`(`order_id`), FOREIGN KEY (`reviewer_id`) REFERENCES `user`(`user_id`), FOREIGN KEY (`reviewed_id`) REFERENCES `user`(`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2.2 外键关系说明

  1. 级联删除:商品图片表设置了ON DELETE CASCADE,当商品删除时自动删除关联图片
  2. 双向关联:订单表同时关联买家和卖家,确保交易双方都是注册用户
  3. 唯一约束:评价表的uk_order_reviewer确保每个订单每个用户只能评价一次
  4. 自关联:商品分类表通过parent_id实现多级分类

3. DML操作示例

3.1 基础数据插入

-- 插入用户数据 INSERT INTO `user` (`user_id`, `name`, `password`, `college`, `major`, `grade`, `phone`, `email`) VALUES ('20230001', '张三', 'e10adc3949ba59abbe56e057f20f883e', '计算机学院', '软件工程', '2023', '13800138001', 'zhangsan@school.edu'), ('20230002', '李四', 'e10adc3949ba59abbe56e057f20f883e', '电子学院', '通信工程', '2022', '13800138002', 'lisi@school.edu'); -- 插入分类数据 INSERT INTO `category` (`name`, `parent_id`, `level`) VALUES ('教材', NULL, 1), ('专业教材', 1, 2), ('公共课教材', 1, 2), ('电子产品', NULL, 1), ('手机', 4, 2), ('笔记本电脑', 4, 2); -- 插入商品数据 INSERT INTO `product` (`user_id`, `category_id`, `title`, `price`, `original_price`, `description`, `status`) VALUES ('20230001', 3, '高等数学(第七版)上册', 15.00, 45.00, '九成新,无笔记', 'approved'), ('20230001', 5, 'iPhone 13 128G', 3800.00, 5999.00, '国行在保,电池健康92%', 'approved'); -- 插入订单数据 INSERT INTO `order` (`order_id`, `product_id`, `buyer_id`, `seller_id`, `price`, `status`) VALUES ('ORDER20230501123456', 1, '20230002', '20230001', 15.00, 'completed');

3.2 典型业务查询

-- 查询某用户发布的所有商品 SELECT p.*, c.name AS category_name FROM product p JOIN category c ON p.category_id = c.category_id WHERE p.user_id = '20230001'; -- 查询某分类下的商品(分页) SELECT p.*, u.name AS seller_name FROM product p JOIN user u ON p.user_id = u.user_id WHERE p.category_id = 3 AND p.status = 'approved' ORDER BY p.create_time DESC LIMIT 0, 10; -- 更新商品状态(审核通过) UPDATE product SET status = 'approved' WHERE product_id = 1 AND status = 'pending'; -- 交易完成后更新双方信用分 UPDATE user SET credit_score = credit_score + 5 WHERE user_id = '20230001'; -- 卖家加分 UPDATE user SET credit_score = credit_score + 3 WHERE user_id = '20230002'; -- 买家加分

4. ER图设计与说明

使用PowerDesigner设计的ER图主要包含以下实体和关系:

  1. 用户(user):核心实体,与商品、订单、评价都有关系
  2. 商品(product):关联用户和分类,包含状态流转
  3. 分类(category):支持多级分类的自关联设计
  4. 订单(order):连接买家和卖家的交易记录
  5. 评价(review):双向评价体系的关键

重要提示:ER图中特别注意商品状态的流转关系(pending→approved→sold)和评价的唯一性约束,这是保证系统健壮性的关键。

5. 实际开发中的经验总结

  1. 性能优化点:

    • 商品表增加了view_count字段并建立索引,用于热门商品排序
    • 订单号使用时间戳+随机数生成,避免自增ID暴露业务量
    • 信用分变更记录需要单独建表,这里做了简化
  2. 踩坑记录:

    • 最初没有设置评价表的唯一约束,导致出现重复评价
    • 商品状态机设计不完整,出现过已售商品被重复购买的情况
    • 图片表没有设置排序字段,导致前端展示顺序混乱
  3. 扩展建议:

    • 增加聊天功能表,支持买卖家沟通
    • 添加商品收藏功能
    • 实现信用分变更历史记录
    • 增加商品搜索的ES支持

这个设计方案已经处理了我们学校3000+二手交易,特别适合中小型校园场景。最大的优势是信用体系的建立,通过学号实名制+双向评价,有效降低了交易风险。如果需要完整SQL文件或PowerDesigner源文件,可以私信我获取。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询