我正在尝试制定出最佳的架构结构来表示Postgres中的BoM。假设一个零件可以有多个相同的子零件,我可以添加一个数量列,但这些零件也可能有多个子零件。
如果我想知道每个零件的总使用量,postgres是否可以使用层次查询中的数量列?
BOM表示物料清单。
答案 0 :(得分:1)
据我所知,那么是的,使用分层BOM表时可以包括数量。我理解您的问题的方式是,如果一个BOM表条目的数量为10,则其子项的金额需要乘以10(因为您的“子项”项目是其10倍)。
具有下表和示例数据:
create table bom_entry
(
entry_id integer primary key,
product text, -- should be a foreign key to the product table
amount integer not null,
parent_id integer references bom_entry
);
insert into bom_entry
values
(1, 'Box', 1, null),
(2, 'Screw', 10, 1),
(3, 'Nut', 2, 2),
(4, 'Shim', 2, 2),
(5, 'Lock', 2, 1),
(6, 'Key', 2, 5);
因此,我们的包装盒需要10个螺钉,每个螺钉需要2个螺母和2个垫片,因此我们总共需要20个螺母和20个垫片。我们也有两个锁,每个锁都有两个钥匙,所以我们总共有4个钥匙。
您可以使用递归CTE遍历树并计算每个项目的金额。
with recursive bom as (
select *, amount as amt, 1 as level
from bom_entry
where parent_id is null
union all
select c.*, p.amt * c.amount as amt, p.level + 1
from bom_entry c
join bom p on c.parent_id = p.entry_id
)
select rpad(' ', (level - 1)*2, ' ')||product as product, amount as entry_amount, amt as total_amount
from bom
order by entry_id;
rpad /级别用于缩进以可视化层次结构。上面的查询返回以下内容:
product | entry_amount | total_amount
---------+--------------+-------------
Box | 1 | 1
Screw | 10 | 10
Nut | 2 | 20
Shim | 2 | 20
Lock | 2 | 2
Key | 2 | 4