Какая структура данных лучше всего подходит для иерархической спецификации - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь найти лучшую структуру схемы для представления BoM в Postgres.Предполагая, что часть может иметь несколько одинаковых дочерних частей, я мог бы добавить столбец количества, но эти части также могут иметь несколько дочерних элементов.

Если бы я хотел знать общее использование каждой части, есть ли у postgres способиспользования столбца количества в иерархическом запросе?

Спецификация означает спецификацию.

1 Ответ

0 голосов
/ 23 февраля 2019

Насколько я понимаю ваш вопрос, тогда да, вы можете включить количество при использовании иерархической спецификации.Насколько я понимаю, ваш вопрос заключается в том, что если одна запись спецификации имеет сумму, например, 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 / level используется для создания отступа для визуализации иерархии.Приведенный выше запрос возвращает следующее:

product  | entry_amount | total_amount
---------+--------------+-------------
Box      |            1 |            1
  Screw  |           10 |           10
    Nut  |            2 |           20
    Shim |            2 |           20
  Lock   |            2 |            2
    Key  |            2 |            4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...