BeeX ID 设计方案

v1.0 · 2026-06-24 · 面向产品 / 后端 / 前端 / 运营 / 测试
核心结论

BeeX 的用户 ID 不是为“多个国家混在一个库”设计的。

BeeX 的基础架构是 国家级数据中心隔离:印尼、马来、菲律宾等国家分别使用独立部署、独立数据库、独立平台账号和独立运营配置。用户 ID 的主要目标,是在单国家数据中心内部提供一个稳定、不可枚举、便于排查、适合未来单国家内扩容的外部业务标识。

一、国家隔离前提

必须写进架构共识 BeeX 不做全球混库。不同国家不是同一个数据库里的不同 country_code 数据,而是不同数据中心、不同数据库、不同服务配置。
维度设计原则说明
国家物理隔离ID / MY / PH 等国家分别部署,不共享生产数据库。
环境测试 / 正式隔离id-testid-prod 是不同环境,不允许混用资金、订单、三方账号。
外部业务 ID国家内唯一即可印尼用户 ID 与马来用户 ID 不需要在业务上互相查重,因为数据中心不会混在一起。
数据汇总按分析链路处理如果未来做集团 BI,可在数据仓库里用 country + user_id 组合标识。
图 1 · 国家隔离与 ID 使用边界
flowchart LR
  subgraph ID["Indonesia 数据中心"]
    ID_API["api-id"]
    ID_DB[("beex_id_prod")]
    ID_U["usr_xxx"]
    ID_API --> ID_DB
    ID_U --> ID_DB
  end
  subgraph MY["Malaysia 数据中心"]
    MY_API["api-my"]
    MY_DB[("beex_my_prod")]
    MY_U["usr_xxx"]
    MY_API --> MY_DB
    MY_U --> MY_DB
  end
  subgraph BI["未来 BI / 集团报表"]
    KEY["country_code + user_id"]
  end
  ID_DB -.汇总.-> BI
  MY_DB -.汇总.-> BI
        

二、为什么不用数据库自增 ID 对外暴露

数据库内部可以有自增主键,但 API、日志、飞书通知、App、H5、三方回调里不应该直接暴露自增 ID。原因不是跨国混库,而是安全、稳定和可维护。

1. 防止枚举和推测规模

如果用户 ID 是 1210086,别人很容易猜测用户量,也更容易批量遍历接口。随机业务 ID 能降低这类风险。

2. 外部稳定,内部可迁移

数据库表结构、主键策略、归档策略可以变化,但外部看到的 usr_... 不变。迁移或拆表时不用让 App / H5 / 三方系统跟着改。

3. 日志里一眼看对象类型

usr_ord_wal_alg_ 能快速判断对象类型。纯 UUID 或纯数字在排查日志时效率很低。

4. 适合单国家内未来分片

虽然国家之间不混库,但印尼单国数据量起来后仍可能分库分表。非自增业务 ID 更适合作为外部稳定引用。

不要这样解释 不要说“因为以后多个国家的数据会放在一起,所以要用这种 ID”。这个说法不符合 BeeX 国家隔离架构。

三、ID 分层模型

BeeX 建议区分三类标识:数据库内部主键、业务对象 ID、用户可传播码。三者不要混用。

类型示例使用位置是否给用户看说明
数据库内部主键 Ids.newId(prefix) 生成的 varchar(64)(2026-07-18 核实:代码里实际就是业务对象 ID 本身当主键,不存在另一层独立的 BIGINT AUTO_INCREMENT) 数据库内部关联、索引优化 否(但跟下一行"业务对象 ID"是同一个值) 不用 AUTO_INCREMENT:自增计数器只在单个数据库实例内有效,分库分表后各分片独立自增会互相冲突,应用层生成的 ID 才能在未来任意分片上独立生成、不需要协调。全仓库核查(2026-07-18)确认现有 68 张表主键无一使用 AUTO_INCREMENT,全部遵循这个模式。
业务对象 ID usr_mqp36o6byndywnreeeks API、日志、客服排查、订单归因 可展示但不要求记忆 系统外部稳定 ID,用于定位对象。
用户可传播码 BX2IINJQXX 邀请码、分享口令、运营活动 短、可读、可输入,不能替代用户 ID。
图 2 · 一个用户的三种标识
flowchart TB
  DBID["内部主键
id=102938"] --> USER["用户记录"] UID["业务用户ID
usr_mqp36o6byndywnreeeks"] --> USER REF["邀请码
BX2IINJQXX"] --> USER USER --> API["接口 / 日志 / 飞书通知
使用 user_id"] USER --> SHARE["邀请 / 裂变
使用 referral_code"] USER --> DB["数据库关联
可使用内部主键或 user_id"]

四、命名与格式规范

当前 BeeX 的 ID 风格是 {prefix}_{random}。前缀用于识别对象类型,随机部分保证难枚举。

对象建议前缀示例备注
用户usr_usr_mqp36o6byndywnreeeks用户主身份,所有钱包、订单归属都挂这个 ID。
订单ord_ord_167c6a653187...BeeX 内部订单 ID,不等于平台订单号。
钱包流水led_led_...资金账本记录,必须可追溯。
优惠券ucp_ucp_...用户领到的一张券。
活动cmp_cmp_...运营活动实例。
App 日志反馈alg_alg_mqrd9pjuvxe6aj8sm197用户反馈和日志包追踪。
H5 离线包h5pkg_h5pkg_mqrgk8b...离线包版本登记记录。
格式不承载业务含义 ID 里不要编码国家、业务身份、账户状态、注册渠道等会变化的信息。这些信息应该是独立字段,不应该藏在 ID 里。

五、数据库与接口建议

1. 数据库字段

字段建议原因
id可以是内部主键,也可以直接用业务 ID取决于当前表设计;高频大表可保留内部主键。
user_id使用 usr_... 业务 ID跨表、日志、接口统一,排查方便。
country_code建议保留即使国家数据中心隔离,也方便备份、导出、BI、误连排查。
platform_order_id保留平台原始订单号与 TikTok / Shopee 对账使用。

2. 接口返回

对外接口返回:userId = usr_xxx
对外接口不返回:数据库自增 id
运营/客服复制:复制完整 userId
用户邀请别人:使用 referralCode,不使用 userId

3. 日志和通知

飞书订单通知、日志反馈、异常告警里应该使用业务 ID,例如 userIdorderIdfeedbackId。必要时再补充手机号脱敏值、设备 ID、平台订单号。

六、前端展示与复制规则

ID 本身不是给普通用户记忆的,但运营、客服、测试会经常复制它。因此展示可以压缩,复制必须完整。

场景展示复制说明
我的页面usr_mqp36...reeeksusr_mqp36o6byndywnreeeks视觉上不占空间,但复制必须完整。
管理后台优先展示完整,空间不足再截断完整复制后台是排查工具,不应过度美化导致信息缺失。
飞书通知完整展示完整复制飞书通知用于排查,不怕长。
普通用户邀请显示邀请码复制邀请码或邀请链接不要让用户复制 usr_
产品规则 页面上看到短 ID 是正常的,但点击复制必须拿到完整值。否则客服、开发、运营都无法定位数据。

七、生成规则

生成规则要简单、稳定、可在多服务中复用。

规则建议
前缀固定每类对象一个固定前缀,例如 usr_ord_
随机部分使用足够长度的随机字符串,避免短时间高并发冲突。
唯一约束数据库对业务 ID 加唯一索引。生成后写入失败则重试。
不放业务状态不要把国家、业务身份、账户状态或渠道写进 ID。
大小写系统 ID 建议小写;邀请码可用大写,方便用户输入。
不建议雪花 ID 作为对外 ID 雪花 ID 适合高性能排序和内部主键,但纯数字长 ID 仍然不如 usr_... 直观,也可能暴露时间趋势。BeeX 可以内部使用雪花,自外部仍暴露业务 ID。

八、未来扩展策略

1. 单国家内分库分表

如果印尼单国用户量变大,需要在印尼数据中心内部做分片,业务 ID 可以保持不变。分片规则可以基于用户 ID 的哈希,或者基于内部主键范围,但不影响前端、三方回调和飞书通知。

现状核查:2026-07-18 对现有全部 68 张表做了逐一核查,具体哪些表已经就绪、哪些表(全局唯一约束、关系树表、缺分片键的表、无归档策略的日志表)需要先动一刀,见 数据库分片就绪度审计

2. 跨国家 BI 汇总

国家之间不混库,但 BI 可能需要汇总。汇总层使用 country_code + user_id 作为联合业务键,而不是要求各国家生产库使用同一个用户命名空间。

3. 账号迁移

如果未来出现“用户从一个国家迁移到另一个国家”的特殊需求,应作为业务迁移流程处理,生成目标国家的新用户记录,并保留迁移关系表。不要用同一个用户 ID 跨国家复用。

九、常见误区

误区 1:有了国家隔离,就可以用自增 ID 对外暴露

不对。国家隔离解决的是合规和部署边界;随机业务 ID 解决的是安全、稳定和排查边界,两者不是同一个问题。

误区 2:userId 可以当邀请码用

不对。userId 是系统标识,不适合用户传播。邀请码应该短、可读、可配置、可禁用。

误区 3:ID 里应该放国家代码

不建议。国家是部署和字段属性,不应写死在 ID 里。未来复制、迁移、测试都会更麻烦。

误区 4:前端截断 ID 后复制截断值

不对。展示可以截断,复制必须完整。这是客服和技术排查的基本要求。

最终定义 BeeX 用户 ID 是单国家数据中心内的稳定外部业务标识;它不承担跨国家混库职责,不承担邀请码职责,不暴露数据库内部主键。