У меня есть интересная ситуация с вычислениями, которые нужно сделать в проекте, и я ищу эффективный способ справиться с этим. Вот сценарий.Large Dataset Cron Job
Мы делаем сайт «Опрос», на котором пользователи отвечают на вопросы опроса. Они могут ответить на каждый вопрос один раз.
Мы генерируем «Оценка» для каждого пользователя на основе их ответов. Они получают 1 балл для каждого другого пользователя, который ответил на то же самое.
Для примера:
Question 1 has 2 answers, "Yes" and "No"
7 Users answered "Yes" and 3 answered "No"
Each User that answered "Yes" adds 7 points to their score
Each User that answered "No" adds 3 points to their score
If a 4th User answers "No", 1 extra point is added to each User that answered "No"
Как вы можете себе представить, что было бы слишком много расчетов, чтобы сделать это на лету, так как много десятков пользователей необходимо регенерировать каждый раз, когда вопрос решается. Поэтому я хочу сделать это как Cron Job каждые Х часов.
Мои данные в настоящее время возвращает одну строку для каждого вопроса ответил одним пользователем, а также с тем, как много точек каждый ответ стоит (разделенные запятой: 7,3)
Как я должен идти о регенерации этих результатов? Я не хочу использовать простой «Foreach» для прокрутки каждого Пользователя, поскольку это не похоже, что он будет масштабироваться по мере роста базы пользователей. Есть ли способ запуска PHP-скриптов в фоновом режиме или одновременно, чтобы не вызвать зависание цикла?
Любая помощь или предложения приветствуются!
EDIT:
К сожалению, я должен был объяснить базы данных немного слишком.
Это веб-сайт WordPress, поэтому некоторые данные находятся в таблице postmeta по умолчанию WordPress. Счет хранится как значение meta_key, разделенное запятой для «Post» (вопрос опроса)
Все ответы хранятся в собственном списке ответов. Каждый ответ представляет собой строку в таблице и включает user_id, post_id (вопрос опроса), выбранный ответ (индекс значения мета-знака, разделенного запятыми)
И вот этот вопрос я использую, чтобы получить ответы на все вопросы Пользователь частности:
SELECT * FROM `wp_myo_ip` LEFT JOIN `wp_postmeta` ON `wp_myo_ip`.`myo_polling_id` = `wp_postmeta`.`post_id` AND `wp_postmeta`.`meta_key` = 'myo-votes' WHERE `wp_myo_ip`.`myo_polling_ip` = 1
столбец myo_polling_ip
фактически идентификатор пользователя
Я не уверен, если я получу это правильно, но не мог ли этот сценарий создать рекурсивный алгоритм, который не имеет механизма остановки? –
Вам не нужно заходить через каждого пользователя, если вы сохраняете ответы в базе данных, просто «UPDATE score SET SET = (оценка + 1) WHERE question_id = 1 И ответ =« Нет », что-то вроде этого обновляло бы оценка для всех пользователей, которые не ответили на вопрос №1. – Oldskool
используйте триггер для обновления централизованного подсчета очков для каждого вопроса каждый раз, когда вы вставляете ответ. Вы всегда можете использовать timed-job для пересчета вещей, чтобы убедиться, что он правильно скомбинирован после этого, но версия на основе триггера даст вам довольно точный общий итог, который автоматически обновляется. –