powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Таблица для хранения дерева бесконечной вложенности
25 сообщений из 46, страница 1 из 2
Таблица для хранения дерева бесконечной вложенности
    #35665199
Андрюхец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем, подскажите плизз хоть примерную структуру таблиц для храниня дерева бесконечной вложеннсти, чото сообразить не могу
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35665212
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35665219
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АндрюхецПривет всем, подскажите плизз хоть примерную структуру таблиц для храниня дерева бесконечной вложеннсти, чото сообразить не могуВсе уже придумано до нас. СУБД, конечно, другая, но принципы одни и те же.

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35665225
Фотография Василий Викторович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АндрюхецПривет всем, подскажите плизз хоть примерную структуру таблиц для храниня дерева бесконечной вложеннсти, чото сообразить не могу

поле id - номер записи
поле [parent id] - номер записи предка
data - данные

и по parent id - id связка 1 ко многим
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35665364
Андрюхец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я вот тут поразмышлял мне не надо бесконечную вложенность хранить максимум 5 ступеней
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35665384
all2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АндрюхецПривет всем, подскажите плизз хоть примерную структуру таблиц для храниня дерева бесконечной вложеннсти, чото сообразить не могу

здесь несколько структур найдешь)
http://gsbelarus.com/gs/modules.php?name=News&file=print&sid=314
Хотя эти линки в любом поисковике найти можно....
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35665641
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрюхец пишет:
> я вот тут поразмышлял мне не надо бесконечную вложенность хранить
> максимум 5 ступеней
Всё равно, структура от этого не меняется.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35669866
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
MasterZiv
Всё равно, структура от этого не меняется.

Может меняться. Если уровень вложенности конечен и известен, то проще использовать связи один-ко-многим
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35670483
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2 пишет:

> Может меняться. Если уровень вложенности конечен и известен, то проще
> использовать связи один-ко-многим
Это вообще-то и есть связь один-ко-многим. Один родитель, много детей.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35672446
RodionAT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий ВикторовичАндрюхецПривет всем, подскажите плизз хоть примерную структуру таблиц для храниня дерева бесконечной вложеннсти, чото сообразить не могу

поле id - номер записи
поле [parent id] - номер записи предка
data - данные

и по parent id - id связка 1 ко многим
Еще бы поле добавить - isgroup (Это группа) -логическое.
Вот только как запрос с группировкой будет выглядеть, если количество вложенности достигает больше скажем 10 и количество группировок разнится по группам?
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35672993
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RodionATЕще бы поле добавить - isgroup (Это группа) -логическое.
Зачем? Денормализация?

RodionATВот только как запрос с группировкой будет выглядеть, если количество вложенности достигает больше скажем 10 и количество группировок разнится по группам?
Не понял вопроса
Пример исходных данных и что конкретно хотим получить - в студию
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35675557
andreych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрюхеця вот тут поразмышлял мне не надо бесконечную вложенность хранить максимум 5 ступеней
А что мешает ограничение поставить. Структура таже что и выше, только добавить поле например nlevel, на него ограничение add constraint ch_level check (NLEVEL in (0,1,2,3,4,5)), это для оракла, все больше уровней не загонят.
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35675784
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreychА что мешает ограничение поставить. Структура таже что и выше, только добавить поле например nlevel, на него ограничение add constraint ch_level check (NLEVEL in (0,1,2,3,4,5)), это для оракла, все больше уровней не загонят.Откуда при построении деревьев столько любителей денормализации?!
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35676127
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelyОткуда при построении деревьев столько любителей денормализации?! +1
Оттуда они, из страны непуганных проектировщиков. Не сталкивались видимо с прелестями этой самой "денормализации", когда надо не просто сделать БД, которая работает здесь и сейчас, а еще и вести ее, реструктурировать.
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35677106
RodionAT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати пое Уровень стоит то же добавить. Ведь бывает такая ситуа:на одном уровне могут находится и группы более низкого уровня и записи, которые подчинены текущему уровню. В 1С такое организовано в справочниках.
А вот получить группированны + детализованные данные из таких структур без временной таблицы - проблема. Хотя больше работаю в Акцессе, можед в других СУРБД это и реализуется нормально.
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35677234
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RodionAT, 1С не хранит значение уровня
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35677730
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
Cat2 пишет:

> Может меняться. Если уровень вложенности конечен и известен, то проще
> использовать связи один-ко-многим
Это вообще-то и есть связь один-ко-многим. Один родитель, много детей.


Видимо не "один-ко-многим". Если количество вложений ограничено, можно использовать не только связь вида "свиное ухо", или как там его ещё называют... "рыбий хвост", т.е. когда внешний и первичный ключи находятся в одной таблице. Вариантов становится значительно больше.
Можно для каждого яруса создать отдельную таблицу. Такой подход оправдан, если ярусы дерева имеют разный тип, или есть желание декларативно ограничить число ярусов.
Можно использовать хитрый ключ, типа "id яруса 1,id яруса 2,...". Тогда будет очень просто писать иерархические запросы используя только SQL базового уровня.
И т.д.

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

> Видимо не "один-ко-многим".

То, о чем говорил я, -- "один-ко-многим"

> находятся в одной таблице. Вариантов становится значительно больше.

А смысл ? Лучше от этого ничего не будет, а потом в один прекрасный
момент приходит кто-то и говорит: "А можно мне тут ещё один уровень в
дерево добавить".

> Можно для каждого яруса создать отдельную таблицу. Такой подход

Вот бред-то ! А для каждого узла вы таблицу не хотите создавать ?
Не, можно всё. Но не нужно.

> Можно использовать хитрый ключ, типа "id яруса 1,id яруса 2,...". Тогда
> будет очень просто писать иерархические запросы используя только SQL
> базового уровня.

> Иногда нереляционные древовидные структуры пытаются тупо переносить в
> реляционную БД, при этом моделируемый объект оказывается разбитым на
> множество записей, которые сами по себе лишены бизнес смысла. Например,
> что такое имя файла без полного пути?

Имя файла в дирректории. А что такое полный путь к файлу ?
Сегодня он один, завтра - другой. Вообще в современных
файловых системах путей к файлу вообще много. И, кстати,
имён тоже. А вот размер поля вы под полный путь какой зададите ?
В файловой системе по идее путь может быть бесконечно длинным --
он не ограничен. И уже не говорю о том, что если нам нужно обрабатывать
отдельные каталоги полного пути, это будет нарушение 1НФ.

Ну и в общем, такие приёмы работы с деревьями, которые вы описываете,
"работают" в очень маленьком кол-ве случаев - когда есть жёсткая
иерархия, заданная в предметной области. Запросы там даются легко
не все, а только вниз по дереву (или вверх, если иерархически
построенный ключ перевернуть).

В общем совет-вывод: делайте лучше деревья по-честному,
как графы, неограниченной высоты и ширины, и очень будет хорошо
и гибко.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35679559
andreych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BelyОткуда при построении деревьев столько любителей денормализации?!
И причем здесь денормализация??? Где Вы ее увидили???
id ключ
pid ссылка на родителя
data значение
nlevel уровень
Где денормализация?
Я понимаю что можно в конструкции start with connect by prior можно использовать псевдостолбец level, но как по нему количество уровней ограничить?
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35679576
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreych,
По родителю однозначно определяется уровень, зависимость уровня от родителя. А зависимостей не должно быть. Но это все условно конечно.
Мне все больше нравится подход описанный в Древовидные структуры в SQL
(сразу после классического подхода)
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35679687
andreych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Naf,
Я Вас понял, но зачем писеть такие громские конструкции?
Не проще

select t.* from tab1 t
start with t.pid is null
connect by prior t.id = t.pid

У Кайта есть хорошее изречение, по памяти "Позвольте СУБД заниматся тем что она умеет лучше всего, хранить и обрабатывать данные". Я предложил один из вариантов, в данном случае конкретно для Oracle, этот несчастный столбец nlevel предназначен только для того чтобы пользователь не ввел лишний уровень, в моем примере их не больше 6, все. Checks для этого и предназначен. Что здесь денормальзующего?
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35679709
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreych,
я же написал "условно это". Я и сам использую денормализацию время от времени. Потому что места лишнего не жалко, а жалко времени выполнения. как говорится "либо много храним лишнего, либо долго считаем". Но в денормализации есть другая более опасная проблема. Источников данных получается несколько. В данном случае уровень можно вычислить, а можно получить из поля - 2 источника. и если какой то нерадивый (забывчивый) разработчик забудет синхронизировать эти источники, то получим большую проблему.
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35680507
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv

Имя файла в дирректории. А что такое полный путь к файлу ?


Полный путь - строка по которой можно однозначно идентифицировать файл в файловой системе.

MasterZiv

Сегодня он один, завтра - другой.



Прекрасно. Завтра делаем Update и всё в порядке.

MasterZiv
Вообще в современных
файловых системах путей к файлу вообще много. И, кстати,
имён тоже.


Бывает и такое. Только при чём тут деревья? Тут просто нужно отделять имя файла от его содержимого.

MasterZiv
А вот размер поля вы под полный путь какой зададите ? В файловой системе по идее путь может быть бесконечно длинным --
он не ограничен.


varchar2(256). Вы не поверите, но длина пути к файлу всё же ограничена. Как бы строковые буферы в системе для хранения полного имени имеют ограниченный размер.

MasterZiv

И уже не говорю о том, что если нам нужно обрабатывать
отдельные каталоги полного пути, это будет нарушение 1НФ.



Где же тут нарушение? Никакого нарушения тут нету. Есть файл или каталог, есть его полное имя. Два атрибута записи.
Конечно, операция переименования каталога не сводится к update одной записи. Нужно будет сделать update всех записей, которые относятся к этому каталогу. К стати тут автоматически будет выполняться проверка того, что в этом каталоге нет открытых файлов, что в иерархической структуре сделать не так просто.
Если обновить не все записи каталога, могут остаться файлы в старом каталоге, и появятся записи в новом каталоге, возможно это будет нарушением правил целостности с точки зрения обычной иерархической файловой системы, но кто говорил, что транзакции должны быть простые, а ограничения целостности исключительно декларативные!?
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35680531
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nafandreych,
я же написал "условно это". Я и сам использую денормализацию время от времени. Потому что места лишнего не жалко, а жалко времени выполнения. как говорится "либо много храним лишнего, либо долго считаем". Но в денормализации есть другая более опасная проблема. Источников данных получается несколько. В данном случае уровень можно вычислить, а можно получить из поля - 2 источника. и если какой то нерадивый (забывчивый) разработчик забудет синхронизировать эти источники, то получим большую проблему.

Прикольно будет, когда в дереве образуется петля...

Хранение вычисляемых значений, это скорее материализация, чем денормализация. Вычисляемое поле всегда можно вычислить заново используя первоисточник. Вопрос доверия к значению вычисляемого поля связан скорее с доверием к коду, который выполняет транзакции. Если код надёжный, то оба источника должны быть согласованы.

С введением сурогатных ключей классическое понятие нормализации отношения БД потеряло свой смысл. Мы можем произвольным образом взять набор атрибутов, прицепить к ним суррогатный ключ и сказать, что это новое отношение БД. Как выбрать эти атрибуты - дело вкуса и здравого смысла. Вы не докажете, что именно такое отношение однозначно правильное.
Дерево можно описывать маршрутами от корня к ветке или листу. Все маршруты с одинаковым корнем образуют дерево. Это удобно в том плане, что в одной записи сосредоточены все ключевые данные, чтобы простым запросом получить данные для любого яруса на маршруте. Легко исключить петли. Но высота таких деревьев ограничена.

Можно нарезать дерево на ярусы, и описавыть каждую ветку в своём ярусе. Тут мы имеем только ключь для предыдущего яруса, и чтобы добраться до корня нужно будет посетить несколько записей, что в ряде случаев очень неудобно. Трудно исключить петли. Зато количество ярусов не ограничено.
...
Рейтинг: 0 / 0
Таблица для хранения дерева бесконечной вложенности
    #35681150
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NafПо родителю однозначно определяется уровень, зависимость уровня от родителя. А зависимостей не должно быть. Но это все условно конечно.
Мне все больше нравится подход описанный в Древовидные структуры в SQL
(сразу после классического подхода)

Осилил!
Забавный метод, только НИКОГДА я не буду его использовать!

Да и изречение
NafА зависимостей не должно бытьчто-то не вяжется с NafМне все больше нравится подход...
т.к. там вообще все вершины деревьев неявно связаны: попробуйте добавить или удалить записи в дереве - пол дерева прийдется пересчитать.

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


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