Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Таблица для хранения дерева бесконечной вложенности / 25 сообщений из 46, страница 1 из 2
20.11.2008, 12:20:17
    #35665199
Андрюхец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица для хранения дерева бесконечной вложенности
Привет всем, подскажите плизз хоть примерную структуру таблиц для храниня дерева бесконечной вложеннсти, чото сообразить не могу
...
Рейтинг: 0 / 0
20.11.2008, 12:22:30
    #35665212
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица для хранения дерева бесконечной вложенности
...
Рейтинг: 0 / 0
20.11.2008, 12:24:19
    #35665219
Senya_L
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица для хранения дерева бесконечной вложенности
АндрюхецПривет всем, подскажите плизз хоть примерную структуру таблиц для храниня дерева бесконечной вложеннсти, чото сообразить не могуВсе уже придумано до нас. СУБД, конечно, другая, но принципы одни и те же.

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

В общем совет-вывод: делайте лучше деревья по-честному,
как графы, неограниченной высоты и ширины, и очень будет хорошо
и гибко.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
27.11.2008, 15:24:24
    #35679559
andreych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица для хранения дерева бесконечной вложенности
BelyОткуда при построении деревьев столько любителей денормализации?!
И причем здесь денормализация??? Где Вы ее увидили???
id ключ
pid ссылка на родителя
data значение
nlevel уровень
Где денормализация?
Я понимаю что можно в конструкции start with connect by prior можно использовать псевдостолбец level, но как по нему количество уровней ограничить?
...
Рейтинг: 0 / 0
27.11.2008, 15:29:09
    #35679576
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица для хранения дерева бесконечной вложенности
andreych,
По родителю однозначно определяется уровень, зависимость уровня от родителя. А зависимостей не должно быть. Но это все условно конечно.
Мне все больше нравится подход описанный в Древовидные структуры в SQL
(сразу после классического подхода)
...
Рейтинг: 0 / 0
27.11.2008, 15:52:32
    #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
27.11.2008, 15:58:17
    #35679709
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица для хранения дерева бесконечной вложенности
andreych,
я же написал "условно это". Я и сам использую денормализацию время от времени. Потому что места лишнего не жалко, а жалко времени выполнения. как говорится "либо много храним лишнего, либо долго считаем". Но в денормализации есть другая более опасная проблема. Источников данных получается несколько. В данном случае уровень можно вычислить, а можно получить из поля - 2 источника. и если какой то нерадивый (забывчивый) разработчик забудет синхронизировать эти источники, то получим большую проблему.
...
Рейтинг: 0 / 0
27.11.2008, 20:44:50
    #35680507
expla
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Таблица для хранения дерева бесконечной вложенности
MasterZiv

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


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

MasterZiv

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



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

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


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

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


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

MasterZiv

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



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

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

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

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

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

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

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

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


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