【问题标题】:Managing Product Inventory in SQL Server在 SQL Server 中管理产品库存
【发布时间】:2016-12-12 13:09:11
【问题描述】:

我无法理解有关在 SQL Server 中管理库存之类的概念。

我需要确保处理 3 个用例:

  1. 添加新库存
  2. 移除库存
  3. 将库存从一个位置移动到另一个位置

我试图弄清楚下表是否真的足以跟踪上述 3 笔交易。

这是一个简单的表结构:

  • Inventory: (Id, LocationId, ProductId, 数量)
  • Product: (Id, Name)
  • Location: (Id, Name)

有了这些数据,我想弄清楚几件事:

对于单个产品,我能否看到可用的总计?

SELECT p.Name, SUM(i.Quantity) AS QuantityOnHand 
FROM Inventory i
INNER JOIN Product p ON i.ProductId = p.Id
WHERE i.ProductId = 1
GROUP BY p.Name

对于单个产品,我能否查看位置 A 和位置 B 有多少可用?

SELECT p.Name, SUM(i.Quantity) AS QuantityOnHand 
FROM Inventory i
INNER JOIN Product p ON i.ProductId = p.Id
WHERE i.ProductId = 1 AND i.LocationId = 3
GROUP BY p.Name

我能否跟踪入住和退房的历史记录?
这是我开始感到困惑的部分......

这是值得有一个库存标题表的地方吗?或者,由于采购订单和销售订单是用户签入和签出产品的主要方式,因此不需要 InventoryHeader 表。

我的主要担忧是我害怕在没有任何这些交易记录的情况下不断更新 Inventory 表上的 Quantities。此日志通常保存在采购订单(签入)和销售订单(签出)中吗?

我只是觉得如果我使用 InventoryHeader 和 InventoryDe​​tail 方法,InventoryDe​​tail 表中将包含大量记录,如果不逐个检查,我将无法查询当前有多少个项目InventoryDe​​tail 做 SUM(Credits) - SUM(Debits)

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您可以保持库存表原样并拥有一个inventoryTransactions 表,然后在事务表上使用触发器来在事务进出时更新库存表。这样,您将在 transactions 表中拥有完整的审计历史记录,但从库存表中读取更小、更有效的数据。您显然需要确保用户不能对库存表执行任何写入操作,并且只能由触发器写入。

    【讨论】:

    • 所以你说我会创建一个名为 InventoryTransaction 的表,其中包含列(Id、InventoryId、Date 等)?那么每次添加一个项目时都会触发更新或添加到 Inventory 表中?是否可以向触发器发送库存记录所需的参数,例如 ProductId 和 LocationId,因为我不会将它们存储在 InventoryTransaction 表中?
    • 嗯,在研究并找到与您告诉我要做的非常相似的帖子后:stackoverflow.com/questions/287097/inventory-database-design 我相信我只需要一张没有标题的表 InventoryTransaction。他们说需要几秒钟才能得到一个产品的总和。还有其他建议吗?也许像你说的那样做两张桌子会很好,所以我总是可以很快地从一张桌子上拉出来。
    • 如果用户将库存项目从一个位置移动到另一个位置,我会创建两个 InventoryTransaction 记录吗?假设位置 A 有 10 辆自行车,位置 B 有 10 辆自行车。用户将 5 辆自行车从位置 A 移动到位置 B。我想我会更新 ProductId 和 LocationId 匹配的 Inventory 表,然后创建一个 InventoryTransaction(w/ InventoryId对于位置 B),其中到位置 B 的数量为 5,另一个 InventoryTransaction(对于位置 A 带有 InventoryId),其中从位置 A 的数量为 -5。
    • 是的,这似乎是正确的。阅读您链接到的帖子,他们倾向于存储所有交易并将手头的库存计算为这些交易的总数。如果您可以确定您的数据库将具有足够的性能,那就太好了。他们对我建议的“现有库存”表的主要担忧是它可能与交易总额不同步。首先,我认为如果触发器正在更新它,这是非常不可能的,其次,您可以通过让触发器将手头的库存计算为所有交易的总和来避免这种情况。
    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 2018-11-20
    相关资源
    最近更新 更多