【问题标题】:Database design question - using checkpoints in the calculation of on-hand数据库设计题——在手头计算中使用检查点
【发布时间】:2010-08-30 12:42:55
【问题描述】:

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

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 item 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 item 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

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

【问题讨论】:

    标签: database-design inventory-management


    【解决方案1】:

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

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

    1. 使用库存数据加载表summary1。这是您运行查询以完成“繁重工作”的地方。
    2. 一旦查询完成,从summary1 加载表summary2。这将是您的用户遇到的唯一停机时间,因为即使在加载 summary1 期间,他们仍然会报告 summary2,这不会受到影响。

    【讨论】:

      【解决方案2】:

      您描述的整体方法似乎很好,但您需要关注边缘情况可能发生的情况。仅举一个例子,想想在以下情况下会发生什么:

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

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

      【讨论】:

      • 您认为检查点方法总体上是否比在每次交易后更新存储的现有值更便宜?
      猜你喜欢
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多