Генерация больших объемов тестовых данных с использованием наборов известных значений?

Я использую 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_IDs

В качестве альтернативы Mockaroo примет все 500 module_ID в качестве пользовательского списка, который он может назначить случайно сгенерированным идентификаторам student_ID.

Недостатком этих методов является то, что студенты будут равномерно распределены по всем модулям.

Другие вопросы по тегам