对于这个问题的长度,我们深表歉意。
我有一个数据库设计部分,我担心这可能会开始引起问题。现在还没有到那个阶段,但是显然不想等到解决问题。但是在开始测试各种场景之前,我将不胜感激任何有此问题经验的人的意见。
情况是库存控制并保持StockOnHand值。
可以维护一个保存库存控制数字的表格,只要手动或使用数据库触发器输入订单,就可以更新该表格。
或者,您可以通过读取和求和实际销售价值来使SQL来计算数量。
该程序安装在几个站点上,其中一些站点使用MS-SQL 2005,而某些站点使用2008。
我的问题很复杂,因为同一个设计需要处理几种情况,
如 :
1)现金/销售点销售环境。输入销售,一次交易减少库存。不能对此交易进行任何修改。
2)订单/路线/确认
在这种环境中,订单将被创建,并且可以被搁置,下达,发送,路由,修改,交付和开票。并且在开具发票之前的任何阶段都可以修改订单。 (我之所以这样说是因为任何数据库触发器都可能被调用很多时间,并且必须确定更改是否会影响现有库存数据)
3)不同的企业对于何时减少他们的StockOnHand有不同的想法。例如,有些人在批准订单后将其视为已售出(因为他们已 promise 出售商品,因此不应将其出售给其他人)。其他人只有在将其发送给客户之前才将其视为已售出,而另一些则只有在交货或收集时才视为已售出。
4)每个产品的交易数量可能会有很大的差异。例如,一个系统有四个或五个产品,每月售出数千次,因此,要求SQL对这些交易执行总和,即每年读取上万笔交易,而在同一系统上,有数千笔交易其他产品,每个产品每年的销售量少于1000笔交易。
5)历史信息很重要。因此,我们的系统不会删除或存档交易,并且具有数年的交易价值。
6)系统必须具有警告操作员的能力,如果他们在输入订单时没有足够的库存(通常是实时的,例如电话订单)。
请注意,这仅对于某些产品是必需的。 (但我认为实时汇总上万笔交易的数量并不可行)。
7)平均成本价格。可以根据库存商品的平均成本来定价某些产品。实现方法是重新计算交易中每种商品的平均成本价格,例如newAverageCostPrice =((((oldAverageCostPrice * oldStockOnHand)+ newCostValue)/ newStockOnHand)。这意味着,如果产品使用的是AverageCost,则必须知道每种商品的现有库存。
当前实施该系统的方式有两个方面。
我们有一个表格,其中包含每个产品和位置的StockOnHand。每当销售更新时,此表都会通过应用程序的业务层(C#)更新
这仅提供了现有库存数据。
如果需要在特定日期运行“库存评估”,则可以通过对相关行中的数量求和来计算该数字。由于数量和产品存储在行文件中,而日期和状态仅保存在表头中,因此这还需要在销售线表和销售表头之间建立联接。
但是,这种方法也有缺点。
运行股票估值报告的速度很慢(但并非慢得令人无法接受),但是我对此并不满意。 (它可以正常工作,并且监视服务器不会显示它超载,但是有可能引起问题,因此需要定期监视)
更新StockOnHand表的代码逻辑很复杂。
该表经常更新。在很多情况下,这是不必要的,因为不需要检查信息。例如,如果您90%的企业销售4或5种产品,则您实际上并不需要一台计算机来告诉您缺货。
数据库触发器。
我以前从未实现过复杂的触发器,因此请小心。
例如,如前所述,我们需要配置选项来确定何时更新库存量的条件。目前,该文件仅读取一次并缓存在我们的程序中。在触发器内执行此操作可能意味着要为每个触发器读取此信息。这对性能有很大影响吗?
另外,我们可能需要在销售标题和销售线上设置触发器。 (这可能意味着对销售 header 的修订将被迫读取行并更新相关产品的现货库存,然后稍后保存该行,另一个数据库触发器将再次修改stockonahand表,该表可能位于高效。
另一种选择是仅在交易开票时才更新StockOnHand表(这意味着无法进行进一步的修改),并提供基于此表与未开票交易的并集来计算库存数量的功能股票。
任何建议将不胜感激。
最佳答案
首先,我强烈建议您添加“StockOnHand”,“ReservedStock”和“SoldStock”
到你的桌子上。
现金销售将立即从“StockOnHand”中减去销售并将其添加到“SoldStock”,对于订单,您将不理会“StockOnHand”,仅将销售添加到ReservedStock,当最终开具发票时,您从StockOnHand中减去销售和预留库存并将其添加到“SoldStock”。
然后,业务用户可以选择StockOnHand还是StockOnHand-ReservedStock。
使用保持不变的StockOnHand图形将大大减少您的查询时间,而如果您弄乱了程序逻辑,则该图形可能会掉下去的风险很小。
如果您的客户足够幸运,可以在维护StockOnHand数据时遇到更新争用(即,他们可能在高峰时间每秒处理五笔以上的销售),则可以考虑以下方案:
隔夜通过计算交付量(销售额或其他)来计算StockOnHand值。
确认销售后,在“今天的销售”表中插入一行。
当您需要查询当前库存的总库存时,请从当天的开始数字中减去。
您还可以在每个产品上放置一个“库存检查阈值”,因此,如果您使用10,000个小部件开始新的一天,那么如果某人订购的数量少于100,那么您可以将CheckThreshold设置为100,而不必打扰检查库存。如果有人订购超过100件,则检查库存并重新计算新的下限阈值。
关于sql - 有关最佳SQL性能更新和/或计算现有库存总数的建议,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3440632/