数据库设计问题 - 在现有计算中使用检查点

时间:2010-08-30 12:42:55

标签: database-design inventory-management

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

您所描述的整体方法似乎没问题,但您需要关注边缘情况会发生什么。仅举一个例子,想想在以下场景中会发生什么:

  1. 项目“A”的现有数量为1.
  2. 客户订购1个“A”单位。现有数量现在为0.(1减1销售的检查点)
  3. 确定检查点。 “A”的数量现在固定为0个单位。
  4. 项目“A”因某种原因无法发货给客户(客户的付款方式遭拒,客户取消订单等)。
  5. 项目“A”现在需要恢复以显示现有数量1.删除“销售”记录将不会执行任何操作,因为它已在检查点之前记录。
  6. 在这种情况下,有几个解决方案可以工作(修改检查点值,或者更好的是,发布一个“恢复”记录,以便有一个审计跟踪),但这只是你应该考虑的事情的一个例子这种方法。