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