Sql 数据库设计:多级包装的库存

Sql 数据库设计:多级包装的库存,sql,database,database-design,Sql,Database,Database Design,我正试图为我的存货建立一个数据库。但我不知道如何跟踪多级包装 例如: 我目前有一个产品和职位表 产品 Id | Name ================ 1013 | Metal 1014 | Wood id | Name ================ 1 | 1-1-1-1 2 | 1-1-1-2 职位 Id | Name ================ 1013 | Metal 1014 | Wood id |

我正试图为我的存货建立一个数据库。但我不知道如何跟踪多级包装

例如:

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

产品

    Id | Name
================
  1013 | Metal
  1014 | Wood
    id | Name
================
   1   | 1-1-1-1
   2   | 1-1-1-2
职位

    Id | Name
================
  1013 | Metal
  1014 | Wood
    id | Name
================
   1   | 1-1-1-1
   2   | 1-1-1-2
我的库存表我想做这样的事情: 假设我在1-1-1-1位置存储了一个装有1000金属的盒子和一个装有500木材的盒子

ItemId | ProductId | Quantity | PositionId
==========================================
   1   |    1013   |   1000   |     1
   2   |    1014   |   500    |     1
所以我会在这两个盒子上分别贴上条形码1和条形码2,这样如果我扫描它们,我就可以检查这个表格,查看里面的产品和数量

但我也可以将这两个框(1和2)放在另一个框(我们称之为框3)中,这将为它生成一个新的条形码,如果扫描,将显示以前的框及其项目。然后将这个盒子3存放在另一个位置

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


跟踪所有这些的最佳表结构是什么?提前感谢您的帮助

我会在products表中添加另一列,稍微做一点,或者称之为BOM、BillOfMaterials,或者任何对您有意义的东西

所以你的产品表应该是这样的

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


数量是指新产品所需的产品数量。因此,在这个例子中,2个金属和1个木材组成了一支铅笔。

我能够制作出一个良好的结构: 我的产品和位置相同,但我创建了一个库存表,如下所示:

   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个木材的盒子。我没有将此框保存在产品表中

当我扫描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
返回:

sum   | product |  position
2000  | 1013    |      3
500   | 1014    |      3
为了得到位置,我只运行上面查询的一个变体。要执行更新,我需要在该框中获取ID并运行

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

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

听起来好像你在谈论物料清单或BOM,当你结合库存创建另一个项目时,对吗?我从来没有听说过BOM。在快速搜索之后,我发现这正是我所需要的。我将为BOM搜索一些数据库结构。谢谢如果你知道一个结构适合我的情况,请让我知道。我在下面添加了一个,希望它有帮助!如果你扫描一个BOM表,你有一个链接到所有的产品和该产品的数量,你能给出一些你想问这个数据库的问题的例子吗?BOM数据库结构的问题可能是回答诸如“哪个托盘有一个至少包含3个但不超过12个项目的金属盒”之类的问题。不要将答案编辑成问题,发布一个答案帖子。回滚。因为我创建的每个盒子(里面有其他盒子/包)都会生成一个新的唯一ID,所以我也必须将它添加到products表中,对吗?我也会尝试从你的帖子中创建我自己的结构,但它确实帮了我很大的忙。非常感谢。是的,把每个盒子都当作一个单独的产品,没有问题你的模型帮了我很大的忙,我可以用它来设计我自己的结构,它工作得很好。我可以使用递归cte执行所有选择和更新查询。非常感谢你,我能帮上忙!