Система инвентаризации: на основе транзакций или количества магазинов, обновление с помощью триггера? - PullRequest
2 голосов
/ 17 марта 2011

Как бы вы спроектировали модель данных для системы управления запасами в СУРБД?

Не могли бы вы:

  1. хранить каждую покупку и использование и использовать SUM () и GROUP BYчтобы вычислить количество на складе на лету?
  2. тоже самое, что и 1, но ежедневно консолидировать количество и использовать значение предыдущего дня?
  3. количество в качестве поля Int, обновить черезприкладной уровень?
  4. такой же, как 3, но использовать триггер БД?

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

Система инвентаризации на основе количества выглядит намного проще, но могут потребоваться дополнительные блокировки, чтобы убедиться, что значение Qty равно ++ или - правильное.

Какой бы вы выбрали?

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

Вам нужны транзакционные данные, если важен контрольный журнал.И я никогда не видел реальную систему там, где ее не было.

Что касается производительности, я бы:

  1. периодически собирал денормализованное значение - например, ежечасно или ежедневно
  2. перемещал записи транзакций, связанные спроцесс денормализации в другую таблицу (т. е. из «текущего» в «склад»).

Тогда итоговой суммой будет сумма этой денормализованной стоимости и текущих транзакций.

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

2 голосов
/ 17 марта 2011

Скорее всего, я бы пошёл по триггерному маршруту и ​​обновил бы количество, когда транзакции помещаются в базу данных. Это позволяет легко увидеть текущее количество без необходимости в подзапросах и вычислениях.

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

Если есть проблемы с журналированием, то включите регистрацию в триггер для отслеживания количества до / после в отдельной таблице журналирования.

Триггер может выглядеть так (не проверено):

CREATE TRIGGER [dbo].[OrderAdded] 
   ON  [dbo].[Orders] 
   AFTER INSERT
AS 
BEGIN
    DELCARE @ProductID int; DECLARE @Qty int;
    SET @ProductID = (SELECT ProductID FROM inserted);
    SET @Qty = (SELECT Qty FROM inserted);
    UPDATE StockTable 
    SET Stock = Stock - @Qty
    WHERE ID = @ProductID

END

Я не вижу проблем с производительностью, о которых стоит беспокоиться, если вы правильно индексировали StockTable для поля ID и Stock (я, конечно, все это придумываю, учитывая, что Вы не предоставили никакой информации БД).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...