数据库设计:多层包装的库存

Database Design: Inventory with multilevel packaging

我正在尝试为我的库存开发一个数据库。但是我不知道如何跟踪多层包装。

例如:

我目前有一个产品和职位table

产品

    Id | Name
================
  1013 | Metal
  1014 | Wood

职位

    id | Name
================
   1   | 1-1-1-1
   2   | 1-1-1-2

还有我的库存 table 我正在考虑做这样的事情: 假设我在位置 1-1-1-1

存储了 1 个装有 1000 个金属的盒子和一个装有 500 个木材的盒子
ItemId | ProductId | Quantity | PositionId
==========================================
   1   |    1013   |   1000   |     1
   2   |    1014   |   500    |     1

所以我会分别用条形码 1 和 2 标记这两个盒子,所以如果我扫描它们,我可以检查这个 table 以查看里面的产品和数量。

但我也可以将这 2 个盒子(1 和 2)放在另一个盒子(我们称之为盒子 3)中,这会为其生成一个新的条形码,如果被扫描,将显示之前的盒子及其物品.并将这个盒子3存放在另一个位置

而且我还可以把这个盒子 3 放在一个托盘里,生成一个新的代码等等。所以基本上我可以多级包N次。

什么是最好的 table 结构来跟踪所有这些?在此先感谢您的帮助!

我会在产品中添加另一列 table,将其设为 BIT,并可能将其称为 BOM、BillOfMaterials 或您认为有意义的任何名称

所以您的产品 Table 看起来像这样

然后您可以创建另一个 table 名为 BillOfMaterials

数量是构成新产品所需的产品数量。所以在这个例子中,2 块金属和 1 块木头制成了一支铅笔。

我能够做出一个好的结构: 我的产品和头寸是一样的,但我创建了一个股票 table,例如:

   id | product_id | amount | parent_id | position_id
=====================================================
   1   |   1013    |  1000  |    4      |     1
   2   |   1013    |  1000  |    4      |     1
   3   |   1014    |  500   |    4      |     1
   4   |   1234    |  NULL  |   NULL    |     1

1234(随机 ID)是一个包含 2000 个金属和 500 个木材的盒子。我没有在产品 table.

中保存此框

当我扫描 id 为 3 的框时,我执行递归 cte 查询:

with recursive bom as (
    select *, 1 as level
    from testing.stock
    where id = '4' #scanned id
    union all
    select c.*, p.level + 1
    from testing.stock c
    join bom p on c.parent_id = p.id
)
select product_id as product, sum(amount), position_id
from bom b
left join testing.product pd on b.product_id = pd.id
where pd.id is not null
group by product_id, position_id

哪个returns:

sum   | product |  position
2000  | 1013    |      3
500   | 1014    |      3

为了按位置获取,我只是 运行 上述查询的变体。要执行更新,我会在该框内获取 ID,并且 运行 a

update testing.stock set position = '2' where id in (#variation of above query)

我希望这对某人有所帮助。这适用于 N 包装级别