Способы подхода к хранению остатков Ключевые слова: остатки,СУБД,регистры
Рассмотрим основные способы хранения остатков в базе данных, а затем посмотрим, какой из них используется в 1С.
Формализуем задачу. Пусть есть некоторый набор измерений, и числовых ресурсов по которым могут проходить движения со знаком плюс(приход) или минус(расход).
Например для измерений Склад, Товар есть ресурс Количество.
Нам нужно узнать остаток на любой момент времени.
Всего известно 3 метода хранения остатков. Других пока не придумано.
Во всех SQL-запросах используются:
MotionTable - таблица движений
RestTable - таблица остатков
&Date - дата, на которую нужно получить остатки
BeginOfMonth - функция получения начала месяца из даты
BETWEEN - оператор проверки вхождения даты в интервал А, Б
Все запросы написаны условно, без оператора FROM.
1. Хранение движений, остатки вычисляются
Остатки не хранятся в базе данных.
При необходимости получения остатка на некоторую дату суммируются все движения, произошедшие ранее даты получения остатков.
Достоинства: минимальный объем базы.
Недостатки: низкая скорость чтения остатков.
Степень сложности написания запросов к остаткам: низкая.
Пример SQL запроса:
SELECT Sum(MotionTable.Summ) WHERE MotionTable.Date<&Date
2. Хранение движений и баланса
В каждом движении хранится также и баланс(остаток), который возникает по измерениям после совершения данного движения.
Таким образом остатки получаются чтением одной записи, дата которой максимально близка к дате получения остатков.
Достоинства: высокая скорость чтения остатков.
Недостатки: максимальный объем базы, низкая скорость записи остатков.
Степень сложности написания запросов к остаткам: низкая.
Пример SQL запроса:
SELECT Sum(MotionTable.Summ) WHERE MotionTable.Date=SELECT (Max(MotionTable.Date) WHERE MotionTable.Date<=&Date)
3. Хранение движений и баланса опорных дат
Остатки хранятся обычно в отдельной таблице (хотя возможно и совмещение) и с заданной периодичностью - например, на начало каждого месяца, недели, квартала. П
Остатки получаются путем чтения записи на начало периода и суммированием всех движений за период.
Характеристики: средний объем базы, средняя скорость чтения остатков, средняя скорость записи остатков.
Недостатки: высокая степень сложности написания запросов.
Степень сложности написания запросов к остаткам: высокая.
Пример SQL запроса:
SELECT RestTable.Summ+Sum(MotionTable.Summ) WHERE RestDate.Data=BeginOfMonth(&Date) AND MotionTable.Date BETWEEN (BeginOfMonth(&Date), &Date)
Особенности 1С1С 7.7
В 1с версии 77 используется третий метод.
Итоговая таблица остатков: месяц декада пятнадцать дней 5 дней.
Итоговая таблица оборотов: день неделя декада месяц квартал год.
1С 8.0
Используется третий метод.
Итоговая таблица остатков и оборотов хранит итоги на начало каждого месяца.
Еще если до даты на которую есть остатки осталось мало дней можно вычитать из нее.... данные механизмы с целью ускорения могут быть реализованы на SQL процедурах, а так же возможно создание дополнительной таблицы в которой хранятся записи, которые на дынный момент не учтены в "текущих хранимых" остатках
Кроме того довольно серьезная проблема с паралельным занесением данных, в 8.1 это реализовано с помощью разделяемых остатков
Еще как механизм хранить остатки в виде дерева...
+1 - 1 ( 0
-1 - -1 ) ( 1
+1 - 1 -( 1 )
0 - 0 - )
плюсы... для получения остатков при балансированном дереве время получения порядка log2 (x)
плюсы... для записи остатков при балансированном дереве время записи порядка log2 (x)
минусы сложность написания запросов
малоэффективно без поддержки на уровне системы БД
периодически требуется перебалансировка де6рева (довольна длительная процедура в случае отсутствия поддержки серверов БД)
в общем случае оптимальный метод.... но требующий переработки БД
минусы удвоение остатков :) |