16
Практика
1. Реализуйте в приложении возможность установки розничной
цены книг с указанной пользователем даты (сейчас дата
просто игнорируется).
Предыдущая история изменений цен должна сохраняться.
Для этого добавьте в таблицу retail_prices информацию
о периоде действия цены и внесите необходимые изменения
в функции get_retail_price и set_retail_price.
2. Создайте составной тип для формата издания, состоящего из
размеров типографского листа и доли листа. Также создайте
приведение для этого нового типа к текстовому.
Замените тип данных столбца format таблицы books
и убедитесь, что интерфейс с приложением не изменился.
1. Диапазон времени действия розничной цены можно представить по-
разному:
- двумя столбцами типа timestamptz («дата с» и «дата по»);
- одним столбцом типа timestamptz («дата с»), при этом цена считается
действующей до следующей даты в другой строке таблицы;
- одним столбцом диапазонного типа tstzrange.
Реализуйте последний вариант. Обратите внимание:
- В функции set_retail_price придется изменять две строки таблицы, и
это должно корректно работать в случае, если несколько пользователей
устанавливают цену одновременно.
- Функция get_retail_price должна получать цену на текущий момент.
Используйте функцию current_timestamp (возвращающую время начала
транзакции), а не clock_timestamp. Это будет важно при последующих
изменениях.
2. Формат издания записывается в виде WxH/N, где W и H — ширина
и высота типографского листа, с которым работает печатная машина,
и который разрезается потом на N одинаковых частей (страниц книги).
Поэтому N как правило представляет собой степень двойки.
Несмотря на то, что отношение длины страницы к ширине может быть
разным, книги можно упорядочить по формату, сравнивая площадь
страницы, которая равна W*H/N.
При замене типа столбца обратите внимание на блокировку, которая
при этом удерживается.