Здравствуйте.
У меня вопрос по проектированию модели данных для складов. Общие требования к разрабатываемой системе такие:
1. Есть несколько складов. На складе располагаются товары.
2. Есть операции приемки товара на склад, перемещения на другой склад и списания со склада.
3. Необходима возможность просмотреть прошлое состояние склада (ограничение, например, за год)
4. Необходимо хранить данные по прошедшим операциям.
5. Необходима возможность отмены и изменения прошедшей операции приемки/перемещения/списания.
6. Прошедшие операции следует хранить не более 1 года.
Какой подход избрать для проектирования модели данных?
У меня в голове сейчас 3 варианта.
1 вариант. Не хранить, сколько товара было на складе в каждый конкретный момент. Хранить только операции, например:
Товар Склад Кол-во Дата Тип операции
----------------------------------------------------
Телевизор С1 +8 март Приход
Телевизор С1 -1 апрель Расход
Телевизор С2 +1 апрель Приход
Тогда мы можем агрегировать эти операции по складу и товару и получить количество товара на заданную дату. Легко отменить операцию — просто не учитывать ее при агрегировании. Однако старые операции должны храниться только 1 год, а затем удаляться, значит мы потеряем данные. Кроме того, чтобы получить состояние складов на сегодня, придется выгружать всю таблицу операций в память, чтобы провести агрегирование — теряем в производительности.
2 вариант. Хранить и операции, и состояние товара на складе. Причем состояние товара — это версионные данные. Например:
Товар Склад Кол-во Дата
-----------------------------------
Телевизор С1 8 март
Телевизор С1 7 апрель
Телевизор С2 1 апрель
Теперь мы можем удалять старые операции и даже старые записи из таблицы состояние складов. Однако размер БД увеличивается и появляются сложности с отменой прошлых операции. Чтобы отменить операцию, нужно провести цепочку изменений в таблице состояния склада — ведь изменятся все последующие записи, связанные с данным товаром.
Вероятно, имеет право на жизнь
3 вариант, который является комбинацией 1 и 2 вариантов. В нем мы заводим табличку "базового" состояния складов, которое было до совершения первой неудаленной операции. Тогда, при удалении устаревших операций, мы применяем их к "базовому" состоянию складов. А состояние складов за определенную дату получается путем объединения "базового" состояния и операций до этой даты.
А какое Ваше мнение, господа?
Заранее всем спасибо.