Повторение данных для большей эффективности - PullRequest
0 голосов
/ 17 марта 2012

Допустим, у меня есть таблица thread и таблица response, где я храню темы и ответы на темы, которые пользователь отправляет на форуме.

В настоящее время я подсчитываю ответы, которые есть у данной темы:

SELECT COUNT(id)
FROM response
WHERE container_id = THREAD_ID

Но не лучше ли было бы просто иметь другое поле (number_of_responses или что-то подобное) в таблице потоков, добавлять 1 к нему каждый раз, когда оно отвечает? Тогда запрос превращается во что-то вроде этого:

SELECT number_of_responses
FROM thread
WHERE id = THREAD_ID
LIMIT 1

Да, я бы повторял данные, но разве этот подход не эффективнее? Или это по какой-то причине не рекомендуется?

Ответы [ 4 ]

0 голосов
/ 17 марта 2012

Хранить счет - плохая идея по всем причинам, уже указанным в других ответах.Вместо того, чтобы выполнять отдельные запросы для подсчета ответов, вы можете просто оставить присоединение к таблице ответов -

SELECT t.*, COUNT(*) 
FROM thread t
LEFT JOIN response r
    ON t.id = r.container_id
GROUP BY t.id

Использование счетчика в LEFT JOIN будет очень быстрым, поскольку он может использовать индекс, который уже должен существовать длявнешний ключ.

0 голосов
/ 17 марта 2012

Не думаю, что вы должны использовать number_of_responses, потому что это сгенерированные данные.Вы должны только сохранить в базе данных то, что база данных не может рассчитать сам.Если вы работаете с медленными таблицами, вы должны добавить индексы или оптимизировать таблицы другим способом.

0 голосов
/ 17 марта 2012

Сохранение столбца подсчета, хотя и не нормализованное на 100%, приведет к более быстрому времени загрузки страницы, особенно когда ваши таблицы ответов начинают расти очень большими.Если ваша таблица ответов содержит текстовые столбцы, что, как я подозреваю, так и происходит, счет замедляется намного раньше, чем если у вас есть строки небольшого размера (целые числа, varchars и т. Д.).

Если вы решите пойти по этому пути, япредложил бы использовать триггер в таблице ответов для обновления счетчика в соответствующей строке потока.Таким образом, вам не нужно управлять им в коде.

0 голосов
/ 17 марта 2012

Я думаю, что отчасти это зависит от того, как вы используете данные. Но я знаю много форумов, которые я использую, перечислите количество ответов вместе со всеми заголовками тем, так что если вы собираетесь отображать эту информацию в списках тем и результатах поиска, то это хороший вариант для рассмотрения.

Если вы отображаете его только при открытом потоке, вы также можете избежать избыточности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...