2013-11-12 7 views
0

У меня есть интересная ситуация с вычислениями, которые нужно сделать в проекте, и я ищу эффективный способ справиться с этим. Вот сценарий.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 фактически идентификатор пользователя

+0

Я не уверен, если я получу это правильно, но не мог ли этот сценарий создать рекурсивный алгоритм, который не имеет механизма остановки? –

+3

Вам не нужно заходить через каждого пользователя, если вы сохраняете ответы в базе данных, просто «UPDATE score SET SET = (оценка + 1) WHERE question_id = 1 И ответ =« Нет », что-то вроде этого обновляло бы оценка для всех пользователей, которые не ответили на вопрос №1. – Oldskool

+1

используйте триггер для обновления централизованного подсчета очков для каждого вопроса каждый раз, когда вы вставляете ответ. Вы всегда можете использовать timed-job для пересчета вещей, чтобы убедиться, что он правильно скомбинирован после этого, но версия на основе триггера даст вам довольно точный общий итог, который автоматически обновляется. –

ответ

0

на основе Absolutly нет информации базы данных данной ...

UPDATE answer_tbl 
    LEFT JOIN (SELECT answer_tbl.id, IF(answer_tbl.answer = 'YES', COUNT(yes_tbl.id), COUNT(no_tbl.id)) AS score 
       FROM answer_tbl 
        LEFT JOIN answer_tbl AS yes_tbl ON answer_tbl.question_id = yes_tbl.question_id AND yes_tbl.answer = 'YES' 
        LEFT JOIN answer_tbl AS no_tbl ON answer_tbl.question_id = no_tbl.question_id AND no_tbl.answer = 'NO' 
       WHERE 1 
       GROUP BY answer_tbl.id) AS score_tbl 
    SET answer_tbl.score AS score_tbl.score 
    WHERE answer_tbl.id = score_tbl.score 
+0

Я добавил некоторые пояснения к базе данных. Сайт работает с WordPress с дополнительными настраиваемыми таблицами –