目标
两百行玩具数据掩盖了规模带来的一切问题:翻不到第二页的分页、被优化器无视的索引、让 GROUP BY 失真的均匀分布。固定种子的 Faker 能生成百万行可信数据且每次完全一致,weighted 辅助函数保持倾斜真实。经 COPY 灌库后,几分钟就拥有让性能测试变得有意义的数据集。
步骤要点
- faker.seed(20261022) 固定种子,任何机器每次运行产出字节级一致的数据,缺陷可精确复现。
- 先生成父表(5 万客户,国家按 55/25/15/5 加权),再按每客户 0-12 单的倾斜展开子表订单,保证外键完整。
- 输出 CSV 而不是 INSERT 语句,体积小一个数量级且走最快装载路径。
- \copy 灌库后验证行数与 DISTINCT 客户数与生成端一致、外键全部可解析。
- 按国家 GROUP BY 断言分布近似权重,确认倾斜真实落地而不是均匀抹平。
排错提示
日期跑到未来是 Faker 默认参考时间漂移,用 faker.date.recent({ days: 90 }) 钉住范围;数据可复现却不真实说明用了均匀随机,枚举要加权、金额与日期要用真实值域;外键装载失败就按依赖序生成并先装父表,或全部 staging 后再启用约束校验。
适用边界
合成数据无法复刻生产相关性,分析级测试仍应以脱敏样本为准;固定种子让每次数据相同,当测试开始“记住”特定行时需要换新种子重新生成。
代码示例
faker.seed(20261022); // reproducible
const customers = Array.from({ length: 50_000 }, () => ({
id: faker.string.uuid(),
name: faker.person.fullName(),
country: faker.helpers.weighted(["US", "DE", "JP", "BR"], [0.55, 0.25, 0.15, 0.05]),
}));
const orders = customers.flatMap((c) =>
Array.from({ length: faker.number.int({ min: 0, max: 12 }) }, () => ({
customerId: c.id,
total: Number(faker.commerce.price()),
}))
);