Hello, Глеб!

Мадорский Г.В. wrote:

Имхо, пусть уж лучше где-то данные дублируются.
От дополнительных табличек с историей значения каждого реквизита я отказался. Уж больно мудреные SQL получаются. Сейчас храню версии записи с диапазоном дат, указывающим период ее актуальности. Соответственно любое поле может работать как переодический реквизит. Запросы сильно не усложняются и не замедляются. Выглядят так примерно:

могу предложить свои мысли (буде статья, включим туда), по поводу
"курсов валют".

при организации курсов валют есть 2 классические ошибки, исходящие
из "прямого" решения задачи - хранения курсов валют в виде
код_валюты+дата+курс_валюты (или в ином порядке).

Ошибка 1.
Для оперативного пересчета курса валют на текущий день
строится запрос вида

select value, max(date)
from currency
where currency_code = :param
group by value

или что-нибудь в этом роде, но обязательно с max(date).

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

Поэтому для текущих курсов валют нужно организовать таблицу вида
currency_code+value
без даты, и заполнять значения КАЖДЫЙ ДЕНЬ при смене курса
какой-нибудь процедурой.
То есть, мы получаем таблицу, в которой есть записи в количестве
используемых валют, и с самыми последними значениями курсов.
Это СУЩЕСТВЕННО ускорит запросы по определению текущего курса.

Ошибка 2.
Пропуски в датах курсов валют в вышеобозначенной таблице.
Не будь их - не нужен max, и можно делать прямое объединение таблиц
по коду валюты и дате.
Опять же, от пропусков избавляются ежедневным занесением курса
валют на текущую дату "сервисной процедурой", которая одновременно
обновляет курсы валют в таблице "текущих курсов".

претензии к изложенному принимаются.

--
Dmitri Kouzmenko, www.ibase.ru, (495) 953-13-34


Ответить