平台核心业务表结构设计

三张表:categories(商品分类)、users(平台用户)、products(商品),实验报告里的表格就是字段设计表,包含:字段名、数据类型、是否非空、主键 / 索引、默认值、注释。

1、categories 商品分类表

表格

字段名 数据类型 属性约束 说明(为什么这么设计)
cat_id INT UNSIGNED PRIMARY KEY、AUTO_INCREMENT 分类编号,无符号整数,自增主键。用自增 INT 做主键,查询快,不需要人工写 ID;UNSIGNED 只存正数。
cat_name VARCHAR(50) NOT NULL、UNIQUE 分类名称,字符串最长 50 字符,不能为空,不能重复。分类名不能空,不能出现两个一模一样的分类。
parent_id INT UNSIGNED DEFAULT 0 父分类 ID,默认 0。实现二级分类0代表一级大分类;填 cat_id 值代表属于某个父分类。

作用:存放商品分类,例如:0 = 数码,parent_id=1 的是手机、耳机。

2、users 用户表

表格

字段名 数据类型 属性约束 设计原因
user_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT 用户唯一 ID,自增无符号整数,主键,每张用户记录唯一标识。
username VARCHAR(50) NOT NULL UNIQUE 用户名,不能为空,不能重复。登录账号,不允许两个人同名。
password VARCHAR(100) NOT NULL 用户密码。长度 100,存加密哈希密码(不是明文),bcrypt 加密会占 60 位,设置 100 预留空间,不能为空。
phone VARCHAR(11) NOT NULL UNIQUE 手机号,11 位字符串。用 VARCHAR 而不是数字:手机号开头可以 0,不要做算术运算;UNIQUE 保证手机号不能重复注册。
credit_score TINYINT DEFAULT 100 用户信用分。TINYINT 范围‑128~127,足够存放 0‑100 分数;默认 100 代表新用户初始满分。
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 注册时间。插入记录时自动填充当前系统时间,不需要程序手动写时间。

重点:手机号不要用 int!数字类型会丢失开头 0,也不适合手机号。TIMESTAMP 自动获取当前时间。

3、products 商品表(核心业务表)

表格

字段名 数据类型 约束 为什么这样设计
prod_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT 商品唯一编号,主键自增。
prod_name VARCHAR(100) NOT NULL 商品名称,最多 100 字符,商品必须有名字。
description TEXT 允许 NULL 商品详情描述。TEXT 存大段长文本,商品描述可以为空。
price DECIMAL(10,2) NOT NULL , CHECK(price>0) 商品价格。不能用 float/double 浮点数! DECIMAL 定点小数专门存金钱,(10,2):总 10 位,小数占 2 位,最大 99999999.99;CHECK 保证价格大于 0,不能 0 元或者负数。
stock_num INT UNSIGNED DEFAULT 1 库存,无符号整数,最小 0,默认库存为 1 件。
cat_id INT UNSIGNED NOT NULL 外键逻辑:关联 categories.cat_id。商品必须归属某一个分类,不能为空。
seller_id INT UNSIGNED NOT NULL 外键逻辑:关联 users.user_id,代表这个商品是谁发布(卖家用户 ID),商品必须有卖家。
status ENUM('on_sale','sold_out','removed') DEFAULT 'on_sale' 商品状态,只能取这三个值:on_sale 在售、sold_out 已售出、removed 下架删除。默认刚发布为在售。ENUM 限制只能填规定选项,防止乱输入状态。
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 商品发布时间,插入数据自动填当前时间。

整体设计思想

  1. 主键统一设计 :每张表都设置一个无符号自增 INT 作为主键(xxx_id),业务上不使用用户名、手机号当主键,主键使用数字,查询效率高。
  2. 字符集统一 utf8mb4:支持完整中文、emoji,解决中文乱码,引擎选用 InnoDB,支持事务、外键。
  3. 时间字段使用 TIMESTAMP DEFAULT CURRENT_TIMESTAMP:新增记录数据库自动生成时间,应用程序不用手动传入时间。
  4. 金钱字段必须用 DECIMAL:禁止 float,浮点数会产生精度误差。
  5. ENUM 状态约束:商品状态固定几种,限制输入,保证数据规范。
  6. 关联关系
    • products.cat_id 关联 categories.cat_id:商品属于哪个分类
    • products.seller_id 关联 users.user_id:商品属于哪个卖家用户

具体步骤

阶段一:环境确认,使用 HeidiSQL 登录并切换second_hand_market数据库

  1. 打开 HeidiSQL 软件,在会话管理器中,双击已经建好的 shm_user 会话连接,完成登录连接 MySQL 服务器。

步骤 1:先创建 second_hand_market 数据库

在 SQL 编辑框追加下面建库语句,全选执行 F9

复制代码
-- 创建二手交易平台数据库,指定字符集utf8mb4
CREATE DATABASE IF NOT EXISTS second_hand_market 
DEFAULT CHARACTER SET utf8mb4 
COLLATE utf8mb4_general_ci;

IF NOT EXISTS:数据库存在就不会重复创建、不会报错。

步骤 2:再执行切换数据库语句

复制代码
USE second_hand_market;
SELECT DATABASE();

执行完成,下方结果返回second_hand_market,代表切换成功。

步骤 3:再执行三张业务表建表 SQL

复制代码
-- 1、categories 商品分类表
CREATE TABLE IF NOT EXISTS categories (
cat_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '分类ID',
cat_name VARCHAR(50) NOT NULL UNIQUE COMMENT '分类名称',
parent_id INT UNSIGNED DEFAULT 0 COMMENT '父级ID,0表示一级分类'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='商品分类表';

-- 2、users 用户表
CREATE TABLE IF NOT EXISTS users (
user_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
password VARCHAR(100) NOT NULL COMMENT '密码(明文或哈希)',
phone VARCHAR(11) NOT NULL UNIQUE COMMENT '手机号',
credit_score TINYINT DEFAULT 100 COMMENT '信用分,默认100',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='平台用户表';

-- 3、products商品表
CREATE TABLE IF NOT EXISTS products (
prod_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '商品ID',
prod_name VARCHAR(100) NOT NULL COMMENT '商品名称',
description TEXT COMMENT '商品描述',
price DECIMAL(10,2) NOT NULL CHECK (price > 0) COMMENT '价格,必须大于0',
stock_num INT UNSIGNED DEFAULT 1 COMMENT '库存数量',
cat_id INT UNSIGNED NOT NULL COMMENT '分类ID',
seller_id INT UNSIGNED NOT NULL COMMENT '卖家ID',
status ENUM('on_sale','sold_out','removed') DEFAULT 'on_sale' COMMENT '状态',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '发布时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='商品表';

步骤 4:验证

复制代码
SHOW DATABASES;    -- 查看库列表,确认 second_hand_market 出现
SHOW TABLES;       -- 查看该库下三张数据表

步骤 2:SQL 命令验证表结构(新建查询或者在当前页面末尾输入,F9 执行)

复制代码
SHOW TABLES;         -- 列出当前库全部表,核对3张表名称

DESCRIBE categories;
DESCRIBE users;
DESCRIBE products;

-- 查看完整建表语句,核对引擎、字符集、约束、注释
SHOW CREATE TABLE categories;
SHOW CREATE TABLE users;
SHOW CREATE TABLE products;

执行后检查:

  • 存储引擎:InnoDB
  • 字符集:utf8mb4
  • 主键、自增、NOT NULL、UNIQUE、DEFAULT 默认值、COMMENT 注释完整。

步骤 3:图形化界面核对每张表设计(实验要求操作)

  1. 左侧树,右键categories表 →【设计】,弹出表设计窗口。

注意刷新

右键菜单,第一个选项:编辑 (H) Alt+Enter

操作

  1. 点击菜单最上方 编辑 (H),就打开 categories 表的表设计窗口。
  2. 在这里就可以查看全部字段:字段名、数据类型、无符号、主键🔑、自增、非空、默认值、注释。
  3. 上方切换【选项】标签页,确认引擎InnoDB,字符集utf8mb4;切换【索引】标签页,查看主键索引。
  4. 看完关闭窗口,对productsusers两张表,同样右键 →编辑 (H),依次核对。
  1. 逐行核对:字段名、数据类型、无符号 UNSIGNED、主键、自增 AUTO‑INCREMENT、非空、默认值、注释。
  2. 切换【选项】标签页,确认引擎InnoDB,字符集utf8mb4_general_ci

3.同样操作依次打开usersproducts表做核对。

步骤 4(选做)创建索引

复制代码
CREATE INDEX idx_username ON users(username);
CREATE INDEX idx_phone ON users(phone);
CREATE INDEX idx_cat_status ON products(cat_id, status);
CREATE INDEX idx_seller ON products(seller_id);

SHOW INDEX FROM products; -- 查看索引结果

也可以在表设计窗口【索引】选项卡看到新建索引。

步骤 5:保存 SQL 脚本

Ctrl+S保存当前查询页面,文件名实验2_二手平台建库建表.sql,完整代码留存。

可能遇见的问题:

问题 1:执行CREATE DATABASE IF NOT EXISTS second_hand_market出现警告 1007:can't create database'second_hand_market'; database exists 分析:该警告不是错误IF NOT EXISTS判断数据库已经存在,放弃重复创建,不影响后续操作。 解决:无需修改 SQL,继续执行USE second_hand_market;切换数据库即可。
问题 2:执行 CREATE TABLE 建表语句,返回 "受影响记录行数:0" 分析:CREATE TABLE 成功时,HeidiSQL/MySQL 默认返回受影响 0 行,属于正常,代表表创建完成,并非执行失败。

相关推荐
梦帮科技2 小时前
从提示词到可复现音乐工作流:RNOISE 2.0 的 Prompt Engineering 架构
人工智能·python·mysql·ci/cd·架构·node.js·numpy
军训猫猫头2 小时前
C# 封装 MySQL 自动写入与查询工具类(基于 MySqlConnector)
mysql·c#·.net·wpf
呆萌很15 小时前
MySQL 数据库和表的管理操作(命令行)
数据库·mysql
毕业设计70316 小时前
(免费领源码)基于Python的博物馆研学活动管理系统的设计与实现22724- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
python·mysql·随机森林·pycharm·django·flask·推荐算法
程序员阿鹏21 小时前
如何实现MySQL分库分表?
数据结构·数据库·sql·mysql·缓存
风哥2号21 小时前
数据库教程FGMT33‑MySQL主从复制项目实施与维护06(MySQL8.4/9.7 MGR组复制)
数据库·mysql
杨云龙UP1 天前
MySQL Host is blocked because of many connection errors 导致 JDBC 连接失败排查与解决
linux·运维·网络·数据库·sql·mysql·登录失败
程序员梅雨1 天前
MySQL底层探索(一):什么是脏页?什么是冷热分离?
mysql·面试
bksczm1 天前
MySQL基础篇之表的增删查改(CRUD)细则
sql·mysql