Задачка: модель данных для склада с версионностью
От: ronaldo9  
Дата: 03.06.10 06:15
Оценка:
Здравствуйте.

У меня вопрос по проектированию модели данных для складов. Общие требования к разрабатываемой системе такие:
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 вариантов. В нем мы заводим табличку "базового" состояния складов, которое было до совершения первой неудаленной операции. Тогда, при удалении устаревших операций, мы применяем их к "базовому" состоянию складов. А состояние складов за определенную дату получается путем объединения "базового" состояния и операций до этой даты.

А какое Ваше мнение, господа?
Заранее всем спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.