0

我一直在考虑计算给定库存项目的现有单位数量的最佳方法。这些表格将非常大,包含许多交易,因此通过添加所有收货并减去所有发货和销售来计算按需计算可能不现实。我遇到的一个想法是定期创建检查点,即项目和现有数量的记录。任何后续的现有数量计算都从检查点开始,无需对所有交易求和。

inventory item table  
id | location | item   
1    1          234
2    1          567 

receiving table
inv item | stamp      | quantity
1          2010-08-10   200
1          2010-08-30   10
2          2010-08-30   20

shipment table 
inv item | stamp      | quantity
1          2010-08-10   40
1          2010-08-30   5
2          2010-08-30   2

sale table 
inv item | stamp      | quantity
1          2010-08-10   10
1          2010-08-15   15
1          2010-08-30   1
1          2010-08-30   1
2          2010-08-30   2

checkpoint table
inv item | stamp      | quantity
1          2010-08-11   150
1          2010-08-28   135
2          2010-08-15   15

在 8/30 上计算 inv 项目 1 的手头将是这样的

get most recent checkpoint(inv item 1, 8/30) returns 135 units on 8/28
on-hand = 135 + receivings - (shipments + sales) 
only rcv/shp/sales that occur between the most recent checkpoint 8/30

在 8 月 14 日计算 inv 项目 1 的手头将是这样的

get most recent checkpoint(inv item 1, 8/14) returns 150 units on 8/11
on-hand = 150 + receivings - (shipments + sales) 
only rcv/shp/sales that occur between the most recent checkpoint and 8/14

我的问题是,这种方法会带来什么样的问题?除了将现有数量存储在表格中之外,还有其他更好的方法来处理大量事务集吗?将现有数量存储在表中是否与检查点方法几乎相同,如果通过触发器或某种信号进行更新,可能更不容易出错?

4

2 回答 2

0

而不是“检查点”,我会考虑构建汇总表,您可以在其中以某个间隔汇总现有库存值(以及您需要的任何其他值)。此时间间隔可以是每天一次,您可以运行长时间运行的过程以在夜间批处理作业中构建汇总表,这样您的用户就不会受到影响(假设您的用户在白天使用此数据)。

如果您需要更频繁地刷新数据,您可以每天使用同一个批处理作业多次刷新汇总表。但是,为了最大程度地减少数据不可用性,您实际上可以有 2 组汇总表,一组是您与查询一起加载的(由于查询运行时间很长,因此需要很长时间才能加载),以及您在报告。但是,一旦查询完成,您只需将表从第一个汇总表加载到第二个汇总表(这是一个非常快速的操作,因为您只是转储数据),因此停机时间最短。所以总的来说,这个过程看起来像这样:

  1. summary1使用库存数据加载表。这是您运行查询以执行“繁重工作”的地方。
  2. 查询完成后,summary2summary1. 这将是您的用户唯一会遇到的停机时间,因为即使在summary1加载期间,他们仍然会报告summary2,这不会受到影响。
于 2010-08-30T12:51:59.663 回答
0

您描述的整体方法似乎很好,尽管您需要关注边缘情况可能发生的情况。仅作为一个示例,请考虑在以下情况下会发生什么:

  1. 项目“A”的现有数量为 1。
  2. 客户订购 1 个单位的“A”。现有数量现在为 0。(1 减 1 销售的检查点)
  3. 检查点确定。“A”的数量现在固定为 0 个单位。
  4. 商品“A”由于某种原因无法发货给客户(客户的付款方式被拒绝,客户取消订单等)
  5. 现在需要恢复项目“A”以显示现有数量 1。删除“销售”记录不会做任何事情,因为它是在检查点之前记录的。

在这种情况下,有几个可行的解决方案(修改检查点值,或者更好的是,发布“还原”记录以便有审计跟踪),但这只是您应该使用这种方法考虑的事情的一个示例。

于 2010-08-30T12:55:03.213 回答