powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Дерево, элемент может быть потомком нескольких родителей(+)
25 сообщений из 27, страница 1 из 2
Дерево, элемент может быть потомком нескольких родителей(+)
    #33931305
Новичок_я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Есть таблица полуфабрикатов, каждый из которых может содержать как сырье, так и полуфабрикаты. Соответственно, любой из полуфабрикатов может входить в неограниченное количество других полуфабрикатов.
Хотелось бы одним запросом (без рекурсий) получать все сырье для определенного полуфабриката, посмотрел структуры для хранения деревьев, но, к сожалению, не нашел такой, которая бы позволяла элементу быть потомком сразу нескольких родителей.
Подскажите, есть ли такая структура и где можно про это почитать?
Заранее спасиб!
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33931558
Фотография optimizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33931563
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BOM (Bill of material) такая штука называется. Или спецификация по-русски.

Спецификация (Что, Куда, Сколько) КЛЮЧ (Что, Куда).
1 1 12.5
1 2 1000
...

Ищите, найдете непременно.
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33931586
Новичок_я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, сейчас буду искать
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33931767
Новичок_я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня вот какая структура:
ProjectReceipt - это проект рецептуры
ComponentSet - это сырьевой набор рецептуры
Raw - это сырье
Semiproduct - это полуфабрикаты.
Полуфабрикат - формируется из проекта рецептуры, поэтому в таблице есть FK на ProjectReceipt.
В состав полуфабриката могут входить другие полуфабрикаты. Причем один и тот же полуфабрикат может входить одновременно в несколько полуфабрикатов. Добавлять еще одну таблицу для создания связи многие-ко-многим - как-то не хочется. Тем более, надо одним запросом получать сырье из сырьевого набора для всех вложенных полуфабрикатов.
Для хранения деревьев есть структура с поразрядным ключом , но мне она не совсем подходит, т.к. потомок может иметь только одного родителя, а у меня потомок может иметь нескольких родителей
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33932352
Новичок_я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нюанс еще в том, что сначала "появляются" дети, а уже потом для них задается родитель
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33932471
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок_я. Добавлять еще одну таблицу для создания связи многие-ко-многим - как-то не хочется. Дык куда деваться если связь такая :)
Полуфабрикаты и материалы и даже конечные продукты разумно объединить в одну структуру с тем, чтобы они единообразно участвовали в этой и других связях. Тем более, у Вас наверно еще впереди варианты рецептур.
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33932736
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
достаточно трех таблиц и одной процедуры:
parts (id, name) -- номенклатура (материалы, ПФ, готовая продукция)
bom (id, partid, compid, comptype, partqty,compqty) -- bom (рецептура)
mrp(id,comptype,lowlevel,itemid,qty,st) -- результаты расчета

сначала в таблицу MRP записывается список продуктов для обсчета, к примеру.

Код: plaintext
1.
insert into mrp (comptype, lowlevel, itemid,qty,st)
select  2 , 0 ,itemid,qty, 0  from saleorder
затем запускается приведенная ниже процедура.

-- process mrp

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare @n int
set @n =  0 
while exists (select itemid from mrp where st =  0  )
begin
-- Raw materials

insert into mrp (comptype, lowlevel, itemid,qty,st)
select  1 , @n, b.compid, b.compqty*p.qty/b.partqty, 1 
from mrp p inner join bom b on b.partid = p.itemid 
where p.st= 0  and b.comptype =  1 

-- products 

insert into mrp (comptype, lowlevel, itemid,qty,st)
select  2 , @n+ 1 , b.compid, b.compqty*p.qty/b.partqty, 0 
from mrp p inner join bom b on b.partid = p.itemid 
where p.st= 0  and b.comptype =  2 

update mrp set st= 1  where lowlevel = @n
set @n = @n +  1 

end
набор полей естественно минимальный. расширять по необходимости.
пример для ms sql. Для другого - изменить процедуру
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33933493
Новичок_я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полуфабрикаты и материалы и даже конечные продукты разумно объединить в одну структуру с тем, чтобы они единообразно участвовали в этой и других связях. Тем более, у Вас наверно еще впереди варианты рецептур.
Конечный продукты (изделия) объединять с сырьем и полуфабрикатами смысла нет, т.к. это разные сущности, с разными атрибутами. Да и изделия не могут в входить в другие изделия. Получабрикаты и сырье еще можно объединить, но я их разнес по разным таблицам, т.к. схожих у них атрибутов примерно половина.
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33933503
Новичок_я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iscrafm , Ваша структура мне не подходит:
1. Используется не один запрос. У меня база на акцессе - ХП отпадают :(
2. Я не могу свалить в кучу сырье, полуфабрикаты и изделия

_______________
Полуфабрикат создается следующим образом: пользователь разрабатывает проект на полуфабрикат, когда разработка будет закончена - производятся расчеты и добавляется запись в таблицу Semiproduct.
Если сделать что-то наподобие SemiproductMap (ID, ID_Child), при добавлении записи в Semiproduct, в эту таблицу для заданного полуфабриката добавлять все(!) вложенные полуфабрикаты, ну например:
1: 2 3 4 - полуфабрикат 1 состоит из 2, 3 и 4
2: 5 7 - полуфабрикат 2 состоит из 5 и 7
4: 5 9 - полуфабрикат 4 состоит из 5 и 9
В таблице SemiproductMap будет:
1 2
1 3
1 4
1 5
1 7
1 5
1 9
И в любой момент можно будет посмотреть полный состав.
Насколько плох или неудобен такой вариант?
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33933926
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок_яКонечный продукты (изделия) объединять с сырьем и полуфабрикатами смысла нет, т.к. это разные сущности, с разными атрибутами. Да и изделия не могут в входить в другие изделия. Получабрикаты и сырье еще можно объединить, но я их разнес по разным таблицам, т.к. схожих у них атрибутов примерно половина. Типичная ситуация для типа/супертипа. Важно, что они могут выступать в одной роли в связях. Например, и конечный продукт и сырье и полуфабрикаты могут находиться/перемещаться между цехами, складами.
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33934043
Новичок_я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelR , предложенный Вами вариант не решает главную проблему - как одним запросом получать все вложенные полуфабрикаты?
Или я совсем ничего не понял :(
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33934870
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не решает. Стандартный SQL этого (рекурсивные запросы) не умеет.
iscrafm показал схему процедуры для MS SQL и стандартную технологию:
1) Создаются/меняются спецификации продуктов, полуфабрикатов. Например, изменилась спецификация полуфабриката 2.
2) Выполняется расчет (разузлование) и запоминается Состав изделия в специальной таблице. При расчете изменение спецификации полуфабриката 2 учтется в составе всех нужных нам продуктов и полуфабрикатов, где он участвует.
3) Запросы адресуются к Составу изделия.

В ORACLE есть SELECT CONNECT BY, но из-за одного этого платформу менять не стоит.
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33934875
Фотография optimizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приведенный выше мною пример позволяет это сделать. Поля на которые следует обратить внимание: TaskID, Parent, Child, Tree_Left, Tree_Right + почитать про nested sets. Правда при таком подходе придется делать update ключей для всего дерева при добавлении и удалении элементов, а достоинство - в возможности делать выборку одним запросом
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33935149
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок_я
Конечный продукты (изделия) объединять с сырьем и полуфабрикатами смысла нет, т.к. это разные сущности, с разными атрибутами. Да и изделия не могут в входить в другие изделия. Получабрикаты и сырье еще можно объединить, но я их разнес по разным таблицам, т.к. схожих у них атрибутов примерно половина.
Изделия, сырье и полуфабрикаты, это как раз одинаковые сущности потому что имеют одинаковые обязательные измерения. А количество доп полей может быть разное, но это совсем не проблема. Доп атрибуты вообще не должны определять сущность, есть одит единственный четко определенный ключ объекта и измерения его описывающие.

Вобщем чем дальше влез тем дальше вылез :)

Вопрос не в рекурсии, а по нимании, что есть что.
Например рецептуры - это нормы, которые действуют определенное время, т.е. это таблица абстрактных правил, в которых участвуют изделия, сырье, полуфабрикаты в определенной пропорции (количественном отношении). Рецепты ни в коем случае не путать с производством. Производство формирует реальные партии товара, а рецепты - только правила списания товаров при приготовлении изделия/полуфабриката.

Не вижу вообще мест, в которых нужна рекурсия, потому что это многошаговое производство, в котором не советую миновать многошаговость, а именно и делать многошаговое производство, тогда можно будет контролировать полуфабрикаты на любом шаге приготовления.
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33936234
Новичок_я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня именно рецептуры - т.е. описания и нормы, производства как такового нет.
Рецептура описывает, какое сырье и какие полуфабрикаты входят в состав изделия. На каждую рецептуру создается проект - одна таблица как раз и описывает этот проект, неважно, изделие ли это или полуфабрикат.
Рекурсия нужна для того чтобы можно было получить сырье из вложенных полуфабрикатов.
Посмотрел вариант optimizer'a - вроде бы то, что мне нужно.
ModelR2) Выполняется расчет (разузлование) и запоминается Состав изделия в специальной таблице. При расчете изменение спецификации полуфабриката 2 учтется в составе всех нужных нам продуктов и полуфабрикатов, где он участвует. - ну да, я и хотел завести отдельную таблицу, которая бы содержала только структуру вложенных полуфабрикатов.
Валентин К
Не вижу вообще мест, в которых нужна рекурсия, потому что это многошаговое производство, в котором не советую миновать многошаговость, а именно и делать многошаговое производство, тогда можно будет контролировать полуфабрикаты на любом шаге приготовления.
- как Вы уже заметили выше, у меня не производство, а рецептура :) Поэтому рекурсия все же нужна: для обсчета рецептуры мне надо знать, сколько и какого сырья входит во все полуфабрикаты, включая вложенные
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33936271
Новичок_я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и попутно тогда вопрос:
Есть смысл разделять на две таблицы сырье и полуфабрикаты, или поместить в одну? структура такая: Группа сырья -> Подгруппа сырья -> Сырье. Ну например: Мука -> Мука пшеничная -> Мука пшеничная в.с.
так вот у полуфабрикатов и сырья есть различия еще и в группах-подгруппах.
ранести по разным таблицам - вроде удобнее в использовании, в одну - логически вернее.
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33937766
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
optimizerприведенный выше мною пример позволяет это сделать. Поля на которые следует обратить внимание: TaskID, Parent, Child, Tree_Left, Tree_Right + почитать про nested sets. Правда при таком подходе придется делать update ключей для всего дерева при добавлении и удалении элементов, а достоинство - в возможности делать выборку одним запросомИнтересно. Метод г. Celko (nested sets) именно для деревьев. А БОМ - сеть. Как удалось совместить? Пример
Child,Parent,Сколько,Tree_Left, Tree_Right
2,1, 100, ?,?
3,1, 101, ?,?
4,2, 102, ?,?
4,3, 103, ?,?
5,4, 200, ?,?
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33937820
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для каких целей служит группировка? Является ли она опять же деревом или БОМ?
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33939756
Фотография optimizer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл указать еще одно ключевое поле: RootKey. Это поле - указатель на корневой элемент, в его проекции получается дерево. В принципе, я не вдавался в суть вопроса поднятого автором, приношу ему свои извинения, если запутал, я показал структуру, которую делал для другой задачи, в которой смоделировал возможность подчинения одного элемента нескольким родителям
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33944806
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. в Access ты от дерева такой полноты не добъёшься
2. как я понял у тебя вершинка может иметь нескольких родителей,
тогда
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
для дерева
- node_id
- node_name

для связи родителей и деток
- id
- node_id
- parent_id
3. всё остальное делай на языках высокого уровня, если морда на Access,то на VB. вот только на отчётах будет ком огого как пыхтеть
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33947200
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок_я
Валентин К
Не вижу вообще мест, в которых нужна рекурсия, потому что это многошаговое производство, в котором не советую миновать многошаговость, а именно и делать многошаговое производство, тогда можно будет контролировать полуфабрикаты на любом шаге приготовления.
- как Вы уже заметили выше, у меня не производство, а рецептура :) Поэтому рекурсия все же нужна: для обсчета рецептуры мне надо знать, сколько и какого сырья входит во все полуфабрикаты, включая вложенные
Так всем кажется, и мне казалось, пока не разобрался в многошаговом производстве. На деле курсором можно захывтить все шаги за 1 раз и рассчитвать себестоимость всех полуфабрикатов и изделия.

Рецептуры и комплектации одинаковы по смыслу, нормы производства немного шире, НО они концептуально похожи и нет необходимости делать различные таблицы для разных типов документов, описывающих правила изготовления.
Нет смысла каждый рецепт описывать в одной таблице.
Нет смысла держать изделия, полуфабрикаты и сырбе в разных таблицах.

По деревьям такой крео
> Есть таблицу с древовидной структурой Tree.
> Поля таблицы Tree:
> ID (целое) - идентификатор объекта
> ParentID (целое) - идентификатор "родителя", если верхний уровень, то 0
> Level (целое) - уровень объекта, самый верхний - 0, делее 1,2....
> Path (строка) - самое интересное :) список идентификаторов ВСЕХ родителей через запятую (например 23,15,46,12). Порядок в списке особо не важен
>
> Запрос пути:
> SELECT .... FROM Tree WHERE FIND_IN_SET(ID,ObjPath) ORDER BY Level
>
> ObjPath - поле Path обекта, путь к котрому надо найти. Если известен только ID объекта, тогда придется сделать два запроса
>
> SELECT @ObjPath:=Path FROM Tree WHERE ID=ObjID;
> SELECT .... FROM Tree WHERE FIND_IN_SET(ID,@ObjPath) ORDER BY Level;
>
> В результате получим таблицу - список родителей начиная с самого верхнего, заканчивая самым последним.
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33947225
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И не следует рассмативать процесс изготовления изделия, как дерево. Достаточно действий над партиями и процессингом, все действия линейные и опывают каждый конкрентый шаг изготовления.
Для каждого преобразования на 1 тип изделия нужно делать акт изготовления. Можно конечно 1 на несколько и можно его вообще пользователю не показывать, но на практике лучше их генерировать, чтобы пользовательно мог все проверить на калькуляторе и увидеть, ведь в конечном счете пользователи должны пользоваться подобным учетным софтом, а не программеры (для опытов, как надо или как не надо делать)...
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33950981
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новичок_я, а в чем проблема-то? есть схема хранения дерева, когда при добавлении элемента в дерево в отдельную таблицу прописывается по одной записи на каждый уровень дерева.
Пример - есть корень дерева A и у него "потомки" B и С. Мы хотим ввести "потомка" С - D. При этом в таблицу связей попадают две записи (A, D) и (С, D), то есть информация "D является потомком C" и "D является потомком A".
Запрос "все потомки данного узла" - при такой структуре получается элементарно, она, в общем, для него и предназначена.
В Вашем случае - схема тоже работает, просто в таблицу связей заносится больше записей, если С - потомок не только A, но и A1, а D - не только С, но и С1 - то в таблицу связей попадут (A, D), (A1, D), (C, D), (C1, D).
...
Рейтинг: 0 / 0
Дерево, элемент может быть потомком нескольких родителей(+)
    #33952182
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинМы хотим ввести "потомка" С - D. При этом в таблицу связей попадают две записи (A, D) и (С, D), то есть информация "D является потомком C" и "D является потомком A".
Одного только не учли. Чтобы добавить узел, нужно выполнить развертку до этого уровня включительно. Именно об этой развертке и идет речь. Да и хранить все отношения несколько необычно.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Дерево, элемент может быть потомком нескольких родителей(+)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]