Структура таблицы управления запасами

Нашей команде необходимо отслеживать запасы, по сути, для собственной ERP-системы. Нам потребуется часто получать доступ к количеству запасов в системе для данного товара на заданном складе и иметь возможность отслеживать, что и когда изменило запасы.

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

Наша новая идея состоит в том, чтобы иметь таблицу корректировок с историей, а также вести таблицу с текущими запасами. При внесении корректировок наша программа одновременно обновляет как таблицу корректировок, так и таблицы текущих запасов. Мне не очень нравится это решение, так как для внесения одного изменения требуется 2 обновления. Что, если один потерпит неудачу? Как вы согласовываете, когда корректировки не отражают то, что находится в таблице запасов?

У кого-нибудь есть лучший подход?


person pinguinos    schedule 07.01.2013    source источник
comment
Я рекомендую вносить обновления в транзакцию, поэтому, если одно обновление завершится успешно, а другое завершится ошибкой, оба будут отменены.   -  person Marlin Pierce    schedule 07.01.2013
comment
Вы также можете использовать триггер на вставку одной таблицы, тогда обновление в текущей таблице сделает вставку в историю   -  person wishper    schedule 07.01.2013
comment
Я не могу обернуть их обоих в транзакцию из-за дизайна программы. Вы можете обновлять только одну таблицу за раз (я знаю, глупый дизайн... Я работаю над его изменением, но это займет некоторое время).   -  person pinguinos    schedule 07.01.2013


Ответы (1)


Если вы не можете выполнить все необходимые обновления за одну транзакцию, вам потребуется административная процедура (в отличие от декларативного ограничения), чтобы убедиться, что данные верны. Например, вы можете запустить задание cron, которое проверяет итоги на соответствие деталям. Как часто вы это делаете, зависит от того, как долго выполняется задание cron, и как долго задание cron может выдержать ваше приложение.

Я бы предпочел триггер в таблице сведений плюс периодическое задание cron. Пусть триггер корректирует итог для каждой транзакции. Задание cron следит за тем, чтобы обновления не были пропущены. (Большинство СУБД позволяют вам отключать триггеры для обслуживания; задание cron напомнит вам, когда вы неизбежно забудете включить их снова.)

person Mike Sherrill 'Cat Recall'    schedule 07.01.2013