【问题标题】:Generating large amounts of test data using sets of known values?使用一组已知值生成大量测试数据?
【发布时间】:2014-06-12 14:28:46
【问题描述】:

我正在使用Mockaroo 和 Excel 创建和编辑一些 CSV 文件,这些文件将作为测试数据插入 MySQL 数据库。我有一个名为student_takes_module 的文件,其中包含module_ID 和student_ID 列。

有 10000 个学生 ID 和 500 个模块。该系统的规范要求每个模块注册 1 到 400 名学生(因此student_takes_module)。

有没有一种方法可以匹配随机的 student_ID 和 module_ID 值以符合此规范?

【问题讨论】:

  • 您是否在数据库中存储了每个模块的最大学生人数?
  • 我没有 - 出于数据库的目的,我不确定如果我可以正确生成数据,这将是必需的吗? DB 仅需要作为在其他地方编写的时间表算法的示例数据源。谢谢

标签: mysql excel test-data


【解决方案1】:

另一种解决方案可能是使用 Excel 中的 RANDBETWEEN 函数从 module_ID 中随机选择值以填充 student_IDs 旁边的新列

或者,Mockaroo 将接受所有 500 个 module_ID 作为自定义列表,它可以将其分配给随机生成的 student_ID。

这些方法的缺点是学生将非常均匀地分布在所有模块中。

【讨论】:

    【解决方案2】:

    这是一种方法,它是近似的且计算上很痛苦。它首先为每个模块分配一些学生。然后它会随机选择该模块的学生。

    insert into student_takes_module(module_id, student_id)
        select m.module_id, s.student_id
        from (select m.*, 10 + rand() * 350 as numstudents
              from modules m
             ) m cross join
             students s cross join
             (select count(*) as totalstudents) const
        where rand() < m.numstudents/const.totalstudents;
    

    350 代替 400 是因为在此上下文中使用 rand() 是近似的。使用10 是因为我认为,如果您至少有 10 名学生,那么当您循环浏览数据时,您可能会为该班级找到至少一名学生。

    此方法将处理 10,000*500 = 5,000,000 行来生成测试数据。但是,计算结果还不错(rand() 以性能不佳而闻名,但这是因为函数调用和order by rand() 之间存在混淆)。您可以通过将limit 放在末尾来测试性能,看看需要多长时间才能生成 10 行、1000 行、10000 行,然后是您需要的所有行。

    【讨论】:

    • 每次生成随机数之前运行 Randomize Timer() 以提高随机性。
    • 我接受了您的回答,因为它似乎是最完整的解决方案。我添加了自己的答案,以更快地获得类似(但不太全面)的结果
    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多