免责声明:我是数据库领域的初学者。
我试图在PostgreSQL中设计一个数据库,用来记录商品的销售和购买情况。我打算使用这个数据库作为模型使用EF和WPF,使用MVVM和Repository方法。
简化的形式如下:
项目:我们处理的项目的细节。
采购:记录我们购买的物品的细节。
销售:记录我们出售的商品的细节。
库存:手头每件物品的数量。
现在,我还有一个库存表,其中维护每个项目的当前库存。我面临的困境是:
当任何发票生成时,它表示已经发生销售,发票中每一项的库存都会相应地更新。
类似地,当我们一方的采购发生时,我们会将其记录在“购买”表中,并且“库存”表中相应的项目将更新其数量。
如果修改或删除现有发票,我还必须考虑纠正库存表的情况。
这是仅有的三种情况下股票表将发生变化。
现在,我可以使用触发器实现股票表的更新。
我还可以使用存储过程将条目封装在“购买”或“销售”表中,同时更新库存表。
我也可以使用LINQ在应用程序逻辑中这样做。
哪一种方法是最务实的?
请允许我在这一背景下讨论重要的实体。我们是个经销商。我们大量购买材料,我们加工材料,然后再包装,然后再出售。
在此表中,我们出售的商品被标记为实体项。ITEM表中有两个值得注意的属性。一个是MaterialType,另一个是NumberOfPieces。
实体材料是我们购买的原材料。现在假设我们购买了100支钢笔,然后以1或5的单位转售。因此,在这个例子中,项目表中的记录是
因此,在购买表中,我们记录我们购买的材料和数量。每次购买时,我们需要做三项修改: 1.在采购中插入采购细节。2.修改材料中的CurrentStock (按我们购买的数量增加) 3。在STOCKHISTORY表中插入增加的材料数量。
请注意,StockHistory不记录累积库存,而只记录与每个事务相关的增加/减少量。
同样,对于每一次销售,我们需要做三次修改。1.在发票中填上销售细节。2.修改材料中的CurrentStock (按我们购买的数量减少) 3.在STOCKHISTORY表中插入材料减少量。
请注意,这里的发票表代表了我们生产的发票,即从我们的终端销售的发票。
下面是模式:
现在,如果我们需要删除或修改任何购买记录或发票,我们还需要修改材料中的CurrentStock以及STOCKHISTORY表中的相应记录。
下面是STOCKHISTORY表的一个概要:
现在这里是黑暗的地方。我在这里需要你的帮助。
FlowDirection记录它是购买还是出售。
如果是采购,PurchaseId将记录采购的发票号。
如果是销售,SalesId会记录销售发票号。
在表中有一个约束,其中PurchaseId和SalesId属性的无效性是XOR‘’ed,也就是说,对于给定的记录,其中一个和唯一一个属性为null。
我正在考虑摆脱FlowDirection,因为它显然是多余的。第二,我还将删除发票属性,因为它已经记录在PurchaseId/SalesId中。或者,我可以将发票列指向发票表的Num属性和购买表的发票属性(我也必须重命名所有这些表和属性)。哪一个应该是更好的方法?
发布于 2019-10-27 21:06:31
我一直在处理同一个领域,我很欣赏您试图应用的逻辑,而且模式看起来也不错--材料和项目可以是同一个表,因为没有材料和项就没有意义,反之亦然,还可以向域表添加审核属性,因为这将有助于跟踪随着系统增长而发生的多个场景在生产中出现的情况。因缺陷而取消订单。
我建议的是创建一个事件,该事件将在库存更改/更新时触发,该事件将包含旧的和新的库存,因此此事件将足以防御添加/更新/减少的库存。
并进行购买或所有审计/股票历史实体订阅此事件,以便无论出于任何原因,您不需要进行此调用的股票更改以及逻辑的其余部分将被解耦。
发布于 2017-03-07 15:52:51
不确定您的特定领域,但通常在大多数库存管理中,它会比这更复杂一些。大多数企业都会按照某种时间表进行实物盘点,这可能和每年的情况一样少。然而,这种实物将成为新的股票价值,产生某种调整的差异。此外,有时有一个单独的释放和接收程序,以确保库存的变化被记录到正确的库存期。无论是否使用触发器,在任何设计中都应该记住这一点。
https://dba.stackexchange.com/questions/166499
复制相似问题