订单系统表结构说明.md 12 KB

订单系统表结构说明

一、新增表

1. 购物车表(store_cart)

CREATE TABLE `store_cart` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `table_id` int(11) NOT NULL COMMENT '桌号ID',
  `store_id` int(11) NOT NULL COMMENT '门店ID',
  `cuisine_id` int(11) NOT NULL COMMENT '菜品ID',
  `cuisine_name` varchar(200) NOT NULL COMMENT '菜品名称',
  `cuisine_image` varchar(500) DEFAULT NULL COMMENT '菜品图片',
  `unit_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '单价',
  `quantity` int(11) NOT NULL DEFAULT '1' COMMENT '数量',
  `subtotal_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '小计金额',
  `add_user_id` int(11) DEFAULT NULL COMMENT '添加该菜品的用户ID',
  `add_user_phone` varchar(20) DEFAULT NULL COMMENT '添加该菜品的用户手机号',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `delete_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记, 0:未删除, 1:已删除',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `created_user_id` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `updated_user_id` int(11) DEFAULT NULL COMMENT '修改人ID',
  PRIMARY KEY (`id`),
  KEY `idx_table_id` (`table_id`),
  KEY `idx_store_id` (`store_id`),
  KEY `idx_cuisine_id` (`cuisine_id`),
  KEY `idx_add_user_id` (`add_user_id`),
  KEY `idx_created_time` (`created_time`),
  KEY `idx_table_delete` (`table_id`, `delete_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='购物车表';

说明: 用于持久化购物车数据,Redis作为缓存层,避免Redis宕机导致数据丢失。


2. 优惠券使用记录表(store_coupon_usage)

CREATE TABLE `store_coupon_usage` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `table_id` int(11) NOT NULL COMMENT '桌号ID',
  `store_id` int(11) NOT NULL COMMENT '门店ID',
  `order_id` int(11) DEFAULT NULL COMMENT '订单ID',
  `coupon_id` int(11) NOT NULL COMMENT '优惠券ID',
  `coupon_name` varchar(200) DEFAULT NULL COMMENT '优惠券名称',
  `discount_amount` decimal(10,2) DEFAULT '0.00' COMMENT '优惠金额',
  `usage_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '使用状态(0:已标记使用, 1:已下单, 2:已支付, 3:已取消)',
  `from_table_id` int(11) DEFAULT NULL COMMENT '换桌前的桌号ID',
  `migrate_time` datetime DEFAULT NULL COMMENT '换桌迁移时间',
  `delete_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记, 0:未删除, 1:已删除',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `created_user_id` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `updated_user_id` int(11) DEFAULT NULL COMMENT '修改人ID',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_table_coupon` (`table_id`, `coupon_id`, `delete_flag`),
  KEY `idx_table_id` (`table_id`),
  KEY `idx_store_id` (`store_id`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_coupon_id` (`coupon_id`),
  KEY `idx_usage_status` (`usage_status`),
  KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='优惠券使用记录表';

说明: 记录每张桌子的优惠券使用情况,支持换桌场景的优惠券迁移。


3. 订单锁定记录表(store_order_lock)

CREATE TABLE `store_order_lock` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `table_id` int(11) DEFAULT NULL COMMENT '桌号ID',
  `order_id` int(11) DEFAULT NULL COMMENT '订单ID',
  `lock_type` tinyint(4) NOT NULL COMMENT '锁定类型(1:下单锁定, 2:结算锁定)',
  `lock_user_id` int(11) NOT NULL COMMENT '锁定用户ID',
  `lock_user_phone` varchar(20) DEFAULT NULL COMMENT '锁定用户手机号',
  `lock_expire_time` datetime NOT NULL COMMENT '锁定过期时间',
  `lock_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '锁定状态(0:已释放, 1:锁定中)',
  `release_time` datetime DEFAULT NULL COMMENT '释放时间',
  `delete_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记, 0:未删除, 1:已删除',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  KEY `idx_table_id` (`table_id`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_lock_type` (`lock_type`),
  KEY `idx_lock_status` (`lock_status`),
  KEY `idx_lock_expire_time` (`lock_expire_time`),
  KEY `idx_table_lock` (`table_id`, `lock_type`, `lock_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单锁定记录表';

说明: 记录下单和结算时的锁定信息,便于排查问题和数据恢复。


二、优化后的表

4. 订单表(store_order)

基础字段:

CREATE TABLE `store_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `order_no` varchar(64) NOT NULL COMMENT '订单号',
  `store_id` int(11) NOT NULL COMMENT '门店ID',
  `table_id` int(11) NOT NULL COMMENT '桌号ID',
  `table_number` varchar(50) DEFAULT NULL COMMENT '桌号',
  `diner_count` int(11) DEFAULT NULL COMMENT '就餐人数',
  `pay_user_id` int(11) DEFAULT NULL COMMENT '支付用户ID',
  `pay_user_phone` varchar(20) DEFAULT NULL COMMENT '支付用户手机号',
  `contact_phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
  `tableware_fee` decimal(10,2) DEFAULT '0.00' COMMENT '餐具费',
  `order_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单状态(0:待支付, 1:已支付, 2:已取消, 3:已完成)',
  `total_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '订单总金额',
  `coupon_id` int(11) DEFAULT NULL COMMENT '优惠券ID',
  `discount_amount` decimal(10,2) DEFAULT '0.00' COMMENT '优惠金额',
  `pay_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '实付金额',
  `pay_type` tinyint(4) DEFAULT NULL COMMENT '支付方式(1:微信, 2:支付宝, 3:现金)',
  `pay_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '支付状态(0:未支付, 1:已支付, 2:已退款)',
  `pay_time` datetime DEFAULT NULL COMMENT '支付时间',
  `pay_trade_no` varchar(128) DEFAULT NULL COMMENT '支付交易号',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `delete_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记, 0:未删除, 1:已删除',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `created_user_id` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `updated_user_id` int(11) DEFAULT NULL COMMENT '修改人ID',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_order_no` (`order_no`),
  KEY `idx_store_id` (`store_id`),
  KEY `idx_table_id` (`table_id`),
  KEY `idx_pay_user_id` (`pay_user_id`),
  KEY `idx_order_status` (`order_status`),
  KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';

新增字段:

  • current_coupon_id int(11) DEFAULT NULL COMMENT '当前使用的优惠券ID' - 用于换桌场景
  • lock_user_id int(11) DEFAULT NULL COMMENT '锁定用户ID' - 下单或结算时锁定
  • lock_expire_time datetime DEFAULT NULL COMMENT '锁定过期时间' - 锁定过期时间

新增索引:

  • idx_current_coupon_id (current_coupon_id)
  • idx_lock_user_id (lock_user_id)
  • idx_table_status (table_id, order_status)
  • idx_store_status (store_id, order_status)

5. 订单明细表(store_order_detail)

基础字段:

CREATE TABLE `store_order_detail` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `order_id` int(11) NOT NULL COMMENT '订单ID',
  `order_no` varchar(64) NOT NULL COMMENT '订单号',
  `cuisine_id` int(11) NOT NULL COMMENT '菜品ID',
  `cuisine_name` varchar(200) NOT NULL COMMENT '菜品名称',
  `cuisine_type` tinyint(4) NOT NULL COMMENT '菜品类型(1:单品, 2:套餐)',
  `cuisine_image` varchar(500) DEFAULT NULL COMMENT '菜品图片',
  `unit_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '单价',
  `quantity` int(11) NOT NULL DEFAULT '1' COMMENT '数量',
  `subtotal_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '小计金额',
  `add_user_id` int(11) DEFAULT NULL COMMENT '添加该菜品的用户ID',
  `add_user_phone` varchar(20) DEFAULT NULL COMMENT '添加该菜品的用户手机号',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `delete_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记, 0:未删除, 1:已删除',
  `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `created_user_id` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `updated_user_id` int(11) DEFAULT NULL COMMENT '修改人ID',
  PRIMARY KEY (`id`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_order_no` (`order_no`),
  KEY `idx_cuisine_id` (`cuisine_id`),
  KEY `idx_add_user_id` (`add_user_id`),
  KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单明细表';

新增字段:

  • is_add_dish tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否加餐(0:初始下单, 1:加餐)' - 区分初始下单和加餐
  • add_dish_time datetime DEFAULT NULL COMMENT '加餐时间' - 加餐时间

新增索引:

  • idx_order_cuisine (order_id, cuisine_id)
  • idx_is_add_dish (is_add_dish)
  • idx_add_dish_time (add_dish_time)

6. 桌号表(store_table)

说明: 此表为已存在的表,新增以下字段和索引。

新增字段:

  • current_coupon_id int(11) DEFAULT NULL COMMENT '当前使用的优惠券ID' - 便于查询和换桌迁移
  • cart_item_count int(11) DEFAULT '0' COMMENT '购物车商品数量' - 购物车商品数量(缓存)
  • cart_total_amount decimal(10,2) DEFAULT '0.00' COMMENT '购物车总金额' - 购物车总金额(缓存)

新增索引:

  • idx_current_coupon_id (current_coupon_id)
  • idx_store_status (store_id, status)

三、表关系说明

  1. store_order ←→ store_order_detail:一对多关系,通过 order_id 关联
  2. store_table ←→ store_order:一对多关系,通过 table_id 关联
  3. store_table ←→ store_cart:一对多关系,通过 table_id 关联
  4. store_table ←→ store_coupon_usage:一对多关系,通过 table_id 关联
  5. store_order ←→ store_coupon_usage:一对一关系,通过 order_id 关联
  6. store_table ←→ store_order_lock:一对多关系,通过 table_id 关联(下单锁定)
  7. store_order ←→ store_order_lock:一对一关系,通过 order_id 关联(结算锁定)

四、字段说明

订单状态(order_status)

  • 0: 待支付
  • 1: 已支付
  • 2: 已取消
  • 3: 已完成

支付状态(pay_status)

  • 0: 未支付
  • 1: 已支付
  • 2: 已退款

支付方式(pay_type)

  • 1: 微信
  • 2: 支付宝
  • 3: 现金

优惠券使用状态(usage_status)

  • 0: 已标记使用
  • 1: 已下单
  • 2: 已支付
  • 3: 已取消

锁定类型(lock_type)

  • 1: 下单锁定
  • 2: 结算锁定

锁定状态(lock_status)

  • 0: 已释放
  • 1: 锁定中

是否加餐(is_add_dish)

  • 0: 初始下单
  • 1: 加餐

餐桌状态(status)

  • 0: 空闲
  • 1: 就餐中
  • 2: 其他
  • 3: 加餐(当首次订单发生变化时,状态从"就餐中"变为"加餐")

五、索引说明

主要查询场景索引:

  1. 按桌号查询订单idx_table_id, idx_table_status
  2. 按门店查询订单idx_store_id, idx_store_status
  3. 按订单号查询uk_order_no(唯一索引)
  4. 按用户查询订单idx_pay_user_id
  5. 按状态查询订单idx_order_status
  6. 按时间查询订单idx_created_time
  7. 购物车查询idx_table_id, idx_table_delete
  8. 优惠券查询uk_table_coupon(唯一索引),idx_table_id, idx_coupon_id
  9. 锁定查询idx_table_lock, idx_lock_expire_time

六、执行顺序

  1. 先执行 store_order_tables.sql 创建基础表(如果表不存在)
  2. 再执行 store_order_optimization_final.sql 进行优化(添加字段和索引)