Разрешение избыточных данных в БД для повышения производительности - PullRequest
2 голосов
/ 03 февраля 2010

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

Я предполагаю, что вы будете использовать таблицу типа:
оценки(question_id, user_id, rating)
... который будет записывать оценки и следить за тем, чтобы ни один пользователь не голосовал дважды за один и тот же вопрос.

Эта таблица сама по себе может обрабатывать данные рейтинга, но это может привести к медленным запросам.

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

Ответы [ 3 ]

6 голосов
/ 03 февраля 2010

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

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

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

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


Чтобы сделатьвсе просто:

  • Не переусердствуйте
  • Сделайте ваше приложение работающим
  • Как только оно заработает, сравните его
  • Если / когда необходимо, оптимизировать


В конце концов, да, может быть, может помочь де-нормализация суммы оценок в таблице вопросов;но нужно ли вам это делать?

Это реальный вопрос; -)

0 голосов
/ 03 февраля 2010

В целом - это правильный подход для хранения агрегированных значений, если вы знаете, что данные читаются гораздо чаще, чем записываются. В этом конкретном случае я бы также подумал о том, чтобы сделать физический дизайн таблицы ответов таким образом, чтобы удешевить агрегацию. Для этого я бы сделал кластерный индекс, определенный на query_id, answer_id. В результате с диска будет считано только несколько страниц БД, чтобы получить все ответы на конкретный запрос.

0 голосов
/ 03 февраля 2010

Если вы планируете предварительно агрегировать таблицы, стоило бы взглянуть на материализованные представления (индексированные представления в T-SQL).

...