您将如何为 RDBMS 中的库存管理系统设计数据模型?
你会:
- 存储每次购买和使用情况,并使用 SUM() 和 GROUP BY 即时计算仓库数量?
- 同1,但是每天合并数量,使用前一天的值?
- 数量作为 Int 字段,通过应用层更新?
- 与 3 相同,但使用 DB 触发器?
基于交易的库存系统在捕获的细节水平方面似乎更胜一筹,但更难正确实施。性能会随着时间的推移而下降。
基于数量的库存系统似乎更容易,但可能需要额外的锁定以确保数量值是 ++ 或 -- 正确。
你会选哪一个?
您将如何为 RDBMS 中的库存管理系统设计数据模型?
你会:
基于交易的库存系统在捕获的细节水平方面似乎更胜一筹,但更难正确实施。性能会随着时间的推移而下降。
基于数量的库存系统似乎更容易,但可能需要额外的锁定以确保数量值是 ++ 或 -- 正确。
你会选哪一个?
我很可能会走触发路线,并在事务被推送到数据库时更新数量。这使得无需一堆子查询和计算就可以很容易地查看当前数量。
如果它是在触发器中完成的,那么您可以确保无论交易来自何处,您的库存表中的数量都将始终更新(无论是通过硬插入还是通过应用程序添加的交易)。
如果存在日志记录问题,则将一些日志记录包装到您的触发器中,以将之前/之后的数量跟踪到单独的日志记录表中。
触发器可能如下所示(未经测试):
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
只要您为 ID 和 Stock 字段正确编入索引,我认为不会有性能问题需要担心StockTable
(鉴于您没有提供任何数据库信息)。
如果审计跟踪很重要,您需要交易数据。而且,我从未见过真正的系统不是这样的。
就性能而言,我会:
那么总计将是这个非规范化值和当前交易的总和。
这种方法还有助于备份,因为事务记录的数量可能超过可用磁盘空间。因此,例如将仓库写入磁带备份。