mysql如何设计优惠券表

mysql如何设计优惠券表
最新回答
今天抽風了

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),加速查询即将过期的用户券(如“发送过期提醒”)

四、设计优势说明
  1. 灵活性:通过字段拆分(如将复杂规则移至独立表)和枚举类型设计,支持多种业务场景(满减、折扣、免运费等)。
  2. 可扩展性:独立表结构便于新增规则字段或关联表,无需修改核心逻辑(如新增“适用店铺”规则时,仅需扩展 coupon_rule 表)。
  3. 查询效率:索引覆盖高频查询场景(如用户券列表、过期券清理),避免全表扫描。
  4. 数据隔离:coupon 表存储模板信息,user_coupon 表存储用户实例,避免数据冗余且便于统计(如“已领取数量”直接从 user_coupon 表计数)。

此方案适用于电商、O2O等需要发放与管理优惠券的场景,可支撑发券任务、核销统计、过期提醒等衍生功能。