数据库设计:多层包装的库存
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 包装级别
我正在尝试为我的库存开发一个数据库。但是我不知道如何跟踪多层包装。
例如:
我目前有一个产品和职位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 包装级别