我所知道的库存管理实现有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编辑过]