设计用户、商品、订单、支付四表,关联外键,存用户信息、商品详情、订单数据及支付状态,支撑商城运转
用户模块设计
表名 | 字段名 | 类型 | 说明 | 主键/外键 |
users | id | BIGINT | 用户唯一标识 | PRIMARY KEY AUTO_INCREMENT |
username | VARCHAR(50) | 用户名(唯一) | UNIQUE |
password_hash | VARCHAR(255) | 密码哈希值 |
email | VARCHAR(100) | 邮箱(唯一) | UNIQUE |
phone | VARCHAR(20) | 手机号 |
address | VARCHAR(500) | 收货地址 |
create_time | DATETIME | 注册时间 |
last_login_time | DATETIME | 最后登录时间 |
商品模块设计
表名 | 字段名 | 类型 | 说明 | 主键/外键 |
categories | id | BIGINT | 分类唯一标识 | PRIMARY KEY AUTO_INCREMENT |
name | VARCHAR(100) | 分类名称(如“手机”) | UNIQUE |
parent_id | BIGINT | 父分类ID(支持多级分类) | FOREIGN KEY REFERENCES categories(id) |
products | id | BIGINT | 商品唯一标识 | PRIMARY KEY AUTO_INCREMENT |
name | VARCHAR(200) | 商品名称 |
description | TEXT | 商品描述 |
price | DECIMAL(10,2) | 商品价格(单位:元) |
stock | INT | 库存数量 |
category_id | BIGINT | 所属分类ID | FOREIGN KEY REFERENCES categories(id) |
brand | VARCHAR(50) | 品牌名称 |
image_url | VARCHAR(500) | 商品主图URL |
订单模块设计
表名 | 字段名 | 类型 | 说明 | 主键/外键 |
orders | id | BIGINT | 订单唯一标识 | PRIMARY KEY AUTO_INCREMENT |
user_id | BIGINT | 下单用户ID | FOREIGN KEY REFERENCES users(id) |
order_sn | VARCHAR(50) | 订单编号(全局唯一) | UNIQUE |
total_amount | DECIMAL(10,2) | 订单总金额 |
status | TINYINT | 订单状态(0-待支付,1-已支付,2-已发货,3-已完成,4-已取消) |
create_time | DATETIME | 下单时间 |
order_items | id | BIGINT | 订单项唯一标识 | PRIMARY KEY AUTO_INCREMENT |
order_id | BIGINT | 所属订单ID | FOREIGN KEY REFERENCES orders(id) |
product_id | BIGINT | 商品ID | FOREIGN KEY REFERENCES products(id) |
quantity | INT | 购买数量 |
price | DECIMAL(10,2) | 单价(下单时锁定) |
购物车模块设计
表名 | 字段名 | 类型 | 说明 | 主键/外键 |
carts | id | BIGINT | 购物车条目ID | PRIMARY KEY AUTO_INCREMENT |
user_id | BIGINT | 用户ID | FOREIGN KEY REFERENCES users(id) |
product_id | BIGINT | 商品ID | FOREIGN KEY REFERENCES products(id) |
quantity | INT | 商品数量 |
update_time | DATETIME | 最后更新时间 |
支付与物流模块设计
表名 | 字段名 | 类型 | 说明 | 主键/外键 |
payments | id | BIGINT | 支付记录ID | PRIMARY KEY AUTO_INCREMENT |
order_id | BIGINT | 关联订单ID | FOREIGN KEY REFERENCES orders(id) |
payment_method | TINYINT | 支付方式(1-支付宝,2-微信,3-银行卡) |
amount | DECIMAL(10,2) | 支付金额 |
status | TINYINT | 支付状态(0-未支付,1-已支付) |
payment_time | DATETIME | 支付完成时间 |
logistics | id | BIGINT | 物流记录ID | PRIMARY KEY AUTO_INCREMENT |
order_id | BIGINT | 关联订单ID | FOREIGN KEY REFERENCES orders(id) |
courier | VARCHAR(50) | 快递公司名称 |
tracking_no | VARCHAR(50) | 物流单号 |
status | TINYINT | 物流状态(0-未发货,1-已发货,2-已签收) |
评价与收藏模块设计
表名 | 字段名 | 类型 | 说明 | 主键/外键 |
reviews | id | BIGINT | 评价ID | PRIMARY KEY AUTO_INCREMENT |
user_id | BIGINT | 用户ID | FOREIGN KEY REFERENCES users(id) |
product_id | BIGINT | 商品ID | FOREIGN KEY REFERENCES products(id) |
rating | TINYINT | 评分(1-5星) |
comment | TEXT |
images | TEXT | 评价图片(JSON数组) |
create_time | DATETIME | 评价时间 |
favorites | id | BIGINT | 收藏记录ID | PRIMARY KEY AUTO_INCREMENT |
user_id | BIGINT | 用户ID | FOREIGN KEY REFERENCES users(id) |
product_id | BIGINT | 商品ID | FOREIGN KEY REFERENCES products(id) |
create_time | DATETIME | 收藏时间 |
相关问题与解答
问题1:如何保证高并发场景下库存扣减的准确性?
解答:
- 数据库层面:使用
stock
字段的原子更新操作(如UPDATE products SET stock = stock ? WHERE id = ? AND stock >= ?
),确保库存不会被超卖。 - 事务控制:在订单创建和库存扣减操作中使用事务,保证两者要么同时成功,要么同时回滚。
- 乐观锁:在
products
表中增加version
字段,每次更新时校验版本号,避免并发冲突。 - 缓存预热:将热门商品库存同步到Redis缓存,通过分布式锁控制并发更新。
问题2:订单状态流转的逻辑如何设计?
解答:
- 状态定义:订单状态分为
待支付
(0)→ 已支付
(1)→ 已发货
(2)→ 已完成
(3)→ 已取消
(4)。 - 状态机规则:
待支付
可转为已支付
或已取消
; 已支付
可转为已发货
或已取消
; 已发货
可转为已完成
; 已完成
和已取消
为终态,不可变更。
- 实现方式:在代码中通过枚举类定义状态,并在更新状态时校验合法性(如禁止从
已发货
直接跳到`