电商系统数据库设计方案

69 阅读14分钟

电商系统数据库设计方案

下面是一套完整的电商系统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. 事务优化

  • 使用适当的事务隔离级别
  • 尽量减小事务范围
  • 避免长时间占用事务锁
  • 合理使用索引减少锁竞争

五、数据安全建议

  1. 敏感数据加密存储(如用户密码、支付信息)
  2. 定期数据备份和恢复演练
  3. 实现严格的数据访问权限控制
  4. 记录关键操作日志以便审计
  5. 防止SQL注入攻击

这套电商数据库设计涵盖了核心业务模块,结构清晰,关系完整,同时考虑了性能优化和数据安全。可以根据具体业务需求进行适当调整和扩展。