库存系统:基于交易或存储数量,带触发更新?

时间:2011-03-17 14:25:18

标签: coldfusion transactions rdbms inventory inventory-management

您将如何为RDBMS中的库存管理系统设计数据模型?

你愿意:

  1. 存储每次购买&用法,并使用SUM()和GROUP BY来实时计算仓库数量?
  2. 与1相同,但每天合并数量,并使用前一天的值?
  3. 作为Int字段的数量,通过应用层更新?
  4. 与3相同,但是使用DB触发器?
  5. 基于交易的库存系统在捕获的详细程度方面似乎更优越,但更难以正确实施。性能会随着时间的推移而降低。

    基于数量的库存系统似乎更容易,但可能需要额外的锁定以确保数量值为++或 - 正确。

    你会选择哪一个?

2 个答案:

答案 0 :(得分:2)

我很可能会进入触发路径,并在事务被推入数据库时​​更新数量。这使得很容易看到当前数量是多少而不需要一堆子查询和计算。

如果在触发器中完成,那么您可以确保无论交易来自何处,库存表中的数量将始终更新(是否通过硬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字段正确编入索引就会担心性能问题(我当然会把这一切都搞砸了)鉴于您没有提供任何数据库信息)。

答案 1 :(得分:2)

如果审计跟踪很重要,您需要事务数据。而且,我从来没有见过真正的系统。

就表现而言,我会:

  1. 定期捕获非规范化值 - 例如每小时或每天
  2. 将此非规范化过程中涉及的事务记录移动到另一个表(即从“当前”到“仓库”)。
  3. 然后总计将是此非规范化值和当前事务的总和。

    此方法还有助于备份,因为事务记录的数量可能超过可用磁盘空间。因此,请将仓库写入磁带备份。