Плотность планеты — полезная величина. Было бы неплохо завести дополнительную колонку 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
соответствующее поле в соответствующей записи таблицы. При этом нужно не забыть
обновить также и поле плотности, иначе клиенты, запрашивающие таблицу, получат
противоречивые данные. Такая забывчивость приведёт к потере цельности
информации в записях таблицы. Это требование усложняет управление базой данных,
поскольку нужно помнить о всех взаимозависимостях между полями в таблице и
способы поддержания цельности данных.