【问题标题】:Stock management of assemblies and its sub parts (relationships)组件及其子零件(关系)的库存管理
【发布时间】:2011-02-27 03:29:00
【问题描述】:

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

表产品: 产品 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:这是我的问题。我可以出售套件或单个零件,因此套件的库存是虚拟的。

购买时遇到的问题: 一些供应商向我出售整个时间旅行套件(带有一个条形码),有些供应商向我出售单个零件(带有不同的条形码) 所以当我加载股票时,我不知道如何估算它。

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

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

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

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

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

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

【问题讨论】:

  • 不应该是prodCostprodID 3900 + 300(或至少是1350 + 600)?
  • 是的,我改变了对子部件成本的看法,忘记改变套件的成本。更新了我的答案

标签: mysql database database-design database-relations


【解决方案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 作为第二个 prod 来代表“组件”。我明确写了not c.isKit,因为这不会递归地工作。出于效率原因,使用union all 而不是union,因为它们都将返回相同的结果。

注意事项:

  • 这不会递归地工作(例如,如果 套件需要来自 另一个套件)。
  • 这仅适用于套件 只需要一个特定的 物品(例如,如果一个时间旅行工具包是 需要 2 个磁通电容器和 1 个 Fusion 先生,这行不通)。
  • 我没有对此进行测试,因此可能存在轻微的语法错误。
  • 这仅计算prodStock字段;要执行其他领域,您需要类似的逻辑。

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

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

【讨论】:

  • 我喜欢布尔值的想法。更新了我的问题。我为此使用了正确的词吗?这是产品之间的关系,或者有更好的词,这就是为什么我的问题没有引起注意?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 2018-06-25
  • 2011-03-16
相关资源
最近更新 更多