Глава 13. Вычисляемые значения

Плотность планеты — полезная величина. Было бы неплохо завести дополнительную колонку density в таблице planet и заполнить её в соответствии с выражением, полученном в предыдущей главе:

test54=# ALTER TABLE planet ADD COLUMN density REAL;
ALTER TABLE
test54=# UPDATE planet SET density=1E-9*6*mass/3.1415926/diameter^3;
UPDATE 8
test54=# SELECT * FROM planet;
   name   | token | diameter |    mass    | orbit  | density 
----------+-------+----------+------------+--------+---------
 Меркурий | ☿     |     4880 |    3.3e+23 |   0.38 |  5423.2
 Венера   | ♀     |  12103.6 |  4.869e+24 |   0.72 | 5244.42
 Земля    | ♁     |  12756.3 | 5.9736e+24 |      1 | 5496.21
 Марс     | ♂     |     6794 | 6.4219e+23 |   1.52 |    3911
 Юпитер   | ♃     |   142984 |    1.9e+27 |    5.2 | 1241.35
 Сатурн   | ♄     |   120536 |   5.68e+26 |   9.54 |  619.44
 Уран     | ♅     |    51118 |  8.683e+25 | 19.218 | 1241.51
 Нептун   | ♆     |    49532 | 1.0247e+26 |  30.06 | 1610.43
(8 rows)

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

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

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

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

Имеется ещё одна проблема, возникающая при хранении вычисленной информации. Представьте, что в результате астрономических исследований масса или диаметр какой-то планеты уточнились. Следует обновить с помощью UPDATE соответствующее поле в соответствующей записи таблицы. При этом нужно не забыть обновить также и поле плотности, иначе клиенты, запрашивающие таблицу, получат противоречивые данные. Такая забывчивость приведёт к потере цельности информации в записях таблицы. Это требование усложняет управление базой данных, поскольку нужно помнить о всех взаимозависимостях между полями в таблице и способы поддержания цельности данных.

Информатика-54