Я думаю, что это, безусловно, отличный вопрос. Мне приходилось создавать системы, которые ведут себя аналогично этому, особенно когда к таблице с оценками обращаются довольно часто (как в вашем сценарии). Вот мое предложение для вас:
Сначала создайте несколько таблиц, подобных следующей (я использую лучшие практики SQL Server, но назовите их так, как считаете нужным):
UserAccount UserAchievement
-Guid (PK) -Guid (PK)
-FirstName -UserAccountGuid (FK)
-LastName -Name
-EmailAddress -Score
Как только вы это сделаете, продолжайте и создайте представление, которое выглядит примерно так (нет, я не проверял этот SQL, но это должно быть хорошее начало):
SELECT [UserAccount].[FirstName] AS FirstName,
[UserAccount].[LastName] AS LastName,
SUM([UserAchievement].[Score]) AS TotalPoints
FROM [UserAccount]
INNER JOIN [UserAchievement]
ON [UserAccount].[Guid] = [UserAchievement].[UserAccountGuid]
GROUP BY [UserAccount].[FirstName],
[UserAccount].[LastName]
ORDER BY [UserAccount].[LastName] ASC
Я знаю, что вы упомянули о проблемах с производительностью и множестве запросов, но если вы создадите такое представление, вам никогда не понадобится больше одного. Я рекомендую не делать это материализованным представлением; вместо этого просто индексируйте свои таблицы, чтобы нужные вам поиски (по сути, UserAccountGuid) включали быструю суммирование по всей таблице.
Я добавлю еще одно замечание: если ваша таблица UserAccount станет огромной, вы можете рассмотреть несколько более интеллектуальный запрос, который будет включать имена учетных записей, для которых вам нужно получить сводные отчеты. Это позволит не возвращать огромные наборы данных на ваш веб-сайт, когда вы только отображаете, как вы знаете, 3-10 пользовательских данных на странице. Мне бы пришлось немного больше подумать о том, как сделать это элегантно, но я бы рекомендовал держаться подальше от операторов «IN», так как это вызовет линейный поиск в таблице.