简介
本设计文档聚焦于 DouPHP 营销工具模块的数据库表结构,覆盖优惠券、促销活动(以分享推广为主)、分销佣金与层级、以及分享推广等关键能力。文档从数据模型出发,解释优惠券发放与使用、活动规则配置、分销佣金计算、分享推广等业务逻辑的数据支撑,并提供表关系设计与性能优化策略,面向营销系统开发者与运营人员提供完整的参考。
项目结构
营销相关表主要分布在以下模块的备份 SQL 中:
- 优惠券模块:包含优惠券主表与日志表
- 分销模块:包含分销申请、等级、等级变更日志、上下级关系
- 分享模块:包含分享单记录
graph TB
subgraph "营销模块"
C["优惠券<br/>dou_coupon / dou_coupon_log"]
D["分销<br/>dou_distribution / dou_distribution_level / dou_distribution_level_log / dou_distribution_relation"]
S["分享推广<br/>dou_share"]
end
C --> |"关联订单号"| D
S --> |"用户维度追踪"| D
核心组件
- 优惠券体系
- 优惠券主表:定义券类型、面值、门槛、适用范围、有效期、可叠加、首单限制、总量与已发量等
- 优惠券日志表:记录领取、使用、状态、关联订单、IP 等审计信息
- 分销体系
- 分销申请表:记录会员申请、处理记录与状态
- 分销等级表:定义直推与间推佣金比例、升级条件、排序
- 等级变更日志:记录用户等级变化、触发金额、关联订单
- 分销关系表:维护用户与上级用户的层级关系
- 分享推广
- 分享单表:记录分享任务、审核状态与处理记录
架构总览
营销工具的数据流围绕“活动配置—发放/参与—核销/结算—统计”展开:
- 优惠券:通过主表配置规则,日志表记录领取与使用,结合订单号完成核销闭环
- 分销:通过等级表定义佣金比例,关系表构建推广链路,申请与等级日志记录生命周期
- 分享:通过分享单记录推广行为与审核流程,为后续转化归因提供依据
sequenceDiagram
participant U as "用户"
participant O as "订单系统"
participant CP as "优惠券服务"
participant CL as "优惠券日志"
participant DS as "分销服务"
participant DR as "分销关系"
participant DL as "等级日志"
participant SH as "分享服务"
U->>CP : 领取优惠券
CP-->>U : 返回领取结果
U->>O : 下单并尝试使用优惠券
O->>CP : 校验券规则与可用性
CP->>CL : 记录使用(订单号/时间/IP)
O-->>U : 返回支付结果
U->>DS : 成为分销员(申请)
DS->>DR : 建立上下级关系
O-->>DS : 订单结算触发佣金
DS->>DL : 记录等级变更/佣金计算
U->>SH : 发起分享推广
SH-->>U : 生成分享单/待审核
详细组件分析
优惠券表设计
- 优惠券主表
- 标识与名称:自增 ID、名称、唯一编号
- 券类型与面额:券类型、面值、最大折扣
- 使用限制:每人限领数量、是否可叠加、是否仅限首单
- 门槛与范围:使用条件金额、适用范围类型与值(如商品/类目)
- 有效期:开始与结束时间
- 展示与排序:简介、图片、排序字段
- 总量控制:总量、已发放量
- 状态:启用/禁用
- 优惠券日志表
- 主体:用户 ID、券 ID
- 事件:领取时间、使用时间、订单号、IP
- 状态:记录券生命周期状态
- 时间戳:创建时间
erDiagram
DOU_COUPON {
int id PK
varchar name
varchar coupon_sn
varchar type
decimal face_value
decimal max_discount
smallint limit_per_user
int total_quantity
int issued_quantity
tinyint is_stackable
tinyint is_first_order_only
decimal condition
varchar scope_type
text scope_value
datetime start_at
datetime end_at
varchar brief
varchar image
tinyint sort
tinyint status
datetime created_at
}
DOU_COUPON_LOG {
int id PK
mediumint user_id
mediumint coupon_id
datetime claimed_at
datetime used_at
varchar order_sn
varchar ip
tinyint status
datetime created_at
}
DOU_COUPON ||--o{ DOU_COUPON_LOG : "被领取/使用"
分销表设计
- 分销申请表
- 主体:用户 ID、姓名、备注
- 等级:当前等级 ID
- 处理:处理记录、处理时间、状态(待处理/已通过/已拒绝等)
- 时间戳:创建时间
- 分销等级表
- 名称、直推佣金比例、间推佣金比例、升级条件金额、排序、创建时间
- 等级变更日志
- 用户 ID、旧等级 ID、新等级 ID、触发条件值、关联订单、创建时间
- 分销关系表
- 用户 ID、上级用户 ID、层级深度、创建时间;唯一约束保证一对一父子关系
erDiagram
DOU_DISTRIBUTION {
int id PK
mediumint user_id
varchar name
text remark
int level_id
text handle_record
datetime handled_at
varchar status
datetime created_at
}
DOU_DISTRIBUTION_LEVEL {
int id PK
varchar name
decimal direct_reward_percent
decimal indirect_reward_percent
decimal upgrade_condition_amount
tinyint sort
datetime created_at
}
DOU_DISTRIBUTION_LEVEL_LOG {
int id PK
int user_id
int old_level_id
int new_level_id
decimal condition_value
varchar order_sn
datetime created_at
}
DOU_DISTRIBUTION_RELATION {
int id PK
int user_id
int parent_user_id
tinyint level
datetime created_at
}
DOU_DISTRIBUTION }o--|| DOU_DISTRIBUTION_LEVEL : "level_id"
DOU_DISTRIBUTION_LEVEL_LOG }o--|| DOU_DISTRIBUTION_LEVEL : "old/new level"
DOU_DISTRIBUTION_RELATION }o--|| DOU_DISTRIBUTION_RELATION : "parent -> child"
分享推广表设计
- 分享单表
- 分享单号、用户 ID、处理记录、处理时间、状态(待审核/驳回/通过)、创建时间
erDiagram
DOU_SHARE {
int id PK
varchar share_sn
mediumint user_id
text handle_record
datetime handled_at
tinyint status
datetime created_at
}
业务逻辑与数据模型映射
- 优惠券发放与使用
- 发放:写入日志表,更新主表已发量
- 使用:校验规则(门槛、范围、有效期、首单限制、叠加),写入日志表并绑定订单号
- 活动规则配置
- 通过主表的范围类型与值实现商品/类目/全站等范围控制
- 通过阈值与最大折扣控制优惠力度
- 分销佣金计算
- 基于等级表的比例计算直推与间推佣金
- 通过关系表确定推广链路,结合订单结算触发佣金入账
- 等级变更日志记录升级事件与触发条件
- 分享推广
- 分享单用于记录推广行为与审核流程,为后续转化归因提供基础
依赖关系分析
- 优惠券与订单:通过订单号在日志表中关联订单,形成核销闭环
- 分销与用户:通过关系表构建多级推广网络,支持直推与间推
- 分享与用户:通过分享单记录推广行为,便于后续统计与归因
graph LR
A["订单"] -- "order_sn" --> B["优惠券日志"]
B -- "coupon_id" --> C["优惠券主表"]
D["用户"] -- "user_id" --> E["分销申请"]
E -- "level_id" --> F["分销等级"]
G["用户"] -- "user_id" --> H["分销关系"]
I["用户"] -- "user_id" --> J["分享单"]
性能考虑
- 索引建议
- 优惠券日志:按 user_id、coupon_id、order_sn 建立索引,提升领取/使用查询与对账效率
- 分销关系:按 parent_user_id 建立索引,加速上级下级的查找与佣金计算
- 分销等级日志:按 user_id、order_sn 建立索引,便于等级变更与结算追溯
- 并发与一致性
- 优惠券总量与已发量更新需加锁或使用原子操作,避免超发
- 使用优惠券时进行幂等校验,防止重复核销
- 存储与归档
- 日志类表增长快,建议定期归档或分区,保持热数据表体积可控
- 查询优化
- 常用筛选字段(如状态、时间范围)应纳入复合索引
- 大范围扫描尽量使用覆盖索引减少回表
故障排查指南
- 优惠券无法使用
- 检查有效期、门槛、适用范围、是否首单限制、是否可叠加
- 核对日志中的使用时间与订单号是否正确
- 分销佣金异常
- 检查等级比例配置是否正确
- 确认分销关系链是否完整,是否存在断链或重复关系
- 查看等级变更日志,确认升级条件是否满足
- 分享推广未生效
- 检查分享单状态是否为通过
- 核对用户 ID 与分享单号的对应关系
结论
本设计文档基于现有 SQL 备份文件,梳理了优惠券、分销与分享推广的核心表结构与关系,明确了各表在营销活动中的职责与交互方式。通过合理的索引与并发控制策略,可保障高并发场景下的稳定性与准确性。建议在后续迭代中持续完善范围配置、风控策略与数据统计能力,以满足更复杂的营销需求。
附录
- 术语说明
- 直推:直接邀请的用户产生的交易
- 间推:间接邀请的用户(下级下级)产生的交易
- 叠加:多张优惠券同时使用的能力
- 扩展建议
- 增加风控字段:黑名单、风险评分、设备指纹等
- 增强统计:按日/周/月聚合的券使用率、分销转化率、分享 ROI 等指标表