库存数据库devise
这不是一个真正关于“编程”的问题(不是特定于任何语言或数据库),而是更多的devise和架构。 这也是“什么是最好的方式来做X”types的问题。 我希望不要有太多“宗教”的争议。
在过去,我开发了一些系统,以某种方式保留某种forms的物品清单(不涉及什么物品)。 有些使用不支持事务的语言/数据库。 在这种情况下,我select不将项目数量保存在项目logging中的一个字段中。 相反,手头的数量是根据收到的库存总量计算出来的。 由于软件,这导致库存几乎没有差异。 这些表格正确编制索引,performance良好。 如果logging的数量开始影响性能,则存在归档过程。
现在,几年前我开始在这家公司工作,我inheritance了一个跟踪库存的系统。 但数量保存在一个领域。 当一个条目被注册时,收到的数量被添加到该条目的数量字段。 当一个项目被出售,数量被减去。 这导致了差异。 在我看来,这不是正确的方法,但是以前的程序员在这里发誓。
我想知道在devise这样的系统的时候是否有正确的方法是有共识的。 还有哪些资源可用,打印或在线寻求指导。
谢谢
我在现在的公司看到了两种方法,一定会倾向于第一种(基于股票交易的总计)。
如果你只是在某个地方储存总量,你不知道你是如何到达这个数字的。 没有交易历史,最终会出现问题。
我写的最后一个系统通过将每笔交易存储为正数量或负数量的logging来追踪股票。 我发现它工作得很好。
- 数据模型资源手册,卷。 1:所有企业的通用数据模型库
- 数据模型资源手册,卷。 2:特定行业的数据模型库
- 数据模型资源手册:数据build模的通用模式
我有第一卷和第二卷,这些在过去非常有帮助。
这取决于库存系统远远不止计算物品。 例如,出于会计目的,您可能需要基于FIFO(先入先出)模型来了解库存的会计价值。 这不能通过简单的“收到的库存总量 – 库存总量”公式来计算。 但是他们的模型可以很容易地计算出来,因为他们会随着会计价值的变化而变化 我不想详述,因为这不是编程问题,但如果他们发誓,也许你不能完全理解他们所要求的所有要求。
两者都是有效的,这取决于具体情况。 前者最好是在以下条件成立的时候:
- 项目总数相对较less
- 有很less或没有例外情况需要考虑(回报,调整等)
- 库存项目数量不经常需要
另一方面,如果你有大量的项目,一些例外的情况下,频繁的访问,这将是更有效的保持项目数量
还要注意,如果你的系统有差异,那么它有错误应该被追查和消除
我已经完成了两个方面的系统,而且这两种方法都可以正常工作 – 只要您不忽略错误!
看看ARTS(零售技术标准协会)数据模型( http://nrf-arts.org )。 它使用具有logging的StockLedger表,每个项目和库存更改都在InventoryJournalEntries中进行跟踪。
考虑现有系统以及改变它的成本和风险是很重要的。 我使用存储类似于您的库存types的数据库,但它包括审计周期和存储调整,就像收据一样。 它似乎运作良好,但所有参与者都训练有素,仓库员工学习新程序并不是很快。
在你的情况下,如果你正在寻找一个更多的跟踪而不改变整个数据库结构,那么我build议添加一个跟踪表(类似于你的'交易'解决scheme),然后logging更改到库存水平。 更新对库存水平的大部分更改不应太难,以便他们也留下交易logging。 您还可以添加一个周期性任务,每隔几个小时左右将库存水平备份到事务处理表,以便即使您错过了一个事务,您也可以发现更改何时发生或回滚到之前的状态。
如果您想了解一个大型应用程序是如何查看SugarCRM的 ,他们有库存pipe理模块,尽pipe我不确定它是如何存储数据的。
我会select第一种方式,在哪里
手头的数量是根据收到的存货总额计算的 – 存货总量
正确的方法,海事组织。
编辑:我也想要考虑到任何股票损失/损害进入系统,但我相信你有这个覆盖。
我认为这实际上是一个普遍的最佳实践问题,关于每次你需要一个总数与一个数量的变化相比,做一个(相对)昂贵的计数,然后将计数存储在一个字段中,并在需要时读取该字段总。
如果我不能使用交易,那么每次我需要一个总数的时候,我都会用现场计数。 如果交易是可用的,那么执行清单更新操作以及在同一个交易中保存重新计数的总数是安全的,这将确保计数的准确性(虽然我不确定这可以与多个用户击中数据库)。
但是,如果性能不是一个真正的大问题(现代数据库在计数行的时候是足够好的,我很less会担心这个问题),我只是每次都坚持实时计数。
我可以看到有两列的好处,但我没有跟踪有关差异的部分 – 你似乎暗示有两列(进出)比单列(当前)更不容易出现差异。 这是为什么?
我曾经研究过解决这个问题的系统。 我认为理想的解决scheme是一个预先计算的专栏,它可以让你两全其美。 你的总数将是某个字段,因此不需要昂贵的查找,但是不能与其他数据不同步(数据库保持完整性)。 我不记得哪个RDMS支持预先计算的列,但是如果你没有交易,那可能也不可用。
你可能使用触发器伪造预先计算的列(非常有效……我没有看到任何缺点)。 你可能需要交易。 恕我直言,保持数据完整性,当你做这种控制非规范化是触发器的唯一合法用途。
Django库存更适合固定资产,但可能会给你一些想法。
IE:ItemTemplate(class) – > ItemsOnHand(instance)
ItemsOnHand可以链接到更多ItemTemplates; 示例打印机和墨盒是必需的。 这也允许为每个ItemOnHand设置Reorder点。
每个ItemsOnHand链接到InventoryTransactions,这允许轻松审计。 为了避免计算从千日元的实际交易项目,使用的检查点只是一个余额+date。 要计算手头的物品查询以查找最近的检查点,并开始添加或减去物品以查找物品的当前余额。 定期定义新的检查点。
没有一两列,我的意思是“收到的库存总量 – 库存总量”是这样的:
Select sum(quantity) as inventory_received from Inventory_entry Select sum(quantity) as inventory_sold from Sales_items
然后
Qunatity_on_hand = inventory_received - inventory_sold
请记住,我简化了这个和我最初的解释。 我知道还有更多的库存,只是跟踪数量,但在这种情况下,这是问题在于我们想要解决的问题。 在这一点上,改变它的原因是支持当前devise引起的问题的成本。
另外我想提一下,虽然这不是一个“编码”问题是关于algorithm和devise,恕我直言,是非常重要的议题。
感谢大家迄今为止的答案。
纳尔逊·马尔摩尔
我们解决了不同的问题,但是我们对其中一些问题的解决方法可能会让你感兴趣。
我们允许系统做出“最佳猜测”,并且向用户定期反馈任何看起来错误的猜测。
要将其应用于广告资源,您可以有3个字段:
inventory_received inventory_sold estimated_on_hand
然后,你可以运行一个进程(每天?),大致如下:
SELECT * FROM Inventory WHERE estimated_on_hand != inventory_received - inventory_sold
当然,这依赖于用户看这个警报,并做一些事情。
此外,您可以通过更新inventory_sold / received,或者添加另一个字段“inventory_adjustment”(可能是正数或负数)来重置库存。
…只是一些想法。 希望这是有帮助的。