我的数据库有2个表1.清单属性为 ID, Name, QOH (即手头的数量)
- INVENTORY_ADJUSTMENT属性为 Date, AdjQty, QOH, Notes
每次出售或购买库存物品时,我都会在INVENTORY_ADJUSTMENT中输入一个条目 . 此时我还计算库存并更新INVENTORY和INVENTORY_ADJUSTMENT中的QOH .
到目前为止,这一切都很好 . 但现在一些客户有一个要求,他们想要回去一个月并更新手头的数量 . 所以对于ex:4月10日,用户可以返回并更改3月1日的QOH . 如果允许这样做,那么我在3月1日到4月10日之间在INVENTORY_ADJUSTMENT表中创建的每个条目也需要更新,因为INVENTORY_ADJUSTMENT的每一行都有QOH字段,现在它将不同步 .
如何支持允许输入过时库存数量的功能?任何帮助都感激不尽 .
1 回答
问题
首先,您需要了解问题,问题是什么,以及您是否已创建问题 . 之后我们将有不同的背景,并可以讨论可能的解决方案 .
Inventory
是硬性的,永久性的事实表 . 这个想法是,在任何时候,如果建筑物冒烟,表格最终确定公司库存的位置 .InventoryAdjustment
表只是针对Inventory
表的公司库存的交易 . 它可能被命名为Transaction
.InventoryAdjustment.QoH
列是重复列 .QoH
已存在Inventory
中 . 创建重复列时,您具有:破坏了规范化规则(因此您有一个众所周知的经典错误,我们被命令避免,并且会产生后果) . 您的表不再标准化,您的数据库不是数据库 .
引入了更新异常 . 这意味着你必须在多个地方更新数据(真值的单一版本的值),否则两个(或更多)项目会“不同步” . 这个想法是,不要首先创建副本 .
如果你已经实现它以提供一个总计(连续行中的
InventoryAjustment.QoH,
),你一直在欺骗自己 . 在SQL代码中可以轻松提供运行总计(Inventory.QoH
以及直到当前行的所有调整) . 如果需要,请求它 .现在你已经习惯了这种错误的事态,你不认为它是一个错误,它到现在为止“工作得很好” . 所以你可能很难接受这是一个错误 . 我会离开你,让你克服 .
关键词是“到现在为止” . 传统上,只有在暴露错误或用户想要更改某些内容时,才会出现此类错误 . 首先,他们需要被揭露和理解他们是什么 .
事件刚刚发生,上面已经触发了 .
解决方案
删除
InventoryAdjustment.QoH
列 .每当插入
InventoryAdjustment
行时,保留重新计算和更新Inventory.QoH
列 .现在
Inventory.QoH
列是 true ,它始终是真的 . 它现在反映了仓库中的确切QoH .不需要“同步”,因为没有两个版本的真相,或一个真相的两个副本,存档 .
故事结局 .
新用户要求
现已更正的数据库处理它就好了 .
注意,由于数据库已经更正,因此只有一个QoH . 如果没有得到纠正,我们必须停下来问:
应用程序需要稍微调整一下 . 我假设当前函数将
InventoryAdjustment.Date
设置为插入前的当前日期 .添加一个函数以允许特权用户(例如,为了允许这个而被授予"supervisor"权限的人)到过去的有效日期,将其约束为(例如)30天或其他什么 .
当事务执行时,它将以通常的方式调整
Inventory.QoH
.故事结局 .
(如果不是,则表明存在相关性尚未传达的细节 . 请这样做 . )
创可贴修复
如果您不理解(a)错误的性质,以及(b)更正的准确性,即 . 你很乐意保留它,然后......
是 .
这是更新异常的结果 . 无论如何,调整后的项目的所有重复的
InventoryAdjustment.QoH
值现在都被认为是假的 . 记录它们没有,也没有任何 Value . 但你确实记录了它们 . 现在他们需要更新 .编码吧 .