架了个库存相关的数据库,结构上感觉有一些不妥和疑惑,欢迎大家给予校正!
有个库存系统的数据库设计方案,在部分地方有些疑惑;这方面有经验的同志解解惑!
-------------------------------------
1. 期间表(会计年度,期间,是否结帐,是否启用)
2. 货品表(物料ID,名称,规格,...)
3. 期初表(仓库ID,物料ID,期初数)
4. 当前库存表(仓库ID,货品ID,当前存量)
5. 历史结存表(会计年,期间,物料ID,期初数,总入,总出,调整数,实存)
** 入库单(单头/明细)表...出库单(单头/明细)表...调拔单(单头/明细)表..这些必备的结构就暂略了.
-------------------------------------
上述表中:
表3,表达的是当系统开帐前,录入的当前的仓库实存(由初始化时1次性写入,之后才算启用帐)。
表4,存放当前库存实际数量,在库存每笔业务发生(出库/入库/调拔)时,自动计算更新实存,算法如:
当前存量=表5中的上1个会计期间的结存数+(入库+调入)-(出库+拔出)
建这个表,主要是为了方便实时查询,比如新出库的时候,较方便的知道当前库存量...
-------------------------------------
想咨询一下:
1.在这里,3和4似乎重复,究竟是放一张表里,还是独立的表?有没有必要保留开帐时的期初值?
2.历史结存表,这样的结构合不合理?(主要为了方便查询各期间的情况,其值由月结时写入)
3.如果2是合理的,这里面放着N个会计期间的存货情况(假设有2年的数据,1W个物理,那起码都有24W条).每次计算当前库存时,都要到里面去查上1期结存,然后再加减...似乎不是很方便,似乎要改改,有没有必要再加个本期期初表..?
这几天一直在查用友U8的表,数百张表,,用事件跟踪器来分析数据...没分析个所以然结果先把自己搞晕了...汗!
以上列表,纯属个人瞎蒙,欢迎大家的建议,谢谢!....等着改正...
[解决办法]
学习
[解决办法]
1.在这里,3和4似乎重复,究竟是放一张表里,还是独立的表?有没有必要保留开帐时的期初值?
----------------------
以前我们的做法是,如果九月份系统上线,就把期初值导成8月份的入库单,入库表有触发器,自动生成库存
2.历史结存表,这样的结构合不合理?(主要为了方便查询各期间的情况,其值由月结时写入)
-------------
这个是每月月底月结后生成的吧,我们也有
3.如果2是合理的,这里面放着N个会计期间的存货情况(假设有2年的数据,1W个物理,那起码都有24W条).每次计算当前库存时,都要到里面去查上1期结存,然后再加减...似乎不是很方便,似乎要改改,有没有必要再加个本期期初表..?
---------------
上个月月结后的库存不就是本月的期初么?
[解决办法]
库存系统要期间表做什么呢?财务才要期间吧.
如果是想做结存的话,可以每月生成一次库存快照保存起来
[解决办法]
个人认为这样设计无不妥
1.在这里,3和4似乎重复,究竟是放一张表里,还是独立的表?有没有必要保留开帐时的期初值?
你说明了,3和4是不同用途的,3时开账的数据,4是实时数据,3最好加多个日期字段,放开账日期,系统应该限制开账日期前的日期的出现.4的实时性不知道你考虑过没有如何保证,触发器也许是个选择.
2.历史结存表,这样的结构合不合理?(主要为了方便查询各期间的情况,其值由月结时写入)
这里的历史结存表我理解应该是个盘点表,因为有输入的调整数而使得这个表不能省略.
3.如果2是合理的,这里面放着N个会计期间的存货情况(假设有2年的数据,1W个物理,那起码都有24W条).每次计算当前库存时,都要到里面去查上1期结存,然后再加减...似乎不是很方便,似乎要改改,有没有必要再加个本期期初表..?
数据多了就备份 删除 没有必要在加个本期期初表,因为这个历史结存表只有在查询历史库存的时候用到,其他时候都是查询表4的
[解决办法]
1不加不加吧,本来就没大用
2我觉得盘点表可以和月结表合并
3当前库存表没必要吧
[解决办法]
有点多,库存的话 我只知道一张是 月结表,还有一张是出入库表,任何一天的库存都可以通过这两个表查出来,每月一结
[解决办法]
3.4.5合并为一张表!
[解决办法]
1.在这里,3和4似乎重复,究竟是放一张表里,还是独立的表?有没有必要保留开帐时的期初值?
----------------------------
当然有必要保留开张时的期初值。有时候,因为业务操作的失误,我以前碰到一个强人,半年不出库,只入库的,导致年终盘点的时候盘亏几千万,这个时候如果没有期初值,如何调整?
对于4,可以不用,但是用到会增强系统的查询速度,如果用触发器来做的话,会增加每次如出库时用户等待的时间。并且如果用户进行了错误的操作,需要回退的时候,也挺麻烦的。不过我们还是用了,毕竟在有大量数据的时候,还是利大于弊。
2.历史结存表,这样的结构合不合理?(主要为了方便查询各期间的情况,其值由月结时写入)
----------------------------
我认为是合理的,我们以前就是这样的。
3.如果2是合理的,这里面放着N个会计期间的存货情况(假设有2年的数据,1W个物理,那起码都有24W条).每次计算当前库存时,都要到里面去查上1期结存,然后再加减...似乎不是很方便,似乎要改改,有没有必要再加个本期期初表..?
-----------------------------------
1W个物料,那就每个期间也就1W,不是24W,本期期初就是上期结存。对于查找1W条记录,对Sql Server来说应该是小意思。当然,如果需要统计2年的入出库总和的话,那就需要查找24W,但这个是没有办法的,如果需要这样做的话,还不如增加一个字段,叫做累计出库总数,累计入库总数。
[解决办法]
缩减后应该这样就可以应付.
1.物品表
(物料ID,名称,规格,当前数量,等等)
2.调用表
ID,物品ID,调用时间,调用人,调用前结余数量,调用后结余数量,其它
使用时,物品表默认当前数量为0,如果有涉及到现有库存,在调用表中操作增加或删除记录即可.然后把2个表都修改.
[解决办法]
up
[解决办法]
1.在这里,3和4似乎重复,究竟是放一张表里,还是独立的表?有没有必要保留开帐时的期初值?
--------------------------------
这点需要保留是毋庸质疑的,比如需要重新全部核算数据的时候,成本计算等时候,是需要有开帐的期初数的。
2.历史结存表,这样的结构合不合理?(主要为了方便查询各期间的情况,其值由月结时写入)
--------------------------------
这个我的感觉,是属于延续了财务帐的做法,当然大多数的库存类管理软件是不会这样做的。
用友U8系统我们也在研究,直接对数据库写某些单据,简化工作流程,期间就发现不少的数据结构是属于符合财务帐的,呵呵。
3.如果2是合理的,这里面放着N个会计期间的存货情况(假设有2年的数据,1W个物理,那起码都有24W条).每次计算当前库存时,都要到里面去查上1期结存,然后再加减...似乎不是很方便,似乎要改改,有没有必要再加个本期期初表..?
--------------------------------
这个,不是有一个当前库存表么?保留这个历史数据,感觉就是完全延续了财务帐的管理手段。记录每个时期的库存结存数。这样比较好的能够区别出现不同时期的库存体现,比如库存的盘亏盘赢变化,仓储部门的工作、管理效率等。起码是为日后深度发掘数据做个好的开端。
这个表日常应用不大,既然应用少,数据大点也没有关系哈。
[解决办法]
至于每月结余的表要不要做,关键还是看调用表的数据量.
我刚测试了MSSQL的性能.
如果字段较少,几个,而且CPU是双核的+专门给1.5G内存MSSQL使用.
处理1600W条记录的表(只是一个表哦,其它表有大量记录可得再加内存),可以控制在711M内存,初次调用19秒,平均调用10秒,编号调用3秒的速度.distinct(WHERE局部数据)调用6分56秒返回310512条记录.
[解决办法]
好贴做个记号,这个我以前做过,有些人认为不设计一个单独的库存表,库存由明细帐计算而得,但是计算时速度慢呀。所以也加了一个实时库存表,正常情况下应该与明细帐一致的,如果不一致,就是有问题出现,所以我也设一个存贮过程,用于查错,就是检测库存实时表与库存明细帐是否一致,因为必须有明细帐,能查出每一笔的来胧去脉,每月月结时会自动检测实时库存与明细帐是否一致,不一致一让结帐.
[解决办法]
1.将表3与4合并,不建议这样做,
其初值一般只是一次性输入,反应的是建帐时期初数据,所以不建议这样做
2.应该算是合理办
3.面对数据量大的问题,可不可以把每年数据分开来放,很多ERP软件的思路都是这样的
所以才有了年度结转这一说
如果不单独生成数据库的话,可以考虑每年的历史结存表单独创建表,并建一个表保存这些表与年度的相应信息,方便跨年度查询