【问题标题】:Algorithm for tracking changes in value over time跟踪价值随时间变化的算法
【发布时间】:2015-10-06 16:30:42
【问题描述】:

我正在编写一个处理产品库存的 Rails 应用程序。我想包含以下功能,并且正在努力开发一种高效的算法:

  • 查看库存历史记录(每个日期有多少库存)
  • 从仓库中移除的数量,以及在特定时间段内添加到仓库的数量
  • 产品在任何给定时间段内缺货的时间

我的问题如下:

  1. 跟踪更改的最佳方式是什么?除了我的产品 表,我应该创建另一个名为 HistoricProductQuantities,每次都插入一条新记录 量有变化吗?

  2. 我应该跟踪哪个号码?历史库存数量(即 50 英寸 当天有库存,当天有 24 个库存),或库存变化 数量,即 -5(已售出 5 个)或 15(添加到库存中的 15 个)?还是我 在单独的表格中跟踪两者?

感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails database algorithm


    【解决方案1】:

    首先,我建议在您的应用程序中实现日期维度,因为您似乎会进行大量与时间相关的计算。在 Google 上搜索日期维度,因为它超出了您的问题范围。也就是说,我相信你的应用程序实现和使用日期维度会有很大的好处。

    就您的直接问题而言:

    What is the best way of tracking changes? In addition to my Products table, should I create another table called HistoricProductQuantities, and insert a new record each time there is a change in the quantity?

    是的,您可以这样做,我可能会称之为 HistoricProductSnapshot 并每天跟踪其中的产品活动。有了这些信息以及时间维度,您可以进行计算,例如“我们在 5 天前或一个月前有多少产品 X 等等等等。”

    What number should I track? The historic stock quantity (i.e. 50 in stock on this day, 24 in stock on that day), or the CHANGE in stock quantity i.e. -5 (5 sold) or 15 (15 added to inventory)? Or do I track both in separate tables?

    我没有编写库存控制软件的经验,但我相信使用我在上述问题中提到的快照表,您只需跟踪每天的数量。然后可以从您的快照表中计算产品数量的变化。例如,您可以有一个函数,将给定时间范围内的产品数量作为数组输出。示例:从 3 月 1 日到 3 月 7 日,这些是产品 Y [45,40,39,27,22,45,44] 的库存量。

    希望对您有所帮助。正如我所说,我不是产品库存人员,但我曾与销售点系统合作过,上面的程序应该可以为您尝试做的事情提供足够的开始。

    【讨论】:

    • 即使数量不变,每天记录数量有没有效率低下?例如,如果我有 3000 种产品,并且我每天都在跟踪数量,那么每年就有超过 100 万条数据库记录......不是很多吗?
    • 当然,这是很多数据...但是您要保留还是不保留?这就是问题所在。每日快照将是收集库存的最标准化方式。如果数据没有改变,理论上你可以不保存数据,并在执行计算时考虑到这一点,但我认为这不是正确的方法。这就像谷歌说“我们没有为你的网站保存今天的网页访问者,因为你没有收到任何”。同样,我没有接受过库存管理或分析方面的培训,但如果您想要历史数据,那可能是可行的方法。
    • 好的,谢谢。从数据库的角度来看,一个小应用有几百万条记录正常吗?我应该担心性能问题(在heroku上运行)吗?我对大型数据库的经验很少......(但据我所知,这可能还不算大)。感谢您迄今为止的所有建议,非常有帮助。
    • 没问题。免费的 heroku 数据库只允许您拥有 10,000 行,所以是的。如果您升级到下一层,我相信 10,000,000 行是极限。
    • 我已经升级了,但我的意思是更多关于性能问题?并且一直在查询有这么多记录的表..?
    【解决方案2】:

    此 gem 可用于跟踪模型的更改 https://github.com/collectiveidea/audited

    【讨论】:

      【解决方案3】:

      保持数据原始。我每天都会亲自创建一个新的数据条目,显示您每天有多少库存。或者您可以缩短间隔,例如每 12 小时一次。

      对于我们的特定用例:

      我们有一个名为 Days 的表,它与产品具有多对多关系,并且每个“关系”都有一个称为数量的值(用于跟踪每天的产品数量)。此外,对于每个关系,我们为与交易的关系(一对多关系)提供了另一个值,其中包含交易时间和剩余库存的条目。

      我个人建议您使用库存数量作为原始数据,因为它可以让您收集数据,例如在某次交易中移除了多少商品、商品何时缺货以及何时缺货。成为库存,所有通过数据。当您有需要对其执行统计计算的数据时,最好将此数据存储为原始值(项目的数量)。

      【讨论】:

      • 感谢您的回复。如果我存储每天的原始数量,是否有一种简单的方法可以计算一段时间内的销售量?和数量补货?例如,如果有一个数组 [10,8,6,15,14],则总共有 5 个已售出和 9 个已补货,但有没有一种简单的 rails 方法可以计算出来?
      • 不完全确定是否有“简单”的 rails 方式(我一直在使用 asp.net MVC),但概念应该是相同的。从一个到下一个价值的任何“增加”都将被“补货”,任何“减少”都将被出售。通过阅读返回{10, 8, 6, 15, 14} 的值表,我将有两个变量soldrestocked。一次减去两个值。 10 - 8 = 2,这意味着在此交易期间卖出了 2。 8 - 6 = 2,共售出 4 个。 6 - 15 = -9,9 个进货,4 个已售出。 15 - 14 = 1,已售出 5 个,已补货 9 个。应该是一个非常简单的 O(n) 解决方案。
      • 当您将数据存储为数量时,统计信息最适合 IMO。这样,每当您遇到任何其他问题时,总会有一些方法可以轻松处理您的数据以获得您需要的值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      • 2021-02-06
      相关资源
      最近更新 更多