数据库设计.md 26 KB

团队模块数据库设计

1. 数据库表概览

团队模块包含以下核心数据表:

  1. promotion_user_referrals - 用户推荐关系表
  2. promotion_user_talents - 达人等级表
  3. promotion_profits - 团队收益记录表
  4. promotion_referral_codes - 推荐码表
  5. promotion_talent_configs - 达人等级配置表
  6. promotion_profit_rules - 收益分成规则表
  7. promotion_referral_changes - 推荐关系修改记录表
  8. promotion_user_relation_cache - 用户关系缓存表
  9. promotion_invite_rewards - 邀请奖励记录表
  10. promotion_referral_code_usages - 邀请码使用记录表

2. 表结构详细设计

2.1 用户推荐关系表 (promotion_user_referrals)

存储用户与其直接推荐人(直接上级)的关系,间接关系通过缓存或实时计算获取。该表是实现"直间推播种收获贡献百分比农作物收益"功能的基础。

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='用户直接推荐关系表';

注意:表中只存储直接推荐关系(直推),间接推荐关系(间推)通过递归查询或缓存获取。这种设计简化了数据结构,同时通过缓存机制保证了查询效率。

2.2 达人等级表 (promotion_user_talents)

存储用户的达人等级信息,包括直推人数和团队总人数。

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='达人等级表';

2.3 团队收益记录表 (promotion_profits)

记录团队成员产生的分成收益,是实现"直间推播种收获贡献百分比农作物收益"功能的核心表。

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'时表示农场收获收益,是团队收益的主要来源。

2.4 推荐码表 (promotion_referral_codes)

存储用户的推荐码信息。

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='推荐码表';

2.5 达人等级配置表 (promotion_talent_configs)

存储不同达人等级的配置信息。

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='达人等级配置表';

2.6 收益分成规则表 (promotion_profit_rules)

存储不同来源的收益分成规则。

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='收益分成规则表';

2.7 推荐关系修改记录表 (promotion_referral_changes)

记录用户推荐关系的修改历史。

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='推荐关系修改记录表';

2.8 用户关系缓存表 (promotion_user_relation_cache)

用户关系缓存表是一个统一的缓存表,用于存储用户之间的所有推荐关系(包括上下级关系)。通过合理设计字段和索引,一张表可以同时满足查询用户上级和下级的需求,减少数据冗余,简化维护。

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 更新时间

2.9 邀请奖励记录表 (promotion_invite_rewards)

邀请奖励记录表用于记录用户邀请他人注册时获得的奖励,支持多种奖励类型和来源追踪。

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

在上面的示例中:

  • 用户1邀请用户2注册,获得了5个ID为1001的物品奖励
  • 用户1邀请用户3注册,获得了100个ID为1的货币奖励
  • 用户2邀请用户4注册,获得了50点经验值奖励
  • 当用户2升级时,用户1获得了1个ID为1002的物品奖励

2.10 邀请码使用记录表 (promotion_referral_code_usages)

邀请码使用记录表用于详细记录每次邀请码的使用情况,包括谁使用了哪个邀请码、何时使用、使用结果等信息。

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

在上面的示例中:

  • 用户2成功使用了用户1的邀请码ABC123注册
  • 用户4成功使用了用户3的邀请码DEF456注册
  • 用户5尝试使用用户1的邀请码ABC123,但失败了,原因是邀请码已过期
  • 用户7使用了用户6的邀请码GHI789,但后来被管理员撤销了
  1. 查询用户4的所有上级:

    SELECT * FROM promotion_user_relation_cache WHERE user_id = 4;
    
  2. 查询用户1的所有下级:

    SELECT * FROM promotion_user_relation_cache WHERE related_user_id = 1;
    
  3. 查询用户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;
    
  4. 查询用户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表重新计算生成。使用单一表存储所有关系,减少了数据冗余,简化了维护,同时通过合理的索引设计,保证了查询效率。

3. 数据关系

3.1 主要关系图

                                    ┌───────────────────┐
                                    │promotion_talent_configs│
                                    └─────────┬─────────┘
                                              │
                                              ▼
┌───────────────────┐            ┌───────────────────┐
│promotion_user_referrals│◄───────────┤ promotion_user_talents │
└─────────┬─────────┘            └─────────┬─────────┘
          │                                 │
          │                                 │
          ├─────────────┐                   │
          │             │                   │
          ▼             ▼                   │
┌───────────────────┐  ┌───────────────────┐│
│promotion_referral_codes│  │promotion_user_relation_cache│
└───────────────────┘  └───────────────────┘│
                                            │
                                            │
                                            ▼
                                  ┌───────────────────┐
                                  │   promotion_profits    │
                                  └─────────┬─────────┘
                                            │
                                            │
                                            ▼
                                  ┌───────────────────┐
                                  │ promotion_profit_rules │
                                  └───────────────────┘

3.2 关系说明

  1. 用户与推荐关系:一个用户只有一个直接推荐人,但可以有多个被推荐人(1:N)
  2. 用户与达人等级:一个用户有一个达人等级记录(1:1)
  3. 用户与推荐码:一个用户有一个推荐码(1:1)
  4. 达人等级与配置:用户达人等级对应配置表中的等级(N:1)
  5. 用户与收益记录:一个用户可以有多条收益记录(1:N)
  6. 收益记录与规则:收益记录根据来源类型对应不同的分成规则(N:1)
  7. 用户与推荐关系修改:一个用户可以有多条推荐关系修改记录(1:N)
  8. 用户与关系缓存:一个用户可以有多条关系缓存记录,包括与其上级和下级的关系(1:N)
  9. 推荐关系与关系缓存:推荐关系表中的直接关系是关系缓存表的数据来源,关系缓存表通过计算扩展为完整的上下级关系网络
  10. 用户与邀请奖励:一个用户可以有多条邀请奖励记录(1:N)
  11. 被邀请用户与邀请奖励:一个被邀请用户可以关联多条邀请奖励记录(1:N),例如注册奖励和升级奖励
  12. 推荐码与使用记录:一个推荐码可以有多条使用记录(1:N)
  13. 用户与邀请码使用:一个用户可以使用多个邀请码(1:N),但每个邀请码只能被一个用户成功使用
  14. 邀请码所有者与使用记录:一个邀请码所有者可以有多条邀请码被使用的记录(1:N)

4. 索引设计

4.1 主键索引

所有表都使用自增的id字段作为主键。

4.2 唯一索引

  • 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(确保用户与上级的关系唯一)

4.3 普通索引

  • promotion_user_referrals: referrer_id
  • promotion_user_talents: talent_level
  • promotion_profits: user_id, promotion_member_id, source_type,source_id, created_at
  • promotion_referral_codes: status
  • promotion_profit_rules: status
  • promotion_referral_changes: user_id, change_time
  • promotion_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(支持邀请码使用记录的多种查询场景)

5. JSON字段结构

5.1 达人等级权益JSON (benefits)

{
  "farm_output_bonus": 0.05,
  "daily_gift": {
    "item_id": 1001,
    "amount": 1
  },
  "special_privileges": [
    "vip_customer_service",
    "exclusive_avatar_frame"
  ]
}

5.2 收益分成特殊规则JSON (rules)

{
  "min_amount": 10,
  "max_amount": 1000,
  "excluded_items": [1001, 1002],
  "special_rates": [
    {"talent_level": 5, "bonus_rate": 0.01}
  ]
}

6. 数据初始化

6.1 达人等级配置数据

初始化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"]}');

6.2 收益分成规则数据

初始化基本的收益分成规则:

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]}');

6.3 新用户初始化

新用户注册时,需要:

  1. 创建用户达人记录,设置达人等级为0
  2. 生成用户专属推荐码
  3. 如有推荐人,建立推荐关系

7. 数据维护

7.1 定期任务

  1. 达人等级更新:定期检查和更新用户的达人等级
  2. 推荐码清理:定期清理过期或无效的推荐码
  3. 收益统计:定期统计和汇总团队收益数据

7.2 数据清理

  1. 收益记录归档:定期归档过旧的收益记录
  2. 无效关系清理:清理已注销用户的推荐关系

7.3 数据备份

定期备份关键数据表,特别是推荐关系表和达人等级表。

8. 性能优化

8.1 分表策略

当用户数量增长到一定规模时,可以考虑按用户ID范围对promotion_user_referralspromotion_profits表进行分表。

8.2 缓存策略

  1. 缓存达人等级配置和分成规则等静态数据
  2. 缓存用户的推荐关系和达人信息等频繁访问的数据
  3. 使用Redis缓存用户的所有上级(包括直接和间接)
  4. 使用Redis缓存用户的所有下级(包括直接和间接)
  5. 使用数据库缓存表(promotion_user_relation_cache)持久化存储用户的上下级关系
  6. 设置合理的缓存过期时间,如1天
  7. 推荐关系变更时主动更新相关缓存和缓存表
  8. 定期校验和修复缓存表数据,确保与实际推荐关系一致

8.3 批量操作

使用批量插入和更新操作处理大量数据,如批量更新达人等级。

9. 安全考虑

9.1 数据加密

对敏感数据进行加密存储,如推荐码的生成算法。

9.2 访问控制

严格控制数据访问权限,确保用户只能访问自己的团队数据。

9.3 操作日志

记录关键操作的日志,如达人等级变更、推荐关系建立等。

10. 总结

团队模块的数据库设计采用关系型数据库,通过合理的表结构设计和索引优化,支持用户推荐关系、达人等级和团队收益分成等核心功能。设计注重数据完整性、查询效率和可扩展性,能够满足大规模用户场景下的性能需求。

本设计采用只存储直接推荐关系 + 缓存策略的方案,在保持较高查询效率的同时,大幅减少了存储空间,并提高了推荐关系修改的灵活性。通过缓存机制优化了查询性能,同时保持了数据的一致性。

通过JSON字段存储复杂配置,提供了灵活的扩展能力,同时通过合理的数据维护策略确保系统长期稳定运行。推荐关系修改记录表的设计,支持了用户推荐关系的可变更性,同时保留了完整的修改历史,便于审计和追踪。