Кто сказал, что вы должны хранить данные только один раз?
Я бы предположил, что модель, которая у вас в голове, является «правильной», поэтому я буду придерживаться ее; вычисление значений для большого количества данных - с этим можно справиться.
Опираясь на то, что вы сказали, в дополнение к хранению определенных баллов по отношению к конкретным объектам (таким как вопросы, ответы и т. Д.), Вы также можете хранить «промежуточную сумму» (балл), которая увеличивалась при назначении баллов (я думаю это будет столбец Int в таблице «Пользователь» в вашей базе данных).
Если пойти дальше, у вас могут быть асинхронные процессы, которые периодически проверяют увеличенное значение по отношению к сущностям, чьи значения баллов вносят вклад в "оценку". Эта проверка может выполняться для всех соответствующих данных или только для данных в определенном временном интервале (т.е. с момента последней проверки).
Другой подход такой же, но в промышленном масштабе; Вы слышали об OLTP и OLAP?
- OLTP (оперативная обработка транзакций) относится к классу систем, которые упрощают и управляют приложениями, ориентированными на транзакции.
- OLAP (онлайн-аналитическая обработка) - это подход, позволяющий быстро отвечать на многомерные аналитические запросы.
Похоже, что модель в вашей голове построена вокруг ожидаемой "транзакционной" природы вашей системы, но вы также определили некоторые требования, которые лучше подходят для более аналитического подхода.
Нет причины, по которой вы не можете сделать то и другое, большой вопрос - как. Решение «промежуточный итог» делает это, но только для очень конкретного случая. Возможно, стоит взглянуть на более широкую систему (и где вы хотите ее взять) и, возможно, «инвестировать» в более комплексную систему с разделами.