BeeX ID 设计方案
BeeX 的用户 ID 不是为“多个国家混在一个库”设计的。
BeeX 的基础架构是 国家级数据中心隔离:印尼、马来、菲律宾等国家分别使用独立部署、独立数据库、独立平台账号和独立运营配置。用户 ID 的主要目标,是在单国家数据中心内部提供一个稳定、不可枚举、便于排查、适合未来单国家内扩容的外部业务标识。
一、国家隔离前提
country_code 数据,而是不同数据中心、不同数据库、不同服务配置。
| 维度 | 设计原则 | 说明 |
|---|---|---|
| 国家 | 物理隔离 | ID / MY / PH 等国家分别部署,不共享生产数据库。 |
| 环境 | 测试 / 正式隔离 | id-test 与 id-prod 是不同环境,不允许混用资金、订单、三方账号。 |
| 外部业务 ID | 国家内唯一即可 | 印尼用户 ID 与马来用户 ID 不需要在业务上互相查重,因为数据中心不会混在一起。 |
| 数据汇总 | 按分析链路处理 | 如果未来做集团 BI,可在数据仓库里用 country + user_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 是 1、2、10086,别人很容易猜测用户量,也更容易批量遍历接口。随机业务 ID 能降低这类风险。
2. 外部稳定,内部可迁移
数据库表结构、主键策略、归档策略可以变化,但外部看到的 usr_... 不变。迁移或拆表时不用让 App / H5 / 三方系统跟着改。
3. 日志里一眼看对象类型
usr_、ord_、wal_、alg_ 能快速判断对象类型。纯 UUID 或纯数字在排查日志时效率很低。
4. 适合单国家内未来分片
虽然国家之间不混库,但印尼单国数据量起来后仍可能分库分表。非自增业务 ID 更适合作为外部稳定引用。
三、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。 |
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... | 离线包版本登记记录。 |
五、数据库与接口建议
1. 数据库字段
| 字段 | 建议 | 原因 |
|---|---|---|
id | 可以是内部主键,也可以直接用业务 ID | 取决于当前表设计;高频大表可保留内部主键。 |
user_id | 使用 usr_... 业务 ID | 跨表、日志、接口统一,排查方便。 |
country_code | 建议保留 | 即使国家数据中心隔离,也方便备份、导出、BI、误连排查。 |
platform_order_id | 保留平台原始订单号 | 与 TikTok / Shopee 对账使用。 |
2. 接口返回
3. 日志和通知
飞书订单通知、日志反馈、异常告警里应该使用业务 ID,例如 userId、orderId、feedbackId。必要时再补充手机号脱敏值、设备 ID、平台订单号。
六、前端展示与复制规则
ID 本身不是给普通用户记忆的,但运营、客服、测试会经常复制它。因此展示可以压缩,复制必须完整。
| 场景 | 展示 | 复制 | 说明 |
|---|---|---|---|
| 我的页面 | usr_mqp36...reeeks | usr_mqp36o6byndywnreeeks | 视觉上不占空间,但复制必须完整。 |
| 管理后台 | 优先展示完整,空间不足再截断 | 完整复制 | 后台是排查工具,不应过度美化导致信息缺失。 |
| 飞书通知 | 完整展示 | 完整复制 | 飞书通知用于排查,不怕长。 |
| 普通用户邀请 | 显示邀请码 | 复制邀请码或邀请链接 | 不要让用户复制 usr_。 |
七、生成规则
生成规则要简单、稳定、可在多服务中复用。
| 规则 | 建议 |
|---|---|
| 前缀固定 | 每类对象一个固定前缀,例如 usr_、ord_。 |
| 随机部分 | 使用足够长度的随机字符串,避免短时间高并发冲突。 |
| 唯一约束 | 数据库对业务 ID 加唯一索引。生成后写入失败则重试。 |
| 不放业务状态 | 不要把国家、业务身份、账户状态或渠道写进 ID。 |
| 大小写 | 系统 ID 建议小写;邀请码可用大写,方便用户输入。 |
usr_... 直观,也可能暴露时间趋势。BeeX 可以内部使用雪花,自外部仍暴露业务 ID。
八、未来扩展策略
1. 单国家内分库分表
如果印尼单国用户量变大,需要在印尼数据中心内部做分片,业务 ID 可以保持不变。分片规则可以基于用户 ID 的哈希,或者基于内部主键范围,但不影响前端、三方回调和飞书通知。
2. 跨国家 BI 汇总
国家之间不混库,但 BI 可能需要汇总。汇总层使用 country_code + user_id 作为联合业务键,而不是要求各国家生产库使用同一个用户命名空间。
3. 账号迁移
如果未来出现“用户从一个国家迁移到另一个国家”的特殊需求,应作为业务迁移流程处理,生成目标国家的新用户记录,并保留迁移关系表。不要用同一个用户 ID 跨国家复用。
九、常见误区
误区 1:有了国家隔离,就可以用自增 ID 对外暴露
不对。国家隔离解决的是合规和部署边界;随机业务 ID 解决的是安全、稳定和排查边界,两者不是同一个问题。
误区 2:userId 可以当邀请码用
不对。userId 是系统标识,不适合用户传播。邀请码应该短、可读、可配置、可禁用。
误区 3:ID 里应该放国家代码
不建议。国家是部署和字段属性,不应写死在 ID 里。未来复制、迁移、测试都会更麻烦。
误区 4:前端截断 ID 后复制截断值
不对。展示可以截断,复制必须完整。这是客服和技术排查的基本要求。