1

我必须跟踪单个零件和套件(组件)的库存,但找不到令人满意的方法。伪造和超简化数据库示例:

表产品:
产品 ID 1
产品名称 助焊剂电容器
产品成本 900
产品价格 1350 (900*1.5)
产品库存 3
-
产品 ID 2
产品名称融合先生
产品成本 300
产品价格 600 (300*2)
产品库存 2
-
产品 ID 3
产品名称 时间旅行套装
prodCost 1200 (900+300)
产品价格 1560 (1200*1.3)
产品库存 2

表相关
相对 ID 1
relSrc 1(磁通电容器)
relType 4(是的子部分)
relDst 3(时间旅行套件)
-
相对 ID 2
relSrc 2(融合先生)
relType 4(是的子部分)
relDst 3(时间旅行套件)

prodPrice:它是根据成本计算的,但不是以线性方式计算的。在此示例中,对于 500 或更少的成本,加价为 200%。对于 500-1000 的成本,加价为 150%。对于 1000+ 的成本,加价是 130% 这就是为什么时间旅行套件比单个零件便宜得多的原因

prodStock:这是我的问题。我可以出售套件或单个零件,因此套件的库存是虚拟的。

我购买时的问题:一些供应商向我出售整个 Time Travel 套件(带有一个条形码),而有些供应商向我出售单个零件(带有不同的条形码)所以当我加载库存时,我不知道如何估算它.

出售时的问题:如果我只出售套件,计算库存会很容易:“我有 3 个 Flux 电容器和 2 个 Mr Fusion,所以我有 2 个 Time travel 套件和一个 Flux 电容器”但我可以出售套件或单个零件. 因此,我必须同时跟踪单个零件和可能的套件的库存(并且我必须补偿售价)

可能这真的很简单,但我看不到一个简单的解决方案。恢复:我必须找到一种跟踪库存的方法,而数据库/程序是必须这样做的(我不能要求店员更正库存)

我正在使用 php+MySql。但这更像是一个逻辑问题而不是编程问题

更新:可悲的是,Eagle 的解决方案不起作用。

  • 关系可以并且是递归的(一个工具包使用另一个工具包)
  • 有些套件确实使用了多个相同的部件(2 个磁通电容器 + 1 个 Mr Fusion)
  • 我真的需要为套件的库存存储一个价值。相同的数据库用于用户想要购买零件的网页。我应该展示可用的库存(否则他们甚至不会尝试购买)。并且无法计算网页上每个用户搜索的库存

但我喜欢将股票标记为虚拟的布尔值的想法

4

1 回答 1

1

好的,首先,因为prodStock时间旅行工具包是虚拟的,你不能将它存储在数据库中,它本质上是一个计算字段。如果您在表格上有一个布尔值说明是否计算过,这可能会有所帮助prodStock。我会假装好像你在表格中有这个字段,我isKit现在就调用它(这TRUE意味着它是一个工具包,prodStock应该计算)。

现在计算库存中每件商品的数量:

select p.prodID, p.prodName, p.prodCost, p.prodPrice, p.prodStock from prod p where not isKit
union all
select p.prodID, p.prodName, p.prodCost, p.prodPrice, min(c.prodStock) as prodStock
from 
  prod p
  inner join rels r on (p.prodID = r.relDst and r.relType = 4)
  inner join prod c on (r.relSrc = c.prodID and not c.isKit)
where p.isKit
group by p.prodID, p.prodName, p.prodCost, p.prodPrice

我使用第二个产品的别名c来代表“组件”。我明确写了not c.isKit,因为这不会递归工作。union all使用而不是union出于效率原因,因为它们都将返回相同的结果。

注意事项:

  • 这不会递归地工作(例如,如果一个套件需要另一个套件的组件)。
  • 这仅适用于只需要一个特定项目的套件(例如,如果时间旅行套件需要 2 个磁通电容器和 1 个 Mr. Fusion,这将不起作用)。
  • 我没有对此进行测试,因此可能存在轻微的语法错误。
  • 这仅计算prodStock字段;做其他领域你需要类似的逻辑。

如果您的查询比我想象的要复杂得多,我深表歉意,但我希望这可以帮助您找到可行的解决方案。

至于购买套件时如何处理数据,这里假设您将prodStock仅存储在组件中。因此,例如,如果您从供应商处购买时间机器,而不是增加prodStock时间机器产品,您会增加磁通电容器和 Mr. fusion。

于 2010-06-03T10:31:16.993 回答