Хранение агрегированных данных идет вразрез с нормализацией базы данных? - PullRequest
2 голосов
/ 18 июля 2011

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

Но противоречит ли это нормализации БД или любым другим стандартам / рекомендациям? И каков наилучший способ сделать это, например, должна ли каждая таблица иметь другую таблицу для агрегированных данных, должна ли она храниться в той же самой таблице, которую представляет, когда должны обновляться агрегированные данные?

Спасибо

Ответы [ 3 ]

5 голосов
/ 18 июля 2011

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

4 голосов
/ 18 июля 2011

Фраза, которую нужно запомнить: «Нормализовать, пока не станет больно, Денормализовать, пока это не сработает»

Это значит: нормализовать все ваши доменные отношения (по крайней мере, до третьей нормальной формы (3NF)).Если вы измеряете недостаток производительности, то исследуйте (и оцените), даст ли денормализация преимущества в производительности.

Итак, да.Хранение агрегированных данных «противоречит» нормализации.

Не существует «одного лучшего способа» денормализации;это зависит от того, что вы делаете с данными.

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

0 голосов
/ 18 июля 2011

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

Я справился с подобной ситуацией двумя способами.

1) с использованием DB2 Я использовал MQT (материализованную таблицу запросов), которая работает как только представление, управляется запросом, и вы можете запланировать, как часто вы хотите его обновлять;например, каждые 5 мин.Затем в этой таблице хранились значения счетчиков.

2) в самом программном пакете. Я установил такую ​​информацию в качестве системной переменной.Таким образом, в Apache вы можете установить общесистемную переменную и обновлять ее каждые 5 минут.Тогда это несколько точно, но вы выполняете свой запрос "count (*)" раз в пять минут.Вы можете запустить его демоном или управлять им по запросам страниц.

Я использовал класс-обертку, чтобы сделать это, так что это было давно, но я думаю, что в PHP все было просто: $ _SERVER ['report_page_count'] = array ('timeout' => 1234569783, 'count' => 15);

Тем не менее, однако вы сохраняете это единственное значение, которое избавляет вас от запуска его при каждом запросе.

...