powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
19 сообщений из 19, страница 1 из 1
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33313290
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть древовидная структура. У каждого элемента есть свой номер и номер предка. У корневых элементов номер предка - 0. Однако связь родитель-потомок получается между одной и той-же сущьностью. Как это нарисовать? Не является ли эта связь рекурсивной? Как это победить?
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33313317
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinКак это победить?Стандартная схемаПолеIDParentIDс foreign key.
Остальное зависит от сервера. На некоторых есть рекурсивные запросы...
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33313514
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервер предполагается любой:) Тоесть проект должен с минимальными проблемами переносится на любую практически СУБД. Это будет сайт. PHP + PEAR. Именно PEAR, а не конкретная СУБД.
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33313690
Сержант Золотарев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Правильно. У каждого элемента свой идентификатор и идентификатор предка. У корневых элементов идентификатор предка - nil (или -1, или 0, или ... - в зависимости от твоих предпочтений и метода реализации)
2. Да, связь сама с собой. ("Свиное ухо" называется).
3. Да, это рекурсивная с вязь. Побеждать это не нужно, побеждать нужно циклические связи. С помощью триггеров, например, которые при изменении структуры дерева всех родителей. Вот такой процедуркой, к примеру:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create procedure get_parents_part_category (
    ID INTEGER)
RETURNS (
    DID INTEGER,
    OID INTEGER)
AS
BEGIN
  WHILE (ID >  0 ) DO
    BEGIN
      SELECT t.Part_Category_id, t.base_Part_Category_id
      FROM Part_Category T
      WHERE T.Part_Category_id = :ID
      INTO :DID, :OID;
      ID=OID;
      SUSPEND;
    END
END ;


Если нарвались на "свой" идентификатор - то операция отменяется, т.к. цикл.

4. А рисовать это вот так, к примеру:
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33313692
Сержант Золотарев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извини, не прочитал:

SarinСервер предполагается любой:) Тоесть проект должен с минимальными проблемами переносится на любую практически СУБД.

Беру все свои слоав обратно. Я ничего не советовал и не объяснял.
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33313698
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сержант ЗолотаревИзвини, не прочитал:

SarinСервер предполагается любой:) Тоесть проект должен с минимальными проблемами переносится на любую практически СУБД.

Беру все свои слоав обратно. Я ничего не советовал и не объяснял.
Почему же. Очень полезные вещи сказал, товарищь сержант.

Дело вот какое: можно реализовать много чего средствами PHP. Например, выбрать максимальное значение для начала. Затем в цикле с 0 до максимального значения делаем выборки.
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33313739
Сержант Золотарев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinДело вот какое: можно реализовать много чего средствами PHP.
Машина Тьюринга рулит. (Что бы не говорил один мой знакомый старшина - начальник автослужбы.)
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33313768
Desperado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Sarin
максимальное значетие чего ? есть Celko алгоритм может поможет, а вообще в нормальных субд (db2, oracle может будет в mssql) для этого есть рекурсивные запросы.
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33313794
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Desperado2Sarin
максимальное значетие чего ? есть Celko алгоритм может поможет, а вообще в нормальных субд (db2, oracle может будет в mssql) для этого есть рекурсивные запросы.
К сожалению у большинства хостеров в наличии имеется далеко не нормальная СУБД mysql. А в процессе разработки я собираюсь использовать Постгрис. Но, повторюсь, я хочу чтоб это работало на практически любой популярной СУБД.

максимальное значение поля "родитель".
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33313804
Desperado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sarin
К сожалению у большинства хостеров в наличии имеется далеко не нормальная СУБД mysql. А в процессе разработки я собираюсь использовать Постгрис. Но, повторюсь, я хочу чтоб это работало на практически любой популярной СУБД.

максимальное значение поля "родитель".
в постгресе тоже были но в каком-то левом патче. что такое поле "родитель" я не понял, попробуй почитать сначало это:
http://66.249.93.104/search?q=cache:pB0OkjmPh9UJ:downloads.ebuki.apvs.ru/Morgan.Kaufmann/Morgan.Kaufmann.Joe.Celkos.Trees.and.Hierarchies.in.SQL.for.Smarties.May.2004.eBook-DDU.pdf+Morgan.Kaufmann.Joe.Celkos.Trees.and.Hierarchies.in.SQL.for.Smarties.May.2004.eBook-DDU.pdf&hl=en&client=firefox-a
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33315006
Фотография Old Nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня сделано так:

Таблица иерархии
Id int
ParentId int

Таблица денормализации иерархии
ParentId
ChildId
Level

Пояснение: в эту таблицу, при добавлении записи в верхнюю, добавляются все отношения родитель-потомок с указанием уровня. Это позволяет найти всех детей и внуков и правнуков и ... элемента, достаточно указать ParentId. Можно также найти всех предков или другими словами путь до элемента, достаточно указать ChildId.
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33315043
it depends
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Old NickУ меня сделано так:

Таблица иерархии
Id int
ParentId int

Таблица денормализации иерархии
ParentId
ChildId
Level

Пояснение: в эту таблицу, при добавлении записи в верхнюю, добавляются все отношения родитель-потомок с указанием уровня. Это позволяет найти всех детей и внуков и правнуков и ... элемента, достаточно указать ParentId. Можно также найти всех предков или другими словами путь до элемента, достаточно указать ChildId.
Т.е. вторая таблица - это по сути транзитивное замыкание [графа иерархии]?
А каковы расходы на его поддержание при перемещении/удалении/вставке ветвей?
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33315048
it depends
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Old Nick
И еще вопрос - объемы (количество записей) во второй таблице по сравнению с первой?
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33315398
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Old NickУ меня сделано так:

Таблица иерархии
Id int
ParentId int

Таблица денормализации иерархии
ParentId
ChildId
Level


Немножко не въехал, чем отличаются таблицы, кроме дополнительного поля Level, и, если дело только в нем, то что это дает?
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33315465
Фотография Old Nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Представим дерево (в лесу которое) в виде иерархии

таблица Tree
Id Name ParentId
---------------
1 Корень null
2 Ствол Корень
3 Ветка Ствол
4 Листок Ветка

таблица TreePath
ChildId ParentId Level
----------------------
1 1 0 - Корень: нулевой уровень сам себе родитель
2 2 0 - Ствол: тоже самое
2 1 1 - Ствол принадлежит Корню напрямую
3 3 0 - Ветка сама себе принадлежит
3 2 1 - Ветка принадлежит стволу (напрямую)
3 1 2 - Ветка принадлежит Корню (через ствол)
4 4 0 - Листок сам себе
4 3 1 - Листок ветке
4 2 2 - Листок стволу
4 1 3 - Листок корню


Накладных расходов при добавлении записей не заметил, хотя они наверняка есть. Зато удобство и скорость выборки не сравнятся с рекурсивными запросами.

Например, найти все дочерние элементы данного ствола (со стволом впридачу)

select * from TreePath where ParentId = 2

Найти все листочки (элементы второго уровня)

select * from TreePath where ParentId = 2 and Level = 2

Найти путь до корня

select * from TreePath where ChildId = 4
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33315596
критика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Old NickПредставим дерево (в лесу которое) в виде иерархии

таблица Tree
Id Name ParentId
---------------
1 Корень null
2 Ствол Корень
3 Ветка Ствол
4 Листок Ветка

таблица TreePath
ChildId ParentId Level
----------------------
1 1 0 - Корень: нулевой уровень сам себе родитель
2 2 0 - Ствол: тоже самое
2 1 1 - Ствол принадлежит Корню напрямую
3 3 0 - Ветка сама себе принадлежит
3 2 1 - Ветка принадлежит стволу (напрямую)
3 1 2 - Ветка принадлежит Корню (через ствол)
4 4 0 - Листок сам себе
4 3 1 - Листок ветке
4 2 2 - Листок стволу
4 1 3 - Листок корню

Вот и сравните - объем исходной таблицы Tree (о дереве) и объем таблицы TreePath (транзитивное замыкание). Кстати, NestedSets (Joe Celko) - дает более компактное хранение.

Old Nick
Накладных расходов при добавлении записей не заметил, хотя они наверняка есть. Зато удобство и скорость выборки не сравнятся с рекурсивными запросами.

Если основные запросы - получить путь к узлу, получить всех потомков узла, то, естественно подобные структуры значительно уменьшают время выполнения.
Если чаще используются запросы - добавить узел, переместить ветвь( т.е. изменение структуры), получить родителя, получить потомков /соседей, то поддержка структур типа TreePath становится невыгодна.
В общем, это классический пример "размена пространства на время"
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33315782
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Old Nick
Спасибо. Понял.
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33315788
Фотография Old Nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Естесственно, это выгодно для случая, когда чаще делаем выборки чем изменение.
...
Рейтинг: 0 / 0
Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
    #33315795
Фотография Old Nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таким образом у меня построена иерархия классов в базе, иерархия папок, по большому счету все объекты в базе хранятся в папках. Делать выборки для отчетов и тд. очень удобно. С помощью папок удобно делать разные классификации.

Допустим есть географическая классификация: Страна, Регион, Город, Улица.

Задача найти компании находящиеся в городе Н. Делается простым запросом.
--------------------
Не учи отца и баста!
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Древовидная структура в РБД. Как нарисовать на концептуальной схемме?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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