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

У меня дилемма. Я работаю с большим количеством устаревшего кода и вижу много избыточной информации в структурах таблиц. В основном они существуют в двух формах:

A. Избыточная информация для экономии на «соединениях». например:

event_id, event_name, event_creator_id
       3       test1                43

subevent_id, event_id, event_creator_id 
         21         3               43

Обратите внимание на дублирование идентификатора события _создателя _. Обоснование, данное бывшими «старшими» разработчиками, заключается в том, что когда нам нужен идентификатор создателя события, нам просто нужно запросить одну таблицу, а не выполнять «дорогостоящее» соединение для получения значения.

B. Избыточная информация для экономии на расчетах. например:

event_id, event_default_price
       3                  100

discount_id, discount_code, discount_percentage
          7,          ABCD,                  50

special_event_id, event_id, discount_id, discounted_price
              21         3            7,               50

Обратите внимание, что вместо вычисления окончательной «цены со скидкой _» для этого специального события (, поскольку ссылка на идентификатор скидки _уже существует ), код сохраняет это «рассчитанное» значение, как здесь.. Опять же, оправданием является «скорость», нормальность к черту.

У меня два вопроса:

  1. Я могу сказать новым разработчикам, что эти структуры не нормализованы, но они могут сказать, что так быстрее. Как мне противостоять этому? Я возражаю против этого? Другие структурируют свои базы данных так?!
  2. Есть ли эмпирическое правило или набор принципов, которые я могу использовать, чтобы сказать, что -«о, это будет медленнее, но только на 1%, так что можно сделать так ', и т.д?
7
задан Steve 6 July 2012 в 10:47
поделиться