2021-06-26 11:43:50
MySQL 优惠券表设计需采用双表结构(coupon + user_coupon),通岁清枯过字段拆分与索引优化兼顾灵活性与查询效率,支持复杂规则扩展。 以下是具体设计方案:
一、核心表结构设计1. 优惠券模板表(coupon)存储通用规则,字段设计如下:
基础字段
id:BIGINT 自增主键
name:VARCHAR(100),优惠券名称(如“满100减20”)
type:TINYINT,类型枚举(1-满减/2-折扣/3-免运费/4-固定金额)
value:DECIMAL(10,2),优惠值(满减金额/折扣系数/固定金额)
condition_amount:DECIMAL(10,2),使用门槛(如满100元可用)
max_discount:DECIMAL(10,2),折扣类券的最大优惠金额(防止过度折扣)
状态与数量控制
status:TINYINT,状态枚举(0-下架/1-上架/2-已过期)
total_count:INT,总发行数量
used_count:INT,已领取数量(用于限领控制)
per_user_limit:INT,每个用户最多领取张数(默认1)
有效乎洞期规则
valid_type:TINYINT,有效期类型(1-固定时间/2-领取后N天有效)
start_time:DATETIME,固定有效期开始时间(valid_type=1时使用)
end_time:DATETIME,固定有效期结束时间(valid_type=1时使用)
expire_days:INT,领取后多少天内有效(valid_type=2时使用)
时间戳
created_at:DATETIME,创建时间
updated_at:DATETIME ON UPDATE CURRENT_TIMESTAMP,更新时间
2. 用户优惠券记录表(user_coupon)记录用户领取与使用状态,字段设计如下:
关联字段
id:BIGINT 自增主键
coupon_id:BIGINT,外键关联 coupon 表
user_id:BIGINT,用户ID
状态与时间
status:TINYINT,使用状态(0-未使用/1-已使用/2-已过期/3-已锁定)
received_at:DATETIME,领取时间
used_at:DATETIME,使用时间(可为空)
order_id:BIGINT,关联的订单ID(使用后填写)
动态有效期
effective_start:DATETIME,实际生效时间(根据 valid_type 计算)
effective_end:DATETIME,实际失效时间
若需支持更复杂的业务规则,可通过以下正乎方式扩展:
适用范围
在 coupon 表中增加字段:
category_ids:TEXT,适用商品类目ID列表(JSON格式)
product_ids:TEXT,指定商品ID列表(JSON格式)
exclude_products:TEXT,排除商品ID列表(JSON格式)
或拆分独立表:创建 coupon_rule 表,通过外键关联 coupon 表,存储规则详情(如适用商品、排除规则等)。
使用限制
在 coupon 表中增加字段:
min_buy_count:INT,最低购买件数(如“满3件减50元”)
活动关联
在 coupon 表中增加字段:
campaign_id:BIGINT,关联的促销活动ID(用于归因分析)
通过索引提升高频查询性能,关键索引如下:
coupon 表
index_status_type:(status, type),加速按状态和类型筛选优惠券(如“查询所有上架的满减券”)
index_time:(start_time, end_time),加速按有效期范围查询(如“查询当前有效的优惠券”)
user_coupon 表
index_user_status:(user_id, status),加速查询用户可用券(如“查询用户未使用的优惠券”)
index_coupon_user:(coupon_id, user_id),加速查询特定优惠券的用户领取情况
index_effective_end:(effective_end),加速查询即将过期的用户券(如“发送过期提醒”)
此方案适用于电商、O2O等需要发放与管理优惠券的场景,可支撑发券任务、核销统计、过期提醒等衍生功能。