Собственный столбец или сводная таблица для статистических данных? - PullRequest
1 голос
/ 07 апреля 2011

Например, у нас есть три таблицы (Post, PostTag и Tag):

Post
=======
id
title
body

PostTag
=======
id
post_id
tag_id

Tag
=======
id
name
normalized_name

Нам нужно посчитать, сколько сообщений содержится в теге "спорт". Запрос подсчета медленный (у нас несколько миллионов строк).

Для решения мы должны сохранить счет в базе данных (после добавления тегов счет обновляется с n + 1, после удаления n - 1).

Теги часто добавляются / удаляются сообществом / модерацией.

Мои мысли:

Создать собственную сводную таблицу для хранения количества тегов:

 PostTagStat
 ========
 tag_id
 frequency

Индекс создается по частоте столбца.

Но было бы лучше, если бы мы добавили новый столбец в таблицу тегов для сохранения запроса INNER JOIN, например:

 Tag
 ========
 id
 name
 normalized_name
 frequency

Что ты думаешь? Собственная таблица или новый столбец? И почему?

1 Ответ

0 голосов
/ 29 ноября 2011

Для запроса данных:

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

Однако эти две стратегии вряд ли так сильно отличаются от производительности, поскольку добавлен только один столбец (столбец «частота», я думаю, 4 байта).


Для модификации данных:

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

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


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

...