Генерация больших объемов тестовых данных с использованием наборов известных значений?
Я использую Mockaroo и Excel для создания и редактирования некоторых CSV-файлов, которые будут вставлены в базу данных MySQL в качестве тестовых данных. У меня есть файл с именем student_takes_module
с колоннами module_ID
а также student_ID
,
Есть 10000 студенческих номеров и 500 модулей. Спецификация системы, частью которой она является, требует, чтобы от 1 до 400 студентов были зарегистрированы в каждом модуле (следовательно, student_takes_module
).
Есть ли способ, которым я могу пара случайным образом student_ID
а также module_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 учеников, то, вероятно, вы получите хотя бы одного ученика для этого класса, когда будете циклически перебирать данные.
Этот подход будет обрабатывать 10000*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.
Недостатком этих методов является то, что студенты будут равномерно распределены по всем модулям.