Например, рассмотрите это как сайт онлайн-опроса.
Сущности
Survey (created with questions, answers)
Respondent
(кто принимает участие в опросах в параллельно . огромный в №)
survey id
List
(question id
, answer id
)
Проблема:
Необходимо получить сводку ответов, т. Е. Для любого конкретного survey
, для любого question
, нет. респондентов, которые выбрали ответ 1 против 2 против 3 (скажем)
Сводка должна быть получена дешево, то есть с меньшим количеством звонков, насколько это возможно
Этот код просто , чтобы помочь вам лучше понять:
Survey sampleSurvey = ..
// get all respondents of above survey
List<Respondent> r = getAllRespondents(sampleSurvey);
// update summary per chosen question, answer
for each respondent:
List<QuestionAnswer> qa = respondent.getChosenAnswers()
for each chosen question, answer:
// increments corresponding answer count by 1
sampleSurvey.updateSummary(question.getId(), answer.getId())
// summary update done
// process summary
Summary summary = sampleSurvey.getSummary();
for each available question, answer:
print 'No. of respondents who chose answer %s for question %s are %s' % (answer.text(), question.text(), answer.count())
Мои мысли :
а. Создание сводной сущности для каждого опроса по мере того, как респондент принимает участие в опросе, обновляя счетчики в сводке entity(Q1 -> A1 -> 4, Q1 -> A2 -> 222,...).
Плюсы: получить сводку, прочитав всего 1 сущность; дешево
Минусы: так как огромных нет. респонденты проводят одно и то же исследование параллельно, это означает, что разногласия между хранилищами данных; осколок решения? нет. из осколков, чтобы быть динамическим в зависимости от нет. респондентов для опросов.
б. Запрашиваем счет против индексов. С моим небольшим знанием об индексации appengine, я не знаю
как будет сформирован индекс для вышеуказанной сущности респондента и насколько он будет большим. Также беспокоюсь о нет. из этих дополнительных записей, необходимых для индексов, может произойти взрыв индекса?
запрос должен быть что-то вроде
select count(*) from Respondent where surveyId=xx and questId=yy and ansId=zz
Есть ли другие лучшие решения? А что на счет выше? какой из них вы рекомендуете и почему. Большое спасибо за поиск и ваши предложения. Пинг если что то неясно.