DeepSeek幫我設計的會員模塊
🏷️ 会员模块数据库设计文档
支持多商户·多门店·实物卡·储值消费·积分体系·余额重算 · MySQL 8.0+
📅 版本:v3.0 (多商户版)📁 数据库:MySQL 8.0🧩 字符集:utf8mb4📐 金额精度:分 (BIGINT)📋 表数量:10 张🏢 支持:多商户 + 多门店
📖 概述
本数据库设计面向多商户多门店会员卡管理系统,支持实物卡(芯片ID)与无卡消费(手机号)两种场景。 核心能力包括:储值充值、折扣消费、积分累积与兑换、余额变动全链路日志、余额重算机制,以及多商户/门店数据隔离。 设计时已预留计次卡扩展能力。
🏢 多商户多门店支持:所有会员表已增加fk_company_id和fk_store_id字段,实现数据隔离。 每个商户/门店可独立配置积分规则、折扣比例、充值策略等。
🔗 实体关系图 (ER)
╔═══════════════════════════════════════════════════════════════════════════════════════════════════════╗ ║ 📦 多商户会员系统 ER 图 ║ ╠═══════════════════════════════════════════════════════════════════════════════════════════════════════╣ ║ ║ ║ ┌─────────────────────────────┐ ┌─────────────────────────────────┐ ║ ║ │ sauna_merchant │ │ sauna_merchant_store │ ║ ║ │ (商户公司表-已有) │ │ (门店表-已有) │ ║ ║ │─────────────────────────────│ │─────────────────────────────────│ ║ ║ │ key_id (PK) │◄─────────│ fk_company_id (FK) │ ║ ║ │ company_fullname │ 1 n │ key_id (PK) │ ║ ║ │ company_shortname │ │ name │ ║ ║ └─────────────────────────────┘ └─────────────────────────────────┘ ║ ║ │ │ ║ ║ │ 1 │ 1 ║ ║ ├───────────────────────┬──────────────────┘ ║ ║ │ │ ║ ║ ▼ ▼ ║ ║ ┌──────────────────────────────────────────────────────────────────────────────┐ ║ ║ │ member_card (会员卡主表) │ ║ ║ │──────────────────────────────────────────────────────────────────────────────│ ║ ║ │ key_id (PK) │ card_no (UK) │ chip_id (UK) │ phone (idx) │ ║ ║ │ fk_company_id (FK) │ fk_store_id (FK) │ status │ card_type │ ║ ║ │ current_principal │ current_gift │ current_points │ discount_rate │ ║ ║ └──────────────────────────────────────────────────────────────────────────────┘ ║ ║ │ ║ ║ │ 1 ║ ║ ├─────────────────────────────────────────────────────────────────┐ ║ ║ │ │ ║ ║ ▼ ▼ ║ ║ ┌─────────────────────────┐ ┌─────────────────────────────────────┐ ║ ║ │ member_recharge │ │ member_consume │ ║ ║ │ (充值记录表) │ │ (消费明细表) │ ║ ║ │─────────────────────────│ │─────────────────────────────────────│ ║ ║ │ key_id (PK) │ │ key_id (PK) │ ║ ║ │ card_key_id (FK) │ │ card_key_id (FK) │ ║ ║ │ recharge_no (UK) │ │ consume_no (UK) │ ║ ║ │ amount, gift_amount │ │ principal_amount, gift_amount │ ║ ║ └─────────────────────────┘ └─────────────────────────────────────┘ ║ ║ │ │ ║ ║ └───────────────────┬───────────────────┘ ║ ║ │ ║ ║ ▼ ║ ║ ┌─────────────────────────────────────────────────────────────────────────────┐ ║ ║ │ member_balance_log (余额变动日志-核心) │ ║ ║ │─────────────────────────────────────────────────────────────────────────────│ ║ ║ │ key_id (PK) │ card_key_id (FK) │ log_no (UK) │ change_type │ ║ ║ │ before_principal │ after_principal │ before_gift │ after_gift │ ║ ║ │ is_recalculated │ source_type │ source_id │ ║ ║ └─────────────────────────────────────────────────────────────────────────────┘ ║ ║ ║ ║ ┌─────────────────────────┐ ┌─────────────────────────────────────┐ ║ ║ │ member_points_exchange │ │ member_balance_recalc │ ║ ║ │ (积分兑换记录表) │ │ (余额重算记录表) │ ║ ║ │─────────────────────────│ │─────────────────────────────────────│ ║ ║ │ key_id (PK) │ │ key_id (PK) │ ║ ║ │ card_key_id (FK) │ │ card_key_id (FK) │ ║ ║ │ points_used │ │ old_principal, new_principal │ ║ ║ │ exchange_type │ │ diff_principal, diff_gift │ ║ ║ └─────────────────────────┘ └─────────────────────────────────────┘ ║ ║ ║ ║ ┌─────────────────────────────┐ ┌─────────────────────────────────┐ ║ ║ │ member_merchant_config │ │ member_operation_log │ ║ ║ │ (商户配置-新增) │ │ (操作审计日志-新增) │ ║ ║ │─────────────────────────────│ │─────────────────────────────────│ ║ ║ │ key_id (PK) │ │ key_id (PK) │ ║ ║ │ fk_company_id (FK) │ │ card_key_id (FK) │ ║ ║ │ fk_store_id (FK) │ │ operation_type │ ║ ║ │ gift_consume_ratio │ │ before_data, after_data │ ║ ║ │ points_rate │ │ ip_address, user_agent │ ║ ║ └─────────────────────────────┘ └─────────────────────────────────┘ ║ ║ ║ ║ ┌─────────────────────────────────────────────────────────────────────────────┐ ║ ║ │ system_consume_config (系统配置) │ ║ ║ │ config_key (UK) │ config_value │ description │ ║ ║ └─────────────────────────────────────────────────────────────────────────────┘ ║ ║ ║ ╚═══════════════════════════════════════════════════════════════════════════════════════════════════════╝
🆕 本次新增/变更:
- 新增
fk_company_id、fk_store_id字段到所有会员表 - 新增
member_merchant_config表 - 商户/门店级别配置 - 新增
member_operation_log表 - 操作审计日志 - 统一所有表增加公用字段:
key_id、sort_index、create_by、create_time、update_by、update_time - 新增
v_member_card_full视图 - 关联商户门店信息
📋 表结构详细设计
1. member_card会员卡主表
| 字段 | 类型 | 空 | 键 | 说明 |
|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | PK | 自增主键 |
| key_id | VARCHAR(50) | NO | UK | 业务主键ID |
| fk_company_id | VARCHAR(50) | NO | FK | 🏢 所属公司ID |
| fk_store_id | VARCHAR(50) | NO | FK | 🏪 所属门店ID |
| card_no | VARCHAR(20) | NO | UK | 会员卡编号(自编号) |
| chip_id | VARCHAR(32) | NO | UK | 芯片ID唯一码(实物卡) |
| phone | VARCHAR(11) | NO | INDEX | 绑定手机号(无卡消费) |
| card_type | TINYINT | NO | - | 1-储值卡,2-计次卡(预留) |
| status | TINYINT | NO | INDEX | 0-冻结,1-正常,2-挂失,3-注销 |
| total_recharge | BIGINT | NO | - | 累计充值金额(不含赠送,分) |
| total_gift | BIGINT | NO | - | 累计赠送金额(分) |
| total_consume | BIGINT | NO | - | 累计消费本金(分) |
| total_gift_consume | BIGINT | NO | - | 累计赠送消费(分) |
| current_balance | BIGINT | NO | - | 当前可用总余额(本金+赠送) |
| current_principal | BIGINT | NO | - | 当前本金余额 |
| current_gift | BIGINT | NO | - | 当前赠送余额 |
| total_points | INT | NO | - | 累计获得积分 |
| used_points | INT | NO | - | 已使用积分 |
| current_points | INT | NO | - | 当前可用积分 |
| discount_rate | DECIMAL(5,2) | NO | - | 折扣比例(100=不打折,90=9折) |
| open_date | DATETIME | NO | - | 开卡日期 |
| expire_date | DATETIME | YES | - | 有效期(计次卡使用) |
| last_consume_time | DATETIME | YES | - | 最后消费时间 |
| sort_index | INT | YES | - | 排序码 |
| create_by | VARCHAR(50) | YES | - | 创建人 |
| create_time | DATETIME | NO | INDEX | 创建时间 |
| update_by | VARCHAR(50) | YES | - | 修改人 |
| update_time | DATETIME | NO | - | 修改时间 |
🏢 多商户关键字段:fk_company_id和fk_store_id实现数据隔离, 查询时务必带上这两个条件,确保不同商户/门店数据互不干扰。
2. member_recharge开卡/充值记录表
| 字段 | 类型 | 空 | 键 | 说明 |
|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | PK | 自增主键 |
| key_id | VARCHAR(50) | NO | UK | 业务主键ID |
| card_id | BIGINT UNSIGNED | NO | FK | 会员卡自增ID |
| card_key_id | VARCHAR(50) | NO | FK | 会员卡业务ID |
| recharge_no | VARCHAR(32) | NO | UK | 充值流水号 |
| recharge_type | TINYINT | NO | - | 1-开卡,2-充值,3-赠送活动,4-手动调账 |
| amount | BIGINT | NO | - | 充值金额(本金,分) |
| gift_amount | BIGINT | NO | - | 赠送金额(分) |
| pay_method | TINYINT | YES | - | 1-现金,2-微信,3-支付宝,4-银行卡 |
| operator_id | VARCHAR(50) | YES | - | 操作人员ID |
| remark | VARCHAR(255) | YES | - | 备注 |
| recharge_time | DATETIME | NO | INDEX | 充值时间 |
| sort_index | INT | YES | - | 排序码 |
| create_by | VARCHAR(50) | YES | - | 创建人 |
| create_time | DATETIME | NO | INDEX | 创建时间 |
| update_by | VARCHAR(50) | YES | - | 修改人 |
| update_time | DATETIME | NO | - | 修改时间 |
3. member_consume消费明细表
| 字段 | 类型 | 空 | 键 | 说明 |
|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | PK | 自增主键 |
| key_id | VARCHAR(50) | NO | UK | 业务主键ID |
| card_id | BIGINT UNSIGNED | NO | FK | 会员卡自增ID |
| card_key_id | VARCHAR(50) | NO | FK | 会员卡业务ID |
| consume_no | VARCHAR(32) | NO | UK | 消费流水号 |
| order_id | VARCHAR(32) | YES | INDEX | 关联订单号 |
| total_amount | BIGINT | NO | - | 消费总金额(原始金额,分) |
| actual_amount | BIGINT | NO | - | 实际扣款金额(折扣后) |
| principal_amount | BIGINT | NO | - | 扣本金金额 |
| gift_amount | BIGINT | NO | - | 扣赠送金额 |
| discount_amount | BIGINT | NO | - | 优惠金额 |
| earned_points | INT | NO | - | 获得积分 |
| consume_time | DATETIME | NO | INDEX | 消费时间 |
| operator_id | VARCHAR(50) | YES | - | 操作人员ID |
| remark | VARCHAR(255) | YES | - | 备注 |
| sort_index | INT | YES | - | 排序码 |
| create_by | VARCHAR(50) | YES | - | 创建人 |
| create_time | DATETIME | NO | INDEX | 创建时间 |
| update_by | VARCHAR(50) | YES | - | 修改人 |
| update_time | DATETIME | NO | - | 修改时间 |
4. member_balance_log⭐ 余额变动日志表(核心)
| 字段 | 类型 | 空 | 键 | 说明 |
|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | PK | 自增主键 |
| key_id | VARCHAR(50) | NO | UK | 业务主键ID |
| card_id | BIGINT UNSIGNED | NO | FK | 会员卡自增ID |
| card_key_id | VARCHAR(50) | NO | FK | 会员卡业务ID |
| log_no | VARCHAR(32) | NO | UK | 日志流水号 |
| change_type | TINYINT | NO | - | 1-开卡,2-充值,3-消费,4-退款,5-手动调整,6-积分兑换,7-余额重算修正 |
| change_amount | BIGINT | NO | - | 变动金额(正数增加,负数减少,分) |
| before_principal | BIGINT | NO | - | 变动前本金余额 |
| after_principal | BIGINT | NO | - | 变动后本金余额 |
| before_gift | BIGINT | NO | - | 变动前赠送余额 |
| after_gift | BIGINT | NO | - | 变动后赠送余额 |
| before_total | BIGINT | NO | - | 变动前总余额 |
| after_total | BIGINT | NO | - | 变动后总余额 |
| source_type | VARCHAR(30) | YES | INDEX | 来源类型:recharge/consume/refund/adjust |
| source_id | VARCHAR(50) | YES | INDEX | 来源表KeyId |
| operator_id | VARCHAR(50) | YES | - | 操作人ID |
| remark | VARCHAR(255) | YES | - | 备注 |
| is_recalculated | TINYINT | NO | - | 是否被重算修正:0-否,1-是 |
| sort_index | INT | YES | - | 排序码 |
| create_by | VARCHAR(50) | YES | - | 创建人 |
| create_time | DATETIME | NO | INDEX | 创建时间 |
| update_by | VARCHAR(50) | YES | - | 修改人 |
| update_time | DATETIME | NO | - | 修改时间 |
5. member_points_exchange积分兑换记录表
| 字段 | 类型 | 空 | 键 | 说明 |
|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | PK | 自增主键 |
| key_id | VARCHAR(50) | NO | UK | 业务主键ID |
| card_id | BIGINT UNSIGNED | NO | FK | 会员卡自增ID |
| card_key_id | VARCHAR(50) | NO | FK | 会员卡业务ID |
| exchange_no | VARCHAR(32) | NO | UK | 兑换流水号 |
| points_used | INT | NO | - | 使用的积分 |
| exchange_type | TINYINT | NO | - | 1-抵现,2-兑换礼品,3-兑换优惠券 |
| exchange_value | BIGINT | NO | - | 兑换价值(抵现金额或礼品价值,分) |
| consume_id | BIGINT UNSIGNED | YES | - | 关联消费自增ID |
| consume_key_id | VARCHAR(50) | YES | - | 关联消费业务ID |
| status | TINYINT | NO | - | 1-成功,2-取消,3-失效 |
| exchange_time | DATETIME | NO | INDEX | 兑换时间 |
| operator_id | VARCHAR(50) | YES | - | 操作人ID |
| remark | VARCHAR(255) | YES | - | 备注 |
| sort_index | INT | YES | - | 排序码 |
| create_by | VARCHAR(50) | YES | - | 创建人 |
| create_time | DATETIME | NO | INDEX | 创建时间 |
| update_by | VARCHAR(50) | YES | - | 修改人 |
| update_time | DATETIME | NO | - | 修改时间 |
6. member_balance_recalc余额重算记录表(审计)
| 字段 | 类型 | 空 | 键 | 说明 |
|---|---|---|---|---|
| id | BIGINT UNSIGNED | NO | PK | 自增主键 |
| key_id | VARCHAR(50) | NO | UK | 业务主键ID |
| card_id | BIGINT UNSIGNED | NO | FK | 会员卡自增ID |
| card_key_id | VARCHAR(50) | NO | FK | 会员卡业务ID |
| recalc_no | VARCHAR(32) | NO | UK | 重算流水号 |
| old_principal | BIGINT | NO | - | 重算前本金余额 |
| new_principal | BIGINT | NO | - | 重算后本金余额 |
| old_gift | BIGINT | NO | - | 重算前赠送余额 |
| new_gift | BIGINT | NO | - | 重算后赠送余额 |
| old_total | BIGINT | NO | - | 重算前总余额 |
| new_total | BIGINT | NO | - | 重算后总余额 |
| diff_principal | BIGINT | NO | - | 本金差异 |
| diff_gift | BIGINT | NO | - | 赠送差异 |
| recalc_reason | VARCHAR(255) | NO | - | 重算原因 |
| operator_id | VARCHAR(50) | NO | - | 操作人ID |
| recalc_time | DATETIME | NO | INDEX | 重算时间 |
| sort_index | INT | YES | - | 排序码 |
| create_by | VARCHAR(50) | YES | - | 创建人 |
| create_time | DATETIME | NO | INDEX | 创建时间 |
| update_by | VARCHAR(50) | YES | - | 修改人 |
| update_time | DATETIME | NO | - | 修改时间 |
