以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [讨论]我想问下实现库存管理的架构思路  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=86107)

--  作者:chen3728060
--  发布时间:2016/6/10 23:30:00
--  [讨论]我想问下实现库存管理的架构思路
我所知道的库存管理实现有2个思路

 第一种思路(很多网上软件教程都爱教,容易理解):出库单,入库单,销售单,盘点单,生成时,通过修改商品档案表里对应商品的库存列。例如商品档案里,苹果的col“库存数量”有10个,然后做了销售单卖出2个后,用修改行的方式,直接修改列“库存数量”为8。

这个好处 
1查询库存很方便,直接查询商品档案对应的列就行了。 
2修改库存是针对某一行进行修改,可以用openQQ防止行的并发编辑,可以绝对得控制不会出现库存数量为负数

 但是有坏处,
 1想要查询库存往来记录,就非常麻烦,一旦库存出现差异,不查询流水记录,是无法找到原因的。或者需要弄个日志表之类的专门存放往来记录,但是这个日志表很难弄,很难可以记录清楚十几种单据具体的情况,日志内容也是当时生成的,过段时间再看,可能会因为当时日志不完整,自己都不明白做了什么事情。或者直接从那些出库单,销售单,入库单等等10多个不同单据里提速资料,但是每个表都开发一次提数,加一个新出库功能,太麻烦,一旦修改,工程量不堪设想。 
2假如太多人在出库入库并发,会因为openQQ的独占编辑,总是别其他人独占中,总是要保存几次才能成功。 

第二种思路 库存数量并不存储在某一列,而是建立一个库存流水账,库存数量靠汇总得出。出库单,入库单,销售单等等的单,保存时,把单据里所有的商品出库数量明细,例如有10行商品出库,就在库存流水账里新建对应的10行商品。

 好处
 1查询库存数量都是实时汇总出来的,有非常详细的流水记录,因为本来就是个流水账,非某列固定数字
 2接口方便。以后无论再做什么出入库功能之类的表,只要看着这个库存流水账的表架构,去新增行数据,就行了,兼容性非常出色 
3由于修改库存是新增行操作,不存在并发问题,不用像思路1那样,多人大规模并发修改某个商品,导致整天被锁,修改失败,不断重试。 

 坏处
 1无法用openQQ的独占功能实现库存永远不为负数。在思路1,修改库存时我可以判断修改后库存要不为负数,才能修改。 但是思路2,我最多可以用sqlcompute汇总对应商品库存数量,在保存前判断一下,不为负数,再新增行。但有可能在大量并发存储时,出这种问题。例如苹果只有1个,小明出库苹果1,系统sqlcompute判断没问题,1-1=0 ,正准备新增行,不过网络卡了半秒,这时这么巧小军也在出库苹果1个,sqlcompute判断,1-1=0,通过,然后新增行。最后结果就是苹果出库了2个,变成-1。
 2如果用sql事务的排他处理,就无法利用狐表的便捷语句,全部要写sql语句,大量并发时,还是会出现一直被他人锁住情况,不过不是锁住某行,而是锁住这个流水账的表。 

 请问大家思路是怎样的?不知道是不是我对库存存储架构理解得还太不足 。我目前使用思路2
[此贴子已经被作者于2016/6/10 23:33:29编辑过]

--  作者:大红袍
--  发布时间:2016/6/11 0:12:00
--  
 库存就是一个查询表。你入库、出库,就是库存的流水啊。
--  作者:chen3728060
--  发布时间:2016/6/11 7:57:00
--  回复:(大红袍)?库存就是一个查询表。你入库、...
那就是用思路2?能具体一点吗?
[此贴子已经被作者于2016/6/11 7:57:30编辑过]

--  作者:大红袍
--  发布时间:2016/6/11 14:20:00
--  

 如果要得出库存,那就统计入库的数量,减去出库的数量,就是你要的答案。

 

 如果觉得数据量太大,以前的数据可以不要,你可以每年,或者每月做一个判断,那就只需要计算本年、本月的入库和出库数据。


--  作者:流水
--  发布时间:2019/10/2 15:51:00
--  
请问 思路2 最后解决了吗?怎么解决的?
--  作者:lgzhao
--  发布时间:2021/9/21 8:47:00
--  
我也很好奇怎么解决的。
我用的是一个流水账的表。按不同产品代码,总账代码,库存地点分别计算每行的当前余额(包括数量和价值)。
好处是兼容性好,查账方便。坏处是入库写入时比较慢,要计算很多数据,特别时当入库日期为旧的日期的时候,需要修改该日期之后的所有记录的余额。

按库存价值的估值方法(会计准则里规定的),一般按平均移动均价或者先进先出算法,离开了这个总的流水账表,我觉得不可能用分表完美地实现。否则无法准确迅速地判断不同表同一个日期下各条记录之间的出入库先后关系。

不知道没有有经验的同道可以指导一下好的思路?

--  作者:lgzhao
--  发布时间:2021/9/21 8:55:00
--  
注意真正有实用价值的库存管理系统必须能记录库存价值的金额,不能仅计算库存数量。
而且必须可以查询任意历史时刻的余额,按不同地点分布。这些用分表我实在想不出怎么搞得定。特别时查询流水和余额的时候,那个计算量太大,反应时间难以保障。

另外我发现我们论坛里的所谓订单一类的例子包括狐表官方的例子,基本上不符合实际的生产使用情况。估计是凭着想像做得。所以那些个架构不具备什么参考价值。

--  作者:lgzhao
--  发布时间:2021/9/21 9:06:00
--  
难点是:按会计准则的库存算法,出库单价并不能直接获得,需要比较复杂的计算。
尤其是要考虑库存出入库的日期并不总是从老到心按顺序录入的,实际情况总是颠三倒四的。在月底调账的时候经常往前面日期插入很多记录。
这样会导致其后所有的出库单价和金额都需要重新计算。这不是简单相加的代数关系,需要迭代计算。不懂库存金额算法的道友可能看不懂我在说什么,需要看一下平均移动均价或者先进先出算法的介绍才能理解。

如果只是记录一个库存的当前数量累计,那根本算不上是真正的库存管理系统,比财务软件的库存管理还不如,用什么架构都无所谓,没有讨论的价值。

--  作者:fivetable
--  发布时间:2021/9/21 10:35:00
--  
我就是用思路二方法,正等着10万行的流水账,在计算几百行的物料的库存需秒