团队模块包含以下核心数据表:
存储用户与其直接推荐人(直接上级)的关系,间接关系通过缓存或实时计算获取。该表是实现"直间推播种收获贡献百分比农作物收益"功能的基础。
CREATE TABLE `promotion_user_referrals` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`referrer_id` bigint(20) NOT NULL COMMENT '直接推荐人ID',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_user_id` (`user_id`),
KEY `idx_referrer_id` (`referrer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户直接推荐关系表';
注意:表中只存储直接推荐关系(直推),间接推荐关系(间推)通过递归查询或缓存获取。这种设计简化了数据结构,同时通过缓存机制保证了查询效率。
存储用户的达人等级信息,包括直推人数和团队总人数。
CREATE TABLE `promotion_user_talents` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`talent_level` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '达人等级:0无,1初级,2中级,3高级,4资深,5顶级',
`direct_count` int(11) NOT NULL DEFAULT '0' COMMENT '直推人数',
`promotion_count` int(11) NOT NULL DEFAULT '0' COMMENT '团队总人数',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_user_id` (`user_id`),
KEY `idx_talent_level` (`talent_level`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='达人等级表';
记录团队成员产生的分成收益,是实现"直间推播种收获贡献百分比农作物收益"功能的核心表。
CREATE TABLE `promotion_profits` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` bigint(20) NOT NULL COMMENT '获得收益的用户ID',
`promotion_member_id` bigint(20) NOT NULL COMMENT '团队成员ID',
`source_id` bigint(20) NOT NULL COMMENT '收益来源ID',
`source_type` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收益来源类型',
`item_id` bigint(20) NOT NULL COMMENT '物品ID',
`profit_amount` int(11) NOT NULL COMMENT '分成收益数量',
`profit_rate` decimal(5,4) NOT NULL COMMENT '分成比例',
`relation_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '关系类型:1直推,2间推',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_promotion_member_id` (`promotion_member_id`),
KEY `idx_source` (`source_type`,`source_id`),
KEY `idx_relation_type` (`relation_type`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='团队收益记录表';
注意:
relation_type字段用于区分直推和间推收益,便于统计和分析。source_type为'farm_harvest'时表示农场收获收益,是团队收益的主要来源。
存储用户的推荐码信息。
CREATE TABLE `promotion_referral_codes` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`code` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '推荐码',
`usage_count` int(11) NOT NULL DEFAULT '0' COMMENT '使用次数',
`status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '状态:1有效,0无效',
`expire_time` timestamp NULL DEFAULT NULL COMMENT '过期时间,NULL表示永不过期',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_code` (`code`),
UNIQUE KEY `idx_user_id` (`user_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='推荐码表';
存储不同达人等级的配置信息。
CREATE TABLE `promotion_talent_configs` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`level` tinyint(3) unsigned NOT NULL COMMENT '等级',
`name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '等级名称',
`direct_count_required` int(11) NOT NULL COMMENT '所需直推人数',
`promotion_count_required` int(11) NOT NULL COMMENT '所需团队总人数',
`profit_rate` decimal(5,4) NOT NULL COMMENT '间推分成比例',
`benefits` json DEFAULT NULL COMMENT '等级权益',
`icon` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '等级图标',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_level` (`level`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='达人等级配置表';
存储不同来源的收益分成规则。
CREATE TABLE `promotion_profit_rules` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`source_type` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '来源类型',
`direct_profit_rate` decimal(5,4) NOT NULL COMMENT '直推分成比例',
`max_indirect_level` int(11) NOT NULL DEFAULT '20' COMMENT '最大间推层级',
`status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '状态:1有效,0无效',
`rules` json DEFAULT NULL COMMENT '特殊规则',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_source_type` (`source_type`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='收益分成规则表';
记录用户推荐关系的修改历史。
CREATE TABLE `promotion_referral_changes` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`old_referrer_id` bigint(20) DEFAULT NULL COMMENT '旧推荐人ID',
`new_referrer_id` bigint(20) NOT NULL COMMENT '新推荐人ID',
`change_time` timestamp NOT NULL COMMENT '修改时间',
`change_reason` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '修改原因',
`changed_by` bigint(20) NOT NULL COMMENT '操作人ID',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_change_time` (`change_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='推荐关系修改记录表';
用户关系缓存表是一个统一的缓存表,用于存储用户之间的所有推荐关系(包括上下级关系)。通过合理设计字段和索引,一张表可以同时满足查询用户上级和下级的需求,减少数据冗余,简化维护。
CREATE TABLE `promotion_user_relation_cache` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`related_user_id` bigint(20) NOT NULL COMMENT '关联用户ID(上级)',
`level` tinyint(3) unsigned NOT NULL COMMENT '关系层级:1直接,2间接',
`path` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '关系路径,格式:1,2,3',
`depth` tinyint(3) unsigned NOT NULL COMMENT '层级深度,从1开始',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_user_relation` (`user_id`,`related_user_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_related_user_id` (`related_user_id`),
KEY `idx_level` (`level`),
KEY `idx_depth` (`depth`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户关系缓存表';
字段说明:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键ID |
| user_id | bigint | 用户ID(下级) |
| related_user_id | bigint | 关联用户ID(上级) |
| level | tinyint | 关系层级:1直接,2间接 |
| path | varchar | 关系路径,格式:1,2,3 |
| depth | tinyint | 层级深度,从1开始 |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
邀请奖励记录表用于记录用户邀请他人注册时获得的奖励,支持多种奖励类型和来源追踪。
CREATE TABLE `promotion_invite_rewards` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` bigint(20) NOT NULL COMMENT '获得奖励的用户ID',
`invited_user_id` bigint(20) NOT NULL COMMENT '被邀请的用户ID',
`reward_type` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '奖励类型:item=物品,coin=货币,exp=经验',
`reward_id` bigint(20) NOT NULL COMMENT '奖励ID(物品ID或货币类型ID)',
`reward_amount` int(11) NOT NULL COMMENT '奖励数量',
`reward_source` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'register' COMMENT '奖励来源:register=注册,upgrade=升级,task=任务',
`status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '状态:0=未发放,1=已发放,2=已过期',
`remark` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_invited_user_id` (`invited_user_id`),
KEY `idx_reward_type` (`reward_type`),
KEY `idx_reward_source` (`reward_source`),
KEY `idx_status` (`status`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='邀请奖励记录表';
字段说明:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键ID |
| user_id | bigint | 获得奖励的用户ID |
| invited_user_id | bigint | 被邀请的用户ID |
| reward_type | varchar | 奖励类型:item=物品,coin=货币,exp=经验 |
| reward_id | bigint | 奖励ID(物品ID或货币类型ID) |
| reward_amount | int | 奖励数量 |
| reward_source | varchar | 奖励来源:register=注册,upgrade=升级,task=任务 |
| status | tinyint | 状态:0=未发放,1=已发放,2=已过期 |
| remark | varchar | 备注 |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
示例数据:
id | user_id | invited_user_id | reward_type | reward_id | reward_amount | reward_source | status | created_at
---|---------|----------------|------------|-----------|--------------|--------------|--------|------------
1 | 1 | 2 | item | 1001 | 5 | register | 1 | 2023-05-01 10:00:00
2 | 1 | 3 | coin | 1 | 100 | register | 1 | 2023-05-02 11:00:00
3 | 2 | 4 | exp | 0 | 50 | register | 1 | 2023-05-03 12:00:00
4 | 1 | 2 | item | 1002 | 1 | upgrade | 1 | 2023-05-10 10:00:00
在上面的示例中:
邀请码使用记录表用于详细记录每次邀请码的使用情况,包括谁使用了哪个邀请码、何时使用、使用结果等信息。
CREATE TABLE `promotion_referral_code_usages` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`code` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '使用的邀请码',
`code_owner_id` bigint(20) NOT NULL COMMENT '邀请码所有者用户ID',
`user_id` bigint(20) NOT NULL COMMENT '使用邀请码的用户ID',
`ip_address` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '使用时的IP地址',
`user_agent` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '使用时的用户代理',
`status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '状态:0=失败,1=成功,2=已撤销',
`result` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '使用结果描述',
`remark` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_code` (`code`),
KEY `idx_code_owner_id` (`code_owner_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_status` (`status`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='邀请码使用记录表';
字段说明:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键ID |
| code | varchar | 使用的邀请码 |
| code_owner_id | bigint | 邀请码所有者用户ID |
| user_id | bigint | 使用邀请码的用户ID |
| ip_address | varchar | 使用时的IP地址 |
| user_agent | varchar | 使用时的用户代理 |
| status | tinyint | 状态:0=失败,1=成功,2=已撤销 |
| result | varchar | 使用结果描述 |
| remark | varchar | 备注 |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
示例数据:
id | code | code_owner_id | user_id | ip_address | status | result | created_at
---|----------|--------------|---------|---------------|--------|----------------------|------------
1 | ABC123 | 1 | 2 | 192.168.1.1 | 1 | 注册成功 | 2023-05-01 10:00:00
2 | DEF456 | 3 | 4 | 192.168.1.2 | 1 | 注册成功 | 2023-05-02 11:00:00
3 | ABC123 | 1 | 5 | 192.168.1.3 | 0 | 邀请码已过期 | 2023-05-03 12:00:00
4 | GHI789 | 6 | 7 | 192.168.1.4 | 2 | 管理员撤销 | 2023-05-04 13:00:00
在上面的示例中:
查询用户4的所有上级:
SELECT * FROM promotion_user_relation_cache WHERE user_id = 4;
查询用户1的所有下级:
SELECT * FROM promotion_user_relation_cache WHERE related_user_id = 1;
查询用户2的直接下级:
SELECT u.* FROM users u
JOIN promotion_user_relation_cache r ON u.id = r.user_id
WHERE r.related_user_id = 2 AND r.level = 1;
查询用户1的第2代下级:
SELECT u.* FROM users u
JOIN promotion_user_relation_cache r ON u.id = r.user_id
WHERE r.related_user_id = 1 AND r.depth = 2;
注意:该表是缓存表,其数据可以通过
promotion_user_referrals表重新计算生成。使用单一表存储所有关系,减少了数据冗余,简化了维护,同时通过合理的索引设计,保证了查询效率。
┌───────────────────┐
│promotion_talent_configs│
└─────────┬─────────┘
│
▼
┌───────────────────┐ ┌───────────────────┐
│promotion_user_referrals│◄───────────┤ promotion_user_talents │
└─────────┬─────────┘ └─────────┬─────────┘
│ │
│ │
├─────────────┐ │
│ │ │
▼ ▼ │
┌───────────────────┐ ┌───────────────────┐│
│promotion_referral_codes│ │promotion_user_relation_cache│
└───────────────────┘ └───────────────────┘│
│
│
▼
┌───────────────────┐
│ promotion_profits │
└─────────┬─────────┘
│
│
▼
┌───────────────────┐
│ promotion_profit_rules │
└───────────────────┘
所有表都使用自增的id字段作为主键。
promotion_user_referrals: user_id(确保每个用户只有一个直接推荐人)promotion_user_talents: user_id(确保每个用户只有一条达人记录)promotion_referral_codes: code(确保推荐码唯一)promotion_referral_codes: user_id(确保每个用户只有一个推荐码)promotion_talent_configs: level(确保等级唯一)promotion_profit_rules: source_type(确保来源类型唯一)promotion_user_relation_cache: user_id,related_user_id(确保用户与上级的关系唯一)promotion_user_referrals: referrer_idpromotion_user_talents: talent_levelpromotion_profits: user_id, promotion_member_id, source_type,source_id, created_atpromotion_referral_codes: statuspromotion_profit_rules: statuspromotion_referral_changes: user_id, change_timepromotion_user_relation_cache: user_id, related_user_id, level, depth(支持各种查询场景)promotion_invite_rewards: user_id, invited_user_id, reward_type, reward_source, status, created_at(支持多种查询和统计场景)promotion_referral_code_usages: code, code_owner_id, user_id, status, created_at(支持邀请码使用记录的多种查询场景){
"farm_output_bonus": 0.05,
"daily_gift": {
"item_id": 1001,
"amount": 1
},
"special_privileges": [
"vip_customer_service",
"exclusive_avatar_frame"
]
}
{
"min_amount": 10,
"max_amount": 1000,
"excluded_items": [1001, 1002],
"special_rates": [
{"talent_level": 5, "bonus_rate": 0.01}
]
}
初始化5级达人的配置数据:
INSERT INTO `promotion_talent_configs` (`level`, `name`, `direct_count_required`, `promotion_count_required`, `profit_rate`, `benefits`) VALUES
(1, '初级达人', 5, 10, 0.0100, '{"farm_output_bonus": 0.01}'),
(2, '中级达人', 10, 30, 0.0150, '{"farm_output_bonus": 0.02}'),
(3, '高级达人', 20, 50, 0.0200, '{"farm_output_bonus": 0.03, "daily_gift": {"item_id": 1001, "amount": 1}}'),
(4, '资深达人', 30, 100, 0.0250, '{"farm_output_bonus": 0.04, "daily_gift": {"item_id": 1001, "amount": 2}}'),
(5, '顶级达人', 50, 200, 0.0300, '{"farm_output_bonus": 0.05, "daily_gift": {"item_id": 1001, "amount": 3}, "special_privileges": ["vip_customer_service", "exclusive_avatar_frame"]}');
初始化基本的收益分成规则:
INSERT INTO `promotion_profit_rules` (`source_type`, `direct_profit_rate`, `max_indirect_level`, `status`, `rules`) VALUES
('farm_harvest', 0.0500, 20, 1, '{"min_amount": 10, "max_amount": 1000}'),
('task_complete', 0.0300, 10, 1, '{"min_amount": 5, "max_amount": 500}'),
('item_sell', 0.0200, 5, 1, '{"min_amount": 1, "max_amount": 100, "excluded_items": [1001, 1002]}');
新用户注册时,需要:
定期备份关键数据表,特别是推荐关系表和达人等级表。
当用户数量增长到一定规模时,可以考虑按用户ID范围对promotion_user_referrals和promotion_profits表进行分表。
promotion_user_relation_cache)持久化存储用户的上下级关系使用批量插入和更新操作处理大量数据,如批量更新达人等级。
对敏感数据进行加密存储,如推荐码的生成算法。
严格控制数据访问权限,确保用户只能访问自己的团队数据。
记录关键操作的日志,如达人等级变更、推荐关系建立等。
团队模块的数据库设计采用关系型数据库,通过合理的表结构设计和索引优化,支持用户推荐关系、达人等级和团队收益分成等核心功能。设计注重数据完整性、查询效率和可扩展性,能够满足大规模用户场景下的性能需求。
本设计采用只存储直接推荐关系 + 缓存策略的方案,在保持较高查询效率的同时,大幅减少了存储空间,并提高了推荐关系修改的灵活性。通过缓存机制优化了查询性能,同时保持了数据的一致性。
通过JSON字段存储复杂配置,提供了灵活的扩展能力,同时通过合理的数据维护策略确保系统长期稳定运行。推荐关系修改记录表的设计,支持了用户推荐关系的可变更性,同时保留了完整的修改历史,便于审计和追踪。