电商系统数据库设计方案
下面是一套完整的电商系统MySQL数据库设计,涵盖用户、商品、订单、库存、支付、物流等核心模块,采用三范式设计原则,同时兼顾性能优化。
一、核心表结构设计
1. 用户模块
用户登录表(user_login)
CREATE TABLE user_login (
user_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
password VARCHAR(255) NOT NULL COMMENT '密码(加密存储)',
phone VARCHAR(20) UNIQUE COMMENT '手机号',
email VARCHAR(100) UNIQUE COMMENT '邮箱',
status TINYINT DEFAULT 1 COMMENT '状态:1=正常,0=禁用',
login_count INT DEFAULT 0 COMMENT '登录次数',
last_login_time DATETIME DEFAULT NULL COMMENT '最后登录时间',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_username (username),
INDEX idx_phone (phone),
INDEX idx_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户登录表';
用户信息表(user_info)
CREATE TABLE user_info (
info_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '信息ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
nickname VARCHAR(50) DEFAULT NULL COMMENT '昵称',
real_name VARCHAR(50) DEFAULT NULL COMMENT '真实姓名',
avatar VARCHAR(255) DEFAULT NULL COMMENT '头像URL',
gender TINYINT DEFAULT 0 COMMENT '性别:0=未知,1=男,2=女',
birthday DATE DEFAULT NULL COMMENT '出生日期',
member_level_id INT DEFAULT 1 COMMENT '会员等级ID',
points INT DEFAULT 0 COMMENT '积分',
balance DECIMAL(10,2) DEFAULT 0.00 COMMENT '余额',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (user_id) REFERENCES user_login(user_id) ON DELETE CASCADE,
INDEX idx_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
收货地址表(user_address)
CREATE TABLE user_address (
address_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '地址ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
receiver_name VARCHAR(50) NOT NULL COMMENT '收货人姓名',
receiver_phone VARCHAR(20) NOT NULL COMMENT '收货人电话',
province VARCHAR(50) NOT NULL COMMENT '省份',
city VARCHAR(50) NOT NULL COMMENT '城市',
district VARCHAR(50) NOT NULL COMMENT '区县',
detail_address VARCHAR(255) NOT NULL COMMENT '详细地址',
postal_code VARCHAR(10) DEFAULT NULL COMMENT '邮政编码',
is_default TINYINT DEFAULT 0 COMMENT '是否默认地址:0=否,1=是',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (user_id) REFERENCES user_login(user_id) ON DELETE CASCADE,
INDEX idx_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='收货地址表';
2. 商品模块
商品分类表(category)
CREATE TABLE category (
category_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '分类ID',
parent_id BIGINT DEFAULT 0 COMMENT '父分类ID,顶级分类为0',
category_name VARCHAR(50) NOT NULL COMMENT '分类名称',
level TINYINT NOT NULL COMMENT '分类级别:1=一级,2=二级,3=三级',
sort_order INT DEFAULT 0 COMMENT '排序号',
status TINYINT DEFAULT 1 COMMENT '状态:1=启用,0=禁用',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_parent_id (parent_id),
INDEX idx_sort_order (sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品分类表';
商品品牌表(brand)
CREATE TABLE brand (
brand_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '品牌ID',
brand_name VARCHAR(50) NOT NULL COMMENT '品牌名称',
logo_url VARCHAR(255) DEFAULT NULL COMMENT '品牌Logo',
brand_desc TEXT DEFAULT NULL COMMENT '品牌描述',
sort_order INT DEFAULT 0 COMMENT '排序号',
status TINYINT DEFAULT 1 COMMENT '状态:1=启用,0=禁用',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_brand_name (brand_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品品牌表';
商品表(product)
CREATE TABLE product (
product_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '商品ID',
product_name VARCHAR(100) NOT NULL COMMENT '商品名称',
category_id BIGINT NOT NULL COMMENT '分类ID',
brand_id BIGINT NOT NULL COMMENT '品牌ID',
main_image VARCHAR(255) DEFAULT NULL COMMENT '主图URL',
sub_images TEXT DEFAULT NULL COMMENT '子图URL,逗号分隔',
description TEXT DEFAULT NULL COMMENT '商品描述',
original_price DECIMAL(10,2) NOT NULL COMMENT '原价',
sale_price DECIMAL(10,2) NOT NULL COMMENT '销售价',
market_price DECIMAL(10,2) DEFAULT NULL COMMENT '市场价',
sales INT DEFAULT 0 COMMENT '销售量',
view_count INT DEFAULT 0 COMMENT '浏览量',
status TINYINT DEFAULT 1 COMMENT '状态:1=上架,0=下架',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (category_id) REFERENCES category(category_id),
FOREIGN KEY (brand_id) REFERENCES brand(brand_id),
INDEX idx_category_id (category_id),
INDEX idx_brand_id (brand_id),
INDEX idx_sale_price (sale_price),
INDEX idx_sales (sales)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
商品SKU表(product_sku)
CREATE TABLE product_sku (
sku_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'SKU ID',
product_id BIGINT NOT NULL COMMENT '商品ID',
sku_attributes VARCHAR(255) NOT NULL COMMENT 'SKU属性组合,如"颜色:红色,尺码:M"',
sku_code VARCHAR(50) NOT NULL UNIQUE COMMENT 'SKU编码',
price DECIMAL(10,2) NOT NULL COMMENT 'SKU价格',
cost_price DECIMAL(10,2) DEFAULT NULL COMMENT '成本价',
barcode VARCHAR(50) DEFAULT NULL COMMENT '条形码',
status TINYINT DEFAULT 1 COMMENT '状态:1=启用,0=禁用',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (product_id) REFERENCES product(product_id) ON DELETE CASCADE,
INDEX idx_product_id (product_id),
INDEX idx_sku_code (sku_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品SKU表';
商品属性表(product_attribute)
CREATE TABLE product_attribute (
attr_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '属性ID',
category_id BIGINT NOT NULL COMMENT '分类ID',
attr_name VARCHAR(50) NOT NULL COMMENT '属性名称',
attr_type TINYINT DEFAULT 1 COMMENT '属性类型:1=销售属性,0=非销售属性',
attr_values TEXT DEFAULT NULL COMMENT '属性值,逗号分隔',
sort_order INT DEFAULT 0 COMMENT '排序号',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (category_id) REFERENCES category(category_id),
INDEX idx_category_id (category_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品属性表';
3. 库存模块
库存表(inventory)
CREATE TABLE inventory (
inventory_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '库存ID',
sku_id BIGINT NOT NULL COMMENT 'SKU ID',
current_stock INT NOT NULL DEFAULT 0 COMMENT '当前库存',
safety_stock INT DEFAULT 0 COMMENT '安全库存',
lock_stock INT DEFAULT 0 COMMENT '锁定库存',
alert_stock INT DEFAULT 10 COMMENT '预警库存',
warehouse_id BIGINT DEFAULT 1 COMMENT '仓库ID',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE KEY uk_sku_warehouse (sku_id, warehouse_id),
INDEX idx_current_stock (current_stock),
INDEX idx_alert_stock (alert_stock)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库存表';
库存操作记录表(inventory_log)
CREATE TABLE inventory_log (
log_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '日志ID',
sku_id BIGINT NOT NULL COMMENT 'SKU ID',
order_id BIGINT DEFAULT NULL COMMENT '订单ID',
change_type TINYINT NOT NULL COMMENT '变动类型:1=入库,2=出库,3=锁定,4=解锁',
change_quantity INT NOT NULL COMMENT '变动数量',
before_quantity INT NOT NULL COMMENT '变动前数量',
after_quantity INT NOT NULL COMMENT '变动后数量',
operator_id BIGINT DEFAULT NULL COMMENT '操作人ID',
remark VARCHAR(255) DEFAULT NULL COMMENT '备注',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
INDEX idx_sku_id (sku_id),
INDEX idx_order_id (order_id),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库存操作记录表';
4. 订单模块
订单主表(orders)
CREATE TABLE orders (
order_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '订单ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
order_no VARCHAR(50) NOT NULL UNIQUE COMMENT '订单号',
total_amount DECIMAL(10,2) NOT NULL COMMENT '订单总金额',
actual_amount DECIMAL(10,2) NOT NULL COMMENT '实际支付金额',
shipping_amount DECIMAL(10,2) DEFAULT 0.00 COMMENT '运费',
discount_amount DECIMAL(10,2) DEFAULT 0.00 COMMENT '优惠金额',
order_status TINYINT NOT NULL DEFAULT 1 COMMENT '订单状态:1=待付款,2=待发货,3=待收货,4=已完成,5=已取消,6=已退款',
pay_status TINYINT NOT NULL DEFAULT 0 COMMENT '支付状态:0=未支付,1=已支付',
pay_type TINYINT DEFAULT NULL COMMENT '支付方式:1=支付宝,2=微信,3=银行卡',
pay_time DATETIME DEFAULT NULL COMMENT '支付时间',
address_id BIGINT NOT NULL COMMENT '收货地址ID',
receiver_name VARCHAR(50) NOT NULL COMMENT '收货人姓名',
receiver_phone VARCHAR(20) NOT NULL COMMENT '收货人电话',
receiver_address VARCHAR(255) NOT NULL COMMENT '收货地址',
shipping_type TINYINT DEFAULT NULL COMMENT '配送方式',
tracking_no VARCHAR(50) DEFAULT NULL COMMENT '物流单号',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
pay_deadline DATETIME DEFAULT NULL COMMENT '支付截止时间',
remark VARCHAR(255) DEFAULT NULL COMMENT '订单备注',
FOREIGN KEY (user_id) REFERENCES user_login(user_id),
INDEX idx_user_id (user_id),
INDEX idx_order_no (order_no),
INDEX idx_order_status (order_status),
INDEX idx_pay_status (pay_status),
INDEX idx_create_time (create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单主表';
订单明细表(order_item)
CREATE TABLE order_item (
item_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '订单项ID',
order_id BIGINT NOT NULL COMMENT '订单ID',
product_id BIGINT NOT NULL COMMENT '商品ID',
sku_id BIGINT NOT NULL COMMENT 'SKU ID',
product_name VARCHAR(100) NOT NULL COMMENT '商品名称',
sku_attributes VARCHAR(255) DEFAULT NULL COMMENT 'SKU属性',
product_image VARCHAR(255) DEFAULT NULL COMMENT '商品图片',
quantity INT NOT NULL COMMENT '购买数量',
price DECIMAL(10,2) NOT NULL COMMENT '商品单价',
total_price DECIMAL(10,2) NOT NULL COMMENT '商品总价',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES product(product_id),
FOREIGN KEY (sku_id) REFERENCES product_sku(sku_id),
INDEX idx_order_id (order_id),
INDEX idx_product_id (product_id),
INDEX idx_sku_id (sku_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单明细表';
5. 支付模块
支付记录表(payment_record)
CREATE TABLE payment_record (
payment_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '支付记录ID',
order_id BIGINT NOT NULL COMMENT '订单ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
payment_no VARCHAR(50) NOT NULL UNIQUE COMMENT '支付流水号',
amount DECIMAL(10,2) NOT NULL COMMENT '支付金额',
pay_type TINYINT NOT NULL COMMENT '支付方式:1=支付宝,2=微信,3=银行卡',
payment_status TINYINT NOT NULL DEFAULT 0 COMMENT '支付状态:0=处理中,1=支付成功,2=支付失败',
transaction_id VARCHAR(100) DEFAULT NULL COMMENT '第三方交易ID',
payment_time DATETIME DEFAULT NULL COMMENT '支付完成时间',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
remark VARCHAR(255) DEFAULT NULL COMMENT '备注',
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (user_id) REFERENCES user_login(user_id),
INDEX idx_order_id (order_id),
INDEX idx_payment_no (payment_no),
INDEX idx_payment_status (payment_status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付记录表';
6. 物流模块
物流信息表(shipping)
CREATE TABLE shipping (
shipping_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '物流ID',
order_id BIGINT NOT NULL COMMENT '订单ID',
shipping_company VARCHAR(50) DEFAULT NULL COMMENT '快递公司',
tracking_no VARCHAR(50) DEFAULT NULL COMMENT '物流单号',
status TINYINT DEFAULT 0 COMMENT '物流状态:0=未发货,1=已发货,2=已签收',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE,
UNIQUE KEY uk_order_id (order_id),
INDEX idx_tracking_no (tracking_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物流信息表';
物流轨迹表(shipping_track)
CREATE TABLE shipping_track (
track_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '轨迹ID',
shipping_id BIGINT NOT NULL COMMENT '物流ID',
time DATETIME NOT NULL COMMENT '时间',
location VARCHAR(100) DEFAULT NULL COMMENT '地点',
description VARCHAR(255) NOT NULL COMMENT '描述',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
FOREIGN KEY (shipping_id) REFERENCES shipping(shipping_id) ON DELETE CASCADE,
INDEX idx_shipping_id (shipping_id),
INDEX idx_time (time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物流轨迹表';
7. 购物车模块
购物车表(cart)
CREATE TABLE cart (
cart_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '购物车ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
sku_id BIGINT NOT NULL COMMENT 'SKU ID',
product_id BIGINT NOT NULL COMMENT '商品ID',
product_name VARCHAR(100) NOT NULL COMMENT '商品名称',
sku_attributes VARCHAR(255) DEFAULT NULL COMMENT 'SKU属性',
product_image VARCHAR(255) DEFAULT NULL COMMENT '商品图片',
quantity INT NOT NULL DEFAULT 1 COMMENT '数量',
price DECIMAL(10,2) NOT NULL COMMENT '单价',
selected TINYINT DEFAULT 1 COMMENT '是否选中:0=否,1=是',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE KEY uk_user_sku (user_id, sku_id),
FOREIGN KEY (user_id) REFERENCES user_login(user_id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES product(product_id),
FOREIGN KEY (sku_id) REFERENCES product_sku(sku_id),
INDEX idx_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='购物车表';
8. 评价模块
商品评价表(review)
CREATE TABLE review (
review_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '评价ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
product_id BIGINT NOT NULL COMMENT '商品ID',
order_id BIGINT NOT NULL COMMENT '订单ID',
sku_id BIGINT NOT NULL COMMENT 'SKU ID',
rating TINYINT NOT NULL COMMENT '评分:1-5星',
content TEXT DEFAULT NULL COMMENT '评价内容',
images TEXT DEFAULT NULL COMMENT '评价图片,逗号分隔',
status TINYINT DEFAULT 1 COMMENT '状态:0=待审核,1=已发布,2=已删除',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (user_id) REFERENCES user_login(user_id),
FOREIGN KEY (product_id) REFERENCES product(product_id),
FOREIGN KEY (order_id) REFERENCES orders(order_id),
INDEX idx_user_id (user_id),
INDEX idx_product_id (product_id),
INDEX idx_rating (rating),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品评价表';
二、数据库关系图
用户模块 ────┬──── 用户登录表(user_login)
│
├──── 用户信息表(user_info)
│
└──── 收货地址表(user_address)
商品模块 ────┬──── 商品分类表(category)
│
├──── 商品品牌表(brand)
│
├──── 商品表(product)
│
├──── 商品SKU表(product_sku)
│
└──── 商品属性表(product_attribute)
库存模块 ────┬──── 库存表(inventory)
│
└──── 库存操作记录表(inventory_log)
订单模块 ────┬──── 订单主表(orders)
│
└──── 订单明细表(order_item)
支付模块 ────┬──── 支付记录表(payment_record)
物流模块 ────┬──── 物流信息表(shipping)
│
└──── 物流轨迹表(shipping_track)
购物车模块 ──┬──── 购物车表(cart)
评价模块 ────┬──── 商品评价表(review)
三、核心业务流程SQL示例
1. 商品库存扣减(事务)
BEGIN;
-- 1. 检查库存是否充足
SELECT current_stock INTO @current_stock
FROM inventory
WHERE sku_id = #{skuId} FOR UPDATE;
IF @current_stock >= #{quantity} THEN
-- 2. 扣减库存
UPDATE inventory
SET current_stock = current_stock - #{quantity}
WHERE sku_id = #{skuId};
-- 3. 记录库存操作日志
INSERT INTO inventory_log (sku_id, order_id, change_type, change_quantity, before_quantity, after_quantity, remark)
VALUES (#{skuId}, #{orderId}, 2, #{quantity}, @current_stock, @current_stock - #{quantity}, '订单出库');
COMMIT;
ELSE
ROLLBACK;
-- 返回库存不足错误
END IF;
2. 创建订单流程
BEGIN;
-- 1. 生成订单号
SET @order_no = CONCAT(DATE_FORMAT(NOW(), '%Y%m%d%H%i%s'), LPAD(FLOOR(RAND()*10000), 4, '0'));
-- 2. 插入订单主表
INSERT INTO orders (user_id, order_no, total_amount, actual_amount, shipping_amount,
discount_amount, order_status, pay_status, address_id,
receiver_name, receiver_phone, receiver_address, pay_deadline, remark)
VALUES (#{userId}, @order_no, #{totalAmount}, #{actualAmount}, #{shippingAmount},
#{discountAmount}, 1, 0, #{addressId}, #{receiverName}, #{receiverPhone},
#{receiverAddress}, DATE_ADD(NOW(), INTERVAL 30 MINUTE), #{remark});
SET @order_id = 3061828;
-- 3. 插入订单明细
INSERT INTO order_item (order_id, product_id, sku_id, product_name, sku_attributes,
product_image, quantity, price, total_price)
VALUES
<foreach collection="orderItems" item="item" separator=",">
(@order_id, #{item.productId}, #{item.skuId}, #{item.productName}, #{item.skuAttributes},
#{item.productImage}, #{item.quantity}, #{item.price}, #{item.totalPrice})
</foreach>;
-- 4. 锁定库存
UPDATE inventory
SET lock_stock = lock_stock + #{item.quantity}
WHERE sku_id = #{item.skuId};
-- 5. 记录库存锁定日志
<foreach collection="orderItems" item="item">
INSERT INTO inventory_log (sku_id, order_id, change_type, change_quantity,
before_quantity, after_quantity, remark)
VALUES (#{item.skuId}, @order_id, 3, #{item.quantity},
(SELECT lock_stock FROM inventory WHERE sku_id = #{item.skuId}) - #{item.quantity},
(SELECT lock_stock FROM inventory WHERE sku_id = #{item.skuId}), '订单锁定库存');
</foreach>
-- 6. 清空购物车中已下单商品
DELETE FROM cart
WHERE user_id = #{userId} AND sku_id IN
<foreach collection="orderItems" item="item" open="(" close=")" separator=",">
#{item.skuId}
</foreach>;
COMMIT;
四、性能优化建议
1. 索引优化
- 为频繁查询的字段创建索引
- 为外键字段创建索引
- 为排序、分组字段创建索引
- 复合索引遵循最左前缀原则
- 定期分析索引使用情况,移除未使用的索引
2. 分库分表策略
- 水平分表:针对订单表、日志表等大数据量表
- 按时间分表:orders_2023, orders_2024
- 按用户ID分表:根据用户ID取模分片
- 垂直分库:
- 业务拆分:用户库、商品库、订单库
- 冷热数据分离:将不常用的历史数据迁移到归档表
3. 缓存策略
- 使用Redis缓存热点商品数据
- 缓存商品分类、品牌等基础数据
- 缓存用户会话信息
- 实现分布式锁处理库存扣减等高并发场景
4. 读写分离
- 主库负责写操作,从库负责读操作
- 根据业务特点配置合适的读写分离策略
- 实现延迟感知和故障转移机制
5. 事务优化
- 使用适当的事务隔离级别
- 尽量减小事务范围
- 避免长时间占用事务锁
- 合理使用索引减少锁竞争
五、数据安全建议
- 敏感数据加密存储(如用户密码、支付信息)
- 定期数据备份和恢复演练
- 实现严格的数据访问权限控制
- 记录关键操作日志以便审计
- 防止SQL注入攻击
这套电商数据库设计涵盖了核心业务模块,结构清晰,关系完整,同时考虑了性能优化和数据安全。可以根据具体业务需求进行适当调整和扩展。