2

我的数据库有 2 个表 1. 具有ID、名称、QOH属性的库存(即手头数量)

  1. 具有Date、AdjQty、QOH、Notes属性的 INVENTORY_ADJUSTMENT

每次出售或购买库存商品时,我都会在 INVENTORY_ADJUSTMENT 中输入一个条目。此时,我还计算手头库存并更新 INVENTORY 和 INVENTORY_ADJUSTMENT 中的 QOH。

到目前为止,这工作得很好。但是现在一些客户有一个要求,他们想返回一个月并更新手头的数量。例如:4 月 10 日,用户可以返回并更改 3 月 1 日的 QOH。如果允许这样做,那么我在 3 月 1 日至 4 月 10 日期间在 INVENTORY_ADJUSTMENT 表中创建的每个条目也需要更新,因为 INVENTORY_ADJUSTMENT 的每一行都有 QOH 字段,该字段现在将不同步。

我如何支持允许输入回溯库存数量的功能?任何帮助都感激不尽。

4

1 回答 1

4

问题

首先,您需要了解问题,它是什么,以及您已经创建了它。之后,我们将有不同的背景,并可以讨论可能的解决方案。

  1. Inventory是硬性的、永久的事实表。这个想法是,在任何时候,如果建筑物冒烟,表格最终会确定公司库存的位置。

  2. InventoryAdjustment表只是针对公司库存的交易,针对该Inventory表。它可能被命名为Transaction.

  3. InventoryAdjustment.QoH列是重复的列。QoH已经存在Inventory于. 创建重复列时,您有:

    • 违反规范化规则(因此您有一个众所周知的经典错误,我们被要求避免,并且会产生后果)。您的表不再规范化,您的数据库不是数据库。

    • 引入了更新异常。这意味着您必须在多个位置更新数据(即事实的单一版本的值),否则这两个(或更多)项目会“不同步”。这个想法是,首先不要创建重复项。

    • 如果您实施它是为了提供一个运行总计(InventoryAjustment.QoH,连续行),那么您就是在自欺欺人。运行总计(Inventory.QoH加上当前行的所有调整)很容易在 SQL 代码中提供。要求它,如果你需要它。

现在你已经习惯了这种错误的状态,你不认为它是一个错误,它到目前为止“工作得很好”。所以你可能很难接受这是一个错误。我会把它留给你去克服。

  • 关键术语是“到现在”。传统上,只有当一个错误暴露出来,或者当用户想要改变某些东西时,这样的错误才会成为一个问题。所以首先,他们需要被揭露和理解他们是什么。

  • 事件刚刚发生,上面已经触发了。

解决方案

  • 删除InventoryAdjustment.QoH列。

  • Inventory.QoH每当InventoryAdjustment插入行时,保留对列的重新计算和更新。

  • 现在该Inventory.QoH列是true,并且一直是 true 。它反映了现在仓库中的确切 QoH。

  • 不需要“同步”,因为文件中没有事实的两个版本或一个事实的两个副本。

故事结局。

新用户需求

现在一些客户有一个要求,他们想回去一个月并更新手头的数量。我如何支持允许输入回溯库存数量的功能?

  • 现在更正的数据库处理得很好。

    • 请注意,由于数据库已更正,因此只有一个 QoH。如果它没有得到纠正,我们将不得不停下来问:

      他们希望更新哪个 QoH,运行总数,还是真实的,或两者兼而有之?
      它有什么用途?

  • 该应用程序需要一些调整。我假设当前函数InventoryAdjustment.Date在插入之前设置为当前日期。

    • 添加一个功能以允许特权用户(例如,为了允许此操作而被授予“主管”权限)到set InventoryAdjustment.Date过去的有效日期,将其限制为(例如)30 天或其他任何时间。
  • 当事务执行时,它将Inventory.QoH以通常的方式进行调整。

故事结局。

(如果不是,则表明存在尚未传达的相关细节。请这样做。)

创可贴修复

如果您不了解 (a) 错误的性质,以及 (b) 更正的真实性,即。您很乐意保留它,然后...

如果允许这样做,那么我在 3 月 1 日至 4 月 10 日期间在 INVENTORY_ADJUSTMENT 表中创建的每个条目也需要更新,因为 INVENTORY_ADJUSTMENT 的每一行都有 QOH 字段,该字段现在将不同步。

是的。

这是更新异常的结果。无论如何,调整项的所有重复InventoryAdjustment.QoH值现在都被视为错误。记录它们没有,也没有任何价值。但你确实记录了它们。现在他们需要更新。

编码它。

于 2015-04-18T10:40:41.423 回答