Должен ли я хранить расчетное значение в моей базе данных вместе с переменными? - PullRequest
8 голосов
/ 16 декабря 2011

Во всех приложениях, которые я создал, где используется база данных, я обычно сохраняю вычисленное значение вместе с переменными, необходимыми для вычисления этого значения.Например, если у меня есть tonnage и cost, я бы умножил их, чтобы вычислить total.Я мог бы просто пересчитывать значение каждый раз, когда это необходимо, мне просто было интересно, существует ли стандартный подход.В любом случае, со мной все в порядке, я просто хочу сделать то, что наиболее распространено.

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

Расчеты не будут очень частыми, но могут быть умеренно частыми, но математика дешевая, верно?

Ответы [ 5 ]

9 голосов
/ 16 декабря 2011

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

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

3 голосов
/ 16 декабря 2011

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

2 голосов
/ 16 декабря 2011

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

Правильно что нужно сделать, это либо

  • не сохранять результат вычисления
  • сохранять вычисленное значение в столбце, который проверяется с помощью ограничения CHECK.

MySQL не поддерживает ограничения CHECK.Таким образом, ваши параметры

  • не сохраняют результат вычисления
  • переключение на dbms, который поддерживает ограничения CHECK, например PostgreSQL.
1 голос
/ 16 декабря 2011

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

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

Итак, это зависит от того, что у вас есть и чего вам не хватает.

0 голосов
/ 16 декабря 2011

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

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