热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

关于库存表的设计。如果取得当前库存的问题。

关于库存表的设计。如果取得当前库存的问题。一般的进销存的表设计涉及到到订单和仓库表。示意性的大概表结构是这样的:订单表:Order------------------Id
关于库存表的设计。如果取得当前库存的问题。

一般的进销存的表设计涉及到到订单和仓库表。
示意性的大概表结构是这样的:

订单表:Order
------------------
Id  CustomerId OrderDate 。。。

订单明细表:OrderItem
------------------
Id OrderId ProductId Quantity Price  。。。

入库表:InStock
-----------------
Id   stockDate

入库明细表:InStockItem
-----------------
Id InStockId ProductId  Quantity 。。。


(当然还有报损,盘点,丢失,借入借出等表。这里
为了简单起见,不考虑这些)

如果现在要得到某个商品的当前库存,需要汇总此商
品所有入库表的数量-所有订单表的数量,如果数据量
大,这样的计算量是不现实的。

可能考虑加一个如下的库存表

库存表: Repertory
-----------------
ProductId  CurrentQuantity

每次入库和确认销售订单时都对库存表的相应产品数量
进行变更,需要取得某商品的当前库存,直接从库存表
就能得到,但是这个CurrentQuantity字段让我感觉很不
爽,因为关于库存数量,现在就有两笔帐,1.通过汇总入
库数量-汇总订单数量。2.库存表直接记录的当前数量,
一旦两个数对不上,鬼知道是怎么回事儿。人为串改还是
系统故障,上帝都素手无策。

后来我觉得我可以这样设计,增加一个出库变动表。

库存变动表:StockEvent
-----------------
Id EventType EventDate。。。
(EventType可以用来表示订单销售,盘盈盘亏,丢失,借入借出等)

库存变动明细表:StockEventItem
-----------------
Id StockEventId EventId  ProductId  Quantity  CurrentQuantity 。。。
  EventId:用来关联引起库存变动起因表的ID,比如因销售订单造成的出库,
          OutId就关联Order表的Id。
  Quantity:出库数量,对应销售订单的情况,就是订单数量
  CurrentQuantity:当前库存数。


每当有订单销售,盘盈盘亏,丢失,借入借出等时,都相应的增加
StockEvent和StockEventItem表记录,并更新当前库存。

这样感觉模仿了手工记账时代的做法。
好处就是,取得某个商品当前库存时。直接取得该商品最后一条
StockEventItem表记录就可以了,而且每笔库存变动,都有相应的
StockEvent记录。


不知道这样的设计有哪些问题?
谢谢大神指教。

12 个解决方案

#1


库存变动不用记录每笔明细,这属于出库单/入库单的明细信息。

库存日记账(日期,ProductId,采购数,销售数,借入数,借出数,盘点差,……,结余数)主键(日期,ProductId)
用来存放每日的出入库统计,还可以查询某天的库存余额(可以是历史的、还可以是将来预测的)。

至于库存表就是把今天的(ProductId,结余数)同步过来,是为了查询的性能考虑。

#2


引用 1 楼 Tiger_Zhao 的回复:
库存变动不用记录每笔明细,这属于出库单/入库单的明细信息。

库存日记账(日期,ProductId,采购数,销售数,借入数,借出数,盘点差,……,结余数)主键(日期,ProductId)
用来存放每日的出入库统计,还可以查询某天的库存余额(可以是历史的、还可以是将来预测的)。

至于库存表就是把今天的(ProductId,结余数)同步过来,是为了查询的性能考虑。


这个方案是纯照搬手工记账法。
首先日记账的字段(采购数,销售数,借入数,借出数,盘点差)不利于扩展,以后增加新的库存变动
原因(比如借入借出),需要更改表结构,感觉不太好吧。
另外主键(日期,ProductId),是不是考虑日结的方式?类似有个后台程序每天晚上自动运行汇总?
这样不能反映库存的实时变化。

但总体上来说,我们的方案还是相同的。

#3


加一种原因就必须加个业务数据表,这里加个字段算不了什么。

无论做什么业务,必须要有出库单/入库单,执行这个业务的时候 同时更改记账表啊,哪里需要后台程序!
你原先改库存表结余数一个字段,现在只不过同时多改几个字段而已。

#4


引用 3 楼 Tiger_Zhao 的回复:
加一种原因就必须加个业务数据表,这里加个字段算不了什么。

无论做什么业务,必须要有出库单/入库单,执行这个业务的时候 同时更改记账表啊,哪里需要后台程序!
你原先改库存表结余数一个字段,现在只不过同时多改几个字段而已。


如果每笔业务都更新日记账表,我不清楚你为什么要把日期加到主键里去。这有什么意义呢?

另外,你这个日记账的问题,我帖子里说了,就是从日记账里不能追朔到业务表,
比如数据不一致礼,如何验证?这是我这篇帖子的主题问题。

还有,追加个字段不算什么这种想法很危险的。
业务做大了就知道了。要是没有完善的自动化测试,谁能保证不出问题呢?

为什么坚持要照搬手记账模式呢?这种设计有什么优点呢?

#5


每日的(采购数,销售数,借入数,借出数,盘点差,……)可以到不同的业务明细中取验证啊。

你认为随便可以追加个业务的更危险!

如果没有日统计,你验证库存就要 从头算了。

#6


引用 5 楼 Tiger_Zhao 的回复:
每日的(采购数,销售数,借入数,借出数,盘点差,……)可以到不同的业务明细中取验证啊。

你认为随便可以追加个业务的更危险!

如果没有日统计,你验证库存就要 从头算了。


1.你日记账和业务明细表都没有关联,怎么验证?
2.追加业务处理是必须满足的需求,你要考虑怎么以追小的代价满足需求。
   请参考SRP,OCP等设计原则。
3.我设计的StockEvent和StockEventItem表就是为了解决以上问题。你没
   仔细看。而且问题不在点子上。
另外,多动手,会弥补经验不足的问题,比用“!”号表达你的不满更对你有
帮助

#7


把出入库明细再抄一遍——然并卵
你是来提问题还是来秀优越的?
秀优越找错对象了。
我自信做过的(仅库存相关的)系统肯定比你多。

#8


引用 7 楼 Tiger_Zhao 的回复:
把出入库明细再抄一遍——然并卵
你是来提问题还是来秀优越的?
秀优越找错对象了。
我自信做过的(仅库存相关的)系统肯定比你多。



就当顶贴了。

#9


没人感兴趣的问题么

#10


看你们讨论学到不少东西,以下是个人看法,不一定正确,仅供参考。
库存表还是要的,可以大幅提高查询库存时的效率。
库存表中的数量是否实时变动要看系统需要,如果需要实时变动,那么就要,不然可以定时更新库存表商品数量。
加一个日结算表,每日定时结算,可以用来减少对账计算量。
库存变动表可以直接用视图关联实际的业务表。

#11


一方面,要看数据量究竟会有多大了。
我之前写的系统,各种入和各种出会分成很多个表,算库存时,连接数十个表来计算,每个表都有几十万条记录,用不了一两秒就出结果了。
当然,也可以进行简化,对于库存来说,基本上就只有入和出两种了,可以放在两个表中,甚至,可以再简化到一个表中,入为正,出为负,需要计算库存,按料号汇总数量就OK了。看历史库存,过滤一下日期就可以了。
至于入和出的类型,可以用另一个主表来存放,每个操作界面只显示自己对应的类型就可以了。在保存及显示时,根据类型不同显示及操作不同的效果了。

之前曾尝试过,用数十个表分类来存放,用触发器来更新库存表,但一直感觉库存表计算结果可能有错误(这个错误还真没验证过)。

所以,后来就是一直用数十个表存,用一个视图来计算出库存,需要库存时,调用这个视图。数据量不大,还可以。

#12


一个库存表,表示当前库存
然后就是一些单据表,明细表可以了。
加一个出入库表也是可以的,因为出入库不仅仅是采购,销售,还有很多种类型的,所以也可以添加有必要。

推荐阅读
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • Ralph的Kubernetes进阶之旅:集群架构与对象解析
    本文深入探讨了Kubernetes集群的架构和核心对象,详细介绍了Pod、Service、Volume等基本组件,以及更高层次的抽象如Deployment、StatefulSet等,帮助读者全面理解Kubernetes的工作原理。 ... [详细]
  • 本文详细介绍了美国最具影响力的十大财团,包括洛克菲勒、摩根、花旗银行等。这些财团在历史发展过程中逐渐形成,并对美国的经济、政治和社会产生深远影响。 ... [详细]
  • andr ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • Win11扩展卷无法使用?解决扩展卷灰色问题的指南
    本文详细介绍了在Windows 11中遇到扩展卷灰色无法使用时的解决方案,帮助用户快速恢复磁盘扩展功能。 ... [详细]
  • 武汉大学计算机学院研究生入学考试科目及专业方向
    武汉大学计算机学院为考生提供了多个硕士点,涵盖计算机科学与技术、软件工程、信息安全等多个领域。考研科目包括思想政治理论、英语一或二、数学一或二以及专业基础课程。具体的专业方向和考试科目详见正文。 ... [详细]
  • 本文介绍了如何通过扩展 UnityGUI 创建自定义和复合控件,以满足特定的用户界面需求。内容涵盖简单和静态复合控件的实现,并展示了如何创建复杂的 RGB 滑块。 ... [详细]
author-avatar
雪影飘枫2502928577
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有