powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как лучше реализовать в БД иерархическую структуру?
12 сообщений из 12, страница 1 из 1
Как лучше реализовать в БД иерархическую структуру?
    #39121824
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Я помнится на этом форуме видел топик с обсуждением способов хранения иерархических структур в базе данных. Но сейчас что-то поиском найти не смог, напишу новый топик.

Я оттуда для себя подчерпнул и использовал в своих проектах такой способ:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
TABLE object (
  id   SERIAL PRIMARY KEY,
  objData CHAR(255)
)

TABLE objectRel (
  id SERIAL PRIMARY KEY,
  masterID SERIAL,
  childID  SERIAL,
  relLevel INT UNSIGNED,
  UNIQUE KEY (masterID, childID),
  FOREIGN KEY (masterID) REFERENCES object(id) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (childID) REFERENCES object(id) ON DELETE CASCADE ON UPDATE CASCADE
)



где relLevel это уровень вложенности элемента childID в элементе masterID. Соответственно для дерева хранятся записи с вложенностью всех элементов.
С ростом числа элементов и их вложенностью таблица objectRel очень быстро растёт.

Скажите пожалуйста насколько это эффективный способ хранения древовидной структуры в БД.
...
Рейтинг: 0 / 0
Как лучше реализовать в БД иерархическую структуру?
    #39121827
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kormotС ростом числа элементов и их вложенностью таблица objectRel очень быстро
растёт.
Не очень быстро. Всего лишь M*N.

kormotнасколько это эффективный способ хранения древовидной структуры в БД.
Для хранения - совсем не эффективный. Для работы с этим деревом - очень эффективный. Выбирай.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше реализовать в БД иерархическую структуру?
    #39121838
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДля работы с этим деревом - очень эффективный.Точнее, эффективный для чтения.
Для модификации чудовищно неэффективный.
...
Рейтинг: 0 / 0
Как лучше реализовать в БД иерархическую структуру?
    #39121840
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftДля модификации чудовищно неэффективный.
Ну так модификация деревьев это обычно весьма редкая операция.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как лучше реализовать в БД иерархическую структуру?
    #39121846
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovkormotС ростом числа элементов и их вложенностью таблица objectRel очень быстро
растёт.
Не очень быстро. Всего лишь M*N.

Почему это м*н?

Похоже на просто м (число объектов, включая дочки) плюс число связей родители с дочками.

Так что вполне эффективно.
...
Рейтинг: 0 / 0
Как лучше реализовать в БД иерархическую структуру?
    #39128717
Gorm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ChaildID - совершенно абсолютно лишнее
...
Рейтинг: 0 / 0
Как лучше реализовать в БД иерархическую структуру?
    #39128997
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GormChaildID - совершенно абсолютно лишнее
Таблица objectRel без поля childID - это будет оригинально, да.
...
Рейтинг: 0 / 0
Как лучше реализовать в БД иерархическую структуру?
    #39131826
olzhas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kormot,

Дерево делается одной таблицей.

Код: sql
1.
2.
3.
4.
5.
create table tree (
object_id int not null primary key,
parent_id int reference tree(object_id),
object_data varchar(255)
)



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

Я может не особо sql знаю, но если использовать одну таблицу, то для вычисления потомков n-го уровня вложенности надо использовать рекурсию. Или это не так?

Можете мне пожалуйста для общего развития дать пример запроса выдающего из вашего примера всех потомков данного узла с указанием их уровня вложенности?
...
Рейтинг: 0 / 0
Как лучше реализовать в БД иерархическую структуру?
    #39137920
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olzhaskormot,

Дерево делается одной таблицей.

Код: sql
1.
2.
3.
4.
5.
create table tree (
object_id int not null primary key,
parent_id int reference tree(object_id),
object_data varchar(255)
)



Уровень можно вычислить запросом.

Тут проблема в том, что вставка/удаление будет быстрой, а вот поиск при большой глубине вложенности медленный.

Можно и по другому...
Через Nested set
Здесь с точностью до наоборот.
Поиск "быстрый", а вот вставка/удаление медленными.
...
Рейтинг: 0 / 0
Как лучше реализовать в БД иерархическую структуру?
    #39138132
Quotes Only
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://habrahabr.ru/post/193166/ Хранение деревьев в базе данных. Часть первая, теоретическая

Итак. Существует несколько шаблонов проектирования баз данных для хранения и обработки иерархических структур:
Adjacency List («список смежности»)

Materialized Path («материализованный путь»)

Nested Sets («вложенные множества»)

Closure Table («таблица связей»)

. . .
...
Рейтинг: 0 / 0
Как лучше реализовать в БД иерархическую структуру?
    #39138165
olzhas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kormot,

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


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