我正在使用Mockaroo和 Excel 创建和编辑一些 CSV 文件,这些文件将作为测试数据插入 MySQL 数据库。我有一个以student_takes_module
列module_ID
和student_ID
.
有 10000 个学生证和 500 个模块。该系统的规范要求每个模块有 1 到 400 名学生注册(因此student_takes_module
)。
有没有办法可以配对随机student_ID
和module_ID
值以符合这个规范?
这是一种方法,它是近似的并且计算上很痛苦。它首先为每个模块分配一些学生。然后它随机选择该模块的学生。
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 行,然后是您需要的所有行需要多长时间。
另一种解决方案可能是使用RANDBETWEEN
Excel 中的函数来随机选择值module_ID
以填充student_ID
s旁边的新列
或者,Mockaroo 将接受所有 500 个 module_ID 作为自定义列表,它可以分配给随机生成的 student_ID。
这些方法的缺点是学生将非常均匀地分布在所有模块中。