|
|
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
Привет всем, подскажите плизз хоть примерную структуру таблиц для храниня дерева бесконечной вложеннсти, чото сообразить не могу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2008, 12:20 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2008, 12:22 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
АндрюхецПривет всем, подскажите плизз хоть примерную структуру таблиц для храниня дерева бесконечной вложеннсти, чото сообразить не могуВсе уже придумано до нас. СУБД, конечно, другая, но принципы одни и те же. Модератор: Тема перенесена из форума "Microsoft SQL Server". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2008, 12:24 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
АндрюхецПривет всем, подскажите плизз хоть примерную структуру таблиц для храниня дерева бесконечной вложеннсти, чото сообразить не могу поле id - номер записи поле [parent id] - номер записи предка data - данные и по parent id - id связка 1 ко многим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2008, 12:26 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
я вот тут поразмышлял мне не надо бесконечную вложенность хранить максимум 5 ступеней ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2008, 12:57 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
АндрюхецПривет всем, подскажите плизз хоть примерную структуру таблиц для храниня дерева бесконечной вложеннсти, чото сообразить не могу здесь несколько структур найдешь) http://gsbelarus.com/gs/modules.php?name=News&file=print&sid=314 Хотя эти линки в любом поисковике найти можно.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2008, 13:00 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
Андрюхец пишет: > я вот тут поразмышлял мне не надо бесконечную вложенность хранить > максимум 5 ступеней Всё равно, структура от этого не меняется. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2008, 14:05 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
MasterZiv Всё равно, структура от этого не меняется. Может меняться. Если уровень вложенности конечен и известен, то проще использовать связи один-ко-многим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2008, 21:08 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
Cat2 пишет: > Может меняться. Если уровень вложенности конечен и известен, то проще > использовать связи один-ко-многим Это вообще-то и есть связь один-ко-многим. Один родитель, много детей. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2008, 19:56 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
Василий ВикторовичАндрюхецПривет всем, подскажите плизз хоть примерную структуру таблиц для храниня дерева бесконечной вложеннсти, чото сообразить не могу поле id - номер записи поле [parent id] - номер записи предка data - данные и по parent id - id связка 1 ко многим Еще бы поле добавить - isgroup (Это группа) -логическое. Вот только как запрос с группировкой будет выглядеть, если количество вложенности достигает больше скажем 10 и количество группировок разнится по группам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2008, 17:59 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
RodionATЕще бы поле добавить - isgroup (Это группа) -логическое. Зачем? Денормализация? RodionATВот только как запрос с группировкой будет выглядеть, если количество вложенности достигает больше скажем 10 и количество группировок разнится по группам? Не понял вопроса Пример исходных данных и что конкретно хотим получить - в студию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2008, 07:05 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
Андрюхеця вот тут поразмышлял мне не надо бесконечную вложенность хранить максимум 5 ступеней А что мешает ограничение поставить. Структура таже что и выше, только добавить поле например nlevel, на него ограничение add constraint ch_level check (NLEVEL in (0,1,2,3,4,5)), это для оракла, все больше уровней не загонят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 09:38 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
andreychА что мешает ограничение поставить. Структура таже что и выше, только добавить поле например nlevel, на него ограничение add constraint ch_level check (NLEVEL in (0,1,2,3,4,5)), это для оракла, все больше уровней не загонят.Откуда при построении деревьев столько любителей денормализации?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 10:48 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
BelyОткуда при построении деревьев столько любителей денормализации?! +1 Оттуда они, из страны непуганных проектировщиков. Не сталкивались видимо с прелестями этой самой "денормализации", когда надо не просто сделать БД, которая работает здесь и сейчас, а еще и вести ее, реструктурировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 12:15 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
Кстати пое Уровень стоит то же добавить. Ведь бывает такая ситуа:на одном уровне могут находится и группы более низкого уровня и записи, которые подчинены текущему уровню. В 1С такое организовано в справочниках. А вот получить группированны + детализованные данные из таких структур без временной таблицы - проблема. Хотя больше работаю в Акцессе, можед в других СУРБД это и реализуется нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 16:17 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
RodionAT, 1С не хранит значение уровня ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 16:58 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
MasterZiv Cat2 пишет: > Может меняться. Если уровень вложенности конечен и известен, то проще > использовать связи один-ко-многим Это вообще-то и есть связь один-ко-многим. Один родитель, много детей. Видимо не "один-ко-многим". Если количество вложений ограничено, можно использовать не только связь вида "свиное ухо", или как там его ещё называют... "рыбий хвост", т.е. когда внешний и первичный ключи находятся в одной таблице. Вариантов становится значительно больше. Можно для каждого яруса создать отдельную таблицу. Такой подход оправдан, если ярусы дерева имеют разный тип, или есть желание декларативно ограничить число ярусов. Можно использовать хитрый ключ, типа "id яруса 1,id яруса 2,...". Тогда будет очень просто писать иерархические запросы используя только SQL базового уровня. И т.д. Иногда нереляционные древовидные структуры пытаются тупо переносить в реляционную БД, при этом моделируемый объект оказывается разбитым на множество записей, которые сами по себе лишены бизнес смысла. Например, что такое имя файла без полного пути? Понятно, что в файловой системе операционной системы удобно иметь иерархию вложенных папок, но в реляционной БД более осмысленным будет хранение полного имени файла (хотя бы для того, чтобы обновления и поиски нормально работали). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 21:04 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
expla пишет: > Видимо не "один-ко-многим". То, о чем говорил я, -- "один-ко-многим" > находятся в одной таблице. Вариантов становится значительно больше. А смысл ? Лучше от этого ничего не будет, а потом в один прекрасный момент приходит кто-то и говорит: "А можно мне тут ещё один уровень в дерево добавить". > Можно для каждого яруса создать отдельную таблицу. Такой подход Вот бред-то ! А для каждого узла вы таблицу не хотите создавать ? Не, можно всё. Но не нужно. > Можно использовать хитрый ключ, типа "id яруса 1,id яруса 2,...". Тогда > будет очень просто писать иерархические запросы используя только SQL > базового уровня. > Иногда нереляционные древовидные структуры пытаются тупо переносить в > реляционную БД, при этом моделируемый объект оказывается разбитым на > множество записей, которые сами по себе лишены бизнес смысла. Например, > что такое имя файла без полного пути? Имя файла в дирректории. А что такое полный путь к файлу ? Сегодня он один, завтра - другой. Вообще в современных файловых системах путей к файлу вообще много. И, кстати, имён тоже. А вот размер поля вы под полный путь какой зададите ? В файловой системе по идее путь может быть бесконечно длинным -- он не ограничен. И уже не говорю о том, что если нам нужно обрабатывать отдельные каталоги полного пути, это будет нарушение 1НФ. Ну и в общем, такие приёмы работы с деревьями, которые вы описываете, "работают" в очень маленьком кол-ве случаев - когда есть жёсткая иерархия, заданная в предметной области. Запросы там даются легко не все, а только вниз по дереву (или вверх, если иерархически построенный ключ перевернуть). В общем совет-вывод: делайте лучше деревья по-честному, как графы, неограниченной высоты и ширины, и очень будет хорошо и гибко. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2008, 21:36 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
BelyОткуда при построении деревьев столько любителей денормализации?! И причем здесь денормализация??? Где Вы ее увидили??? id ключ pid ссылка на родителя data значение nlevel уровень Где денормализация? Я понимаю что можно в конструкции start with connect by prior можно использовать псевдостолбец level, но как по нему количество уровней ограничить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 15:24 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
andreych, По родителю однозначно определяется уровень, зависимость уровня от родителя. А зависимостей не должно быть. Но это все условно конечно. Мне все больше нравится подход описанный в Древовидные структуры в SQL (сразу после классического подхода) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 15:29 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
Naf, Я Вас понял, но зачем писеть такие громские конструкции? Не проще select t.* from tab1 t start with t.pid is null connect by prior t.id = t.pid У Кайта есть хорошее изречение, по памяти "Позвольте СУБД заниматся тем что она умеет лучше всего, хранить и обрабатывать данные". Я предложил один из вариантов, в данном случае конкретно для Oracle, этот несчастный столбец nlevel предназначен только для того чтобы пользователь не ввел лишний уровень, в моем примере их не больше 6, все. Checks для этого и предназначен. Что здесь денормальзующего? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 15:52 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
andreych, я же написал "условно это". Я и сам использую денормализацию время от времени. Потому что места лишнего не жалко, а жалко времени выполнения. как говорится "либо много храним лишнего, либо долго считаем". Но в денормализации есть другая более опасная проблема. Источников данных получается несколько. В данном случае уровень можно вычислить, а можно получить из поля - 2 источника. и если какой то нерадивый (забывчивый) разработчик забудет синхронизировать эти источники, то получим большую проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 15:58 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
MasterZiv Имя файла в дирректории. А что такое полный путь к файлу ? Полный путь - строка по которой можно однозначно идентифицировать файл в файловой системе. MasterZiv Сегодня он один, завтра - другой. Прекрасно. Завтра делаем Update и всё в порядке. MasterZiv Вообще в современных файловых системах путей к файлу вообще много. И, кстати, имён тоже. Бывает и такое. Только при чём тут деревья? Тут просто нужно отделять имя файла от его содержимого. MasterZiv А вот размер поля вы под полный путь какой зададите ? В файловой системе по идее путь может быть бесконечно длинным -- он не ограничен. varchar2(256). Вы не поверите, но длина пути к файлу всё же ограничена. Как бы строковые буферы в системе для хранения полного имени имеют ограниченный размер. MasterZiv И уже не говорю о том, что если нам нужно обрабатывать отдельные каталоги полного пути, это будет нарушение 1НФ. Где же тут нарушение? Никакого нарушения тут нету. Есть файл или каталог, есть его полное имя. Два атрибута записи. Конечно, операция переименования каталога не сводится к update одной записи. Нужно будет сделать update всех записей, которые относятся к этому каталогу. К стати тут автоматически будет выполняться проверка того, что в этом каталоге нет открытых файлов, что в иерархической структуре сделать не так просто. Если обновить не все записи каталога, могут остаться файлы в старом каталоге, и появятся записи в новом каталоге, возможно это будет нарушением правил целостности с точки зрения обычной иерархической файловой системы, но кто говорил, что транзакции должны быть простые, а ограничения целостности исключительно декларативные!? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 20:44 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
Nafandreych, я же написал "условно это". Я и сам использую денормализацию время от времени. Потому что места лишнего не жалко, а жалко времени выполнения. как говорится "либо много храним лишнего, либо долго считаем". Но в денормализации есть другая более опасная проблема. Источников данных получается несколько. В данном случае уровень можно вычислить, а можно получить из поля - 2 источника. и если какой то нерадивый (забывчивый) разработчик забудет синхронизировать эти источники, то получим большую проблему. Прикольно будет, когда в дереве образуется петля... Хранение вычисляемых значений, это скорее материализация, чем денормализация. Вычисляемое поле всегда можно вычислить заново используя первоисточник. Вопрос доверия к значению вычисляемого поля связан скорее с доверием к коду, который выполняет транзакции. Если код надёжный, то оба источника должны быть согласованы. С введением сурогатных ключей классическое понятие нормализации отношения БД потеряло свой смысл. Мы можем произвольным образом взять набор атрибутов, прицепить к ним суррогатный ключ и сказать, что это новое отношение БД. Как выбрать эти атрибуты - дело вкуса и здравого смысла. Вы не докажете, что именно такое отношение однозначно правильное. Дерево можно описывать маршрутами от корня к ветке или листу. Все маршруты с одинаковым корнем образуют дерево. Это удобно в том плане, что в одной записи сосредоточены все ключевые данные, чтобы простым запросом получить данные для любого яруса на маршруте. Легко исключить петли. Но высота таких деревьев ограничена. Можно нарезать дерево на ярусы, и описавыть каждую ветку в своём ярусе. Тут мы имеем только ключь для предыдущего яруса, и чтобы добраться до корня нужно будет посетить несколько записей, что в ряде случаев очень неудобно. Трудно исключить петли. Зато количество ярусов не ограничено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2008, 21:10 |
|
||
|
Таблица для хранения дерева бесконечной вложенности
|
|||
|---|---|---|---|
|
#18+
NafПо родителю однозначно определяется уровень, зависимость уровня от родителя. А зависимостей не должно быть. Но это все условно конечно. Мне все больше нравится подход описанный в Древовидные структуры в SQL (сразу после классического подхода) Осилил! Забавный метод, только НИКОГДА я не буду его использовать! Да и изречение NafА зависимостей не должно бытьчто-то не вяжется с NafМне все больше нравится подход... т.к. там вообще все вершины деревьев неявно связаны: попробуйте добавить или удалить записи в дереве - пол дерева прийдется пересчитать. Пардон за отход от темы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2008, 10:44 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35679576&tid=1543543]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
181ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 535ms |

| 0 / 0 |
