Плохая ли практика иметь таблицу БД, содержащую данные, вычисленные из других таблиц?

#php #symfony #doctrine-orm

#php #symfony #doctrine-orm

Вопрос:

Я разрабатываю сайт викторины. Моя схема БД такова, что когда пользователь завершает тест, все его ответы сохраняются в таблице с именем responses . Я могу вернуться назад и вычислить оценку для теста на лету с помощью запроса БД. Тем не менее, мне было интересно, было бы эффективнее сохранять оценку за каждую попытку теста в новой таблице для более быстрого поиска, поскольку мне придется выполнить некоторую постобработку моего запроса таблицы ответов (т.Е. Перебирать каждую викторину, а затем перебирать вопросы в каждой викторине, чтобы получитьоценка).

Плохая ли практика хранить данные, которые в конечном итоге могут быть получены из запроса?

Вот изображение соответствующей части моей схемы:

Схема

Спасибо

Мартин

Комментарии:

1. .. Я могу вернуться и вычислить оценку для теста на лету с помощью запроса БД.. Точно! Сделайте это!

2. Вау, это был быстрый ответ, так что дополнительная постобработка, необходимая для получения информации, не имеет значения (т. Е. Гораздо меньшая стоимость, чем большее количество таблиц БД).?

3. Это может иметь значение, но мы будем говорить о некоторых миллисекундах — это также зависит от вашего дизайна кода, как / когда и как часто вы вычисляете эти значения

4. Хорошо, спасибо за заверение..

Ответ №1:

В настоящее время MySQL поддерживает представления для таких вычислений, но представления не являются «материализованными представлениями», поэтому запросы выполняются при каждом обращении к представлению. Хотя MySQL выполнит некоторую внутреннюю оптимизацию, он не будет кэшировать результаты.

Вот связанный пост о создании материализованных представлений.

https://dba.stackexchange.com/questions/86790/best-way-to-create-a-materialized-view-in-mysql

Чтобы использовать эту возможность, вам нужно будет запускать собственные запросы. БОЛЬШИНСТВО других типов баз данных поддерживают материализованные представления напрямую, поэтому вам просто нужно проверить документацию о том, как создать материализованное представление для вашей внутренней базы данных.