Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание дерева с неогр. уровнем вложенности, MySQL. Проектирование БД, 
:(
    Опции темы
Cashey
Дата 20.7.2006, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Боже, ну чего не понятно?!
Таблица 1
GUID Название Уровень
g1        Папа          1
g2        Я                 2
g3        Мой брат    2
 
Таблица 2
child_guid   parent_guid
g2                      g1
g3                      g1

Таблица 3
GUID    Содержание
g11            01
g12            02
g13            03

Таблица 4
child_guid   parent_guid
g11                     g2
g12                     g2
g12                     g3
g13                     g3

Ну и тянем 2-мя JOIN'ами
Код

SELECT * FROM Таблица 3 t3
LEFT JOIN Таблица 4 t4 ON t4.child_guid = t3.GUID
LEFT JOIN Таблица 1 t1 ON t1.GUID = t4.parent_guid


Добавлено @ 23:09 
Вторая таблица будет служить для поиска множества "потомков" млм "родителей". Хотя можно обойтись и без нее, храня "родительский" GUID в Таблице 1 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
xml
Дата 21.7.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 21.7.2006

Репутация: нет
Всего: нет



Цитата(Се ля ви @ 27.1.2005,  14:58)
ИМХО, подойдёт любая реальзация связи "многие ко многим" между сущностями внутри одной таблицы.

Вообще-то такие структуры лучше делать в XML и обращаться при помощи XQL или XQuary - поддержка этого есть в Оракле и некоторых других БД (собственно, для таких задачь и создаётся XML-ные БД, по-моему).

Согласен, чисто реляционные БД - очень неудобный инструмент для работы с иерархическими структурами. Дело не только в ручной идентификации каждой вершины. Поиск вершин по их относительному расположению в SQL-БД сводится к полному перебору дерева. Языковые инструменты также слабоваты. Все сводится к чему-то типа
SELECT LEVEL, name
FROM employees
START WITH name = 'Mary'
CONNECT BY PRIOR emp_no = mgr_no 

Больше подходит XQuery и Zigzag. Последний мне даже кажется более выразительным. Например, то что в XML выглядит так
Цитата

<A>
  <B>
    <C1>
      <D1 a='b' />
    </C1>
    <C2>
      <D1 a='b' />
    </C2>
  </B>
</A>

На Zigzag можно представить
Цитата

A: B: [C1,C2]: D1(a:'b')= ;


На Zigzag запросы и утверждения, задающие новые связи, выглядят почти одинаково:
= A:B
A:B =
Сравните запросы "найти все вершины с атрибутом a='b'"
XQuery
Цитата

for $x in //.[@a=b]
  return $x/

Zigzag
Цитата

= (a:'b')


На сколько мне известно для Zigzag и  XQuery созданы очень мощные средства индексации, позволяющие обходиться без полного перебора дерева при выполнении запроса. 
PM MAIL   Вверх
skyboy
Дата 21.7.2006, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



Cashey, я, видимо, плохо обьяснил. Ты мне привел в пример структуру дерево, в котором только как для меня, так и для брата, значеник g12 будет одинаковым, т.е. "02". А мне надо хранить в g12 со стороны родителя g2 одно значение(05), а со стороны родителя g3 - другое значение. Если не сложно, загляни в файл-схему приклреплённую к одному из предыдущих постов. Впрочем, её тоже можно понять неверно. a,b,c,d ... - это не значения. Это место для значения. Там должен стоять уникальный идентификатор значения, что-то типа указателя в ЯВУ. Так вот, этот "указатель" должен иметь разные значения, в зависимости от того, каким путём достигли его.

Добавлено @ 18:07 
например, по пути 1-3-7 в "с"  хранится 21, а по пути 1-2-4-7 в том же "с" "хранится" уже -48. 
PM MAIL   Вверх
Cashey
Дата 22.7.2006, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(skyboy @  21.7.2006,  19:06 Найти цитируемый пост)
 мне надо хранить в g12 со стороны родителя g2 одно значение(05), а со стороны родителя g3 - другое значение.

ну так я так и понял и мой пример именно это и реализует.
g12 это идентификатор именно значения "02". А "05" это уже другое знаечение и у него должен быть свой уникальный идентификатор, например g15. А вот то какое значение будет у родителя определяется уже в 4-й таблице/ У одного значения никак не может быть одинаковый идентификатор, да и не может быть задачи, которая этого может потребовать. А вот получить различные значения можно определив к одному родителя несколько значений 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
skyboy
Дата 22.7.2006, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



Cashey, ты понял постановку не мою, а Wowa. Я же эту постановку расширил. Потому специально прикрепил схему и описал, что и как.
Цитата(Cashey @  22.7.2006,  20:01 Найти цитируемый пост)
 А "05" это уже другое знаечение и у него должен быть свой уникальный идентификатор, например g15. 

Я понял. Потому и сказал, что это - не моё. Это, если я правильно понял, nested sets, да? А мне надо более универсальное решение. Впрочем, как мне кажется уж лучше хранения пути не будет ничего smile
Цитата(Cashey @  22.7.2006,  20:01 Найти цитируемый пост)
У одного значения никак не может быть одинаковый идентификатор

Чего-чего?  smile 
Цитата(Cashey @  22.7.2006,  20:01 Найти цитируемый пост)
 да и не может быть задачи, которая этого может потребовать

Да ну? smile Надо же: думать-думаю, решать-решаю, а задачи - нет...
 
PM MAIL   Вверх
Cashey
Дата 24.7.2006, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



skyboy, ты должен понять одну вещь. Значение ВСЕГДА либо одно, либо несколько. Если их несколько, то они ВСЕГДА отличаются друг от друга (т.е. "2", "2", "2" - это все одно значение; а "01", "02", "03" - это 3 разных значения). И здесь не может и не должно быть ничего другого. А вот то, какое из этих значений будет соответсвовать ветвям твоего дерева, при каких-то условиях описывается отдельно.  


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
skyboy
Дата 24.7.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



Цитата(Cashey @  24.7.2006,  09:36 Найти цитируемый пост)
Значение ВСЕГДА либо одно, либо несколько.

Это ты к чему? А 1 - в любой системе счисления = 1? поясни, что ты имел в виду.
Если касательно моей задачи, то мне надо разделить граф, как структуру и сами данные, связанные с разными полями. Граф был раньше деревом, но т.к. в нём были полностью идентичные ветви, то я эти ветви "свернул"(как сам сказал 
Цитата

"2", "2", "2" - это все одно значение; а "01", "02", "03" - это 3 разных значения
)
И после этого потерялась уникальность узлов: те данные, которые раньше относились к разным узлам после сворачивания стали относится к одним и тем же. В этом заключалась проблема, и я искал решение, альтернативное запоминанию полного пути. Вот. И всё.  
PM MAIL   Вверх
Cashey
Дата 24.7.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(skyboy @  24.7.2006,  12:15 Найти цитируемый пост)
Это ты к чему? А 1 - в любой системе счисления = 1? поясни, что ты имел в виду.

я имел ввиду, что единиц может быть сколько угодно, но это все равно останется единица ( я не имею ввиду сложение).

Цитата(skyboy @  24.7.2006,  12:15 Найти цитируемый пост)
Если касательно моей задачи, то мне надо разделить граф, как структуру и сами данные, связанные с разными полями. Граф был раньше деревом, но т.к. в нём были полностью идентичные ветви, то я эти ветви "свернул"(как сам сказал 
Цитата

"2", "2", "2" - это все одно значение; а "01", "02", "03" - это 3 разных значения
)
И после этого потерялась уникальность узлов: те данные, которые раньше относились к разным узлам после сворачивания стали относится к одним и тем же. В этом заключалась проблема, и я искал решение, альтернативное запоминанию полного пути. Вот. И всё.  

Я упорно не могу тебя понять (или понять, чего не понимаешь ты) Тебе достаточно будет хранить только идентификатор родительских ветвей. А зачем весь путь не понимаю, это ты их будешь раскручивать на каждом шаге формирования дерева.
А вообще, давай сначало. Тебе надо сформировать свой граф снизу или сверху т.е. от корней или от ветвей? 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
skyboy
Дата 24.7.2006, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



Цитата(Cashey @  24.7.2006,  13:50 Найти цитируемый пост)
чего не понимаешь ты

в смысле - я сам себя не понимаю?  smile 
Цитата(Cashey @  24.7.2006,  13:50 Найти цитируемый пост)
 весь путь

мне надо храниться не для узлов дерева(точнее, графа), а для каждого хранимого значения. 
Цитата(Cashey @  24.7.2006,  13:50 Найти цитируемый пост)
А вообще, давай сначало. Тебе надо сформировать свой граф снизу или сверху т.е. от корней или от ветвей? 

Граф я формирую сверху. По мере формирования, набираю в эту структуру значения. Вот тут-то мне и приходится(приходилось?) хранить полный путь. Потому как при формировании дерева на узел с условным идентификатором 222 я могу выйти и на втором уровне рекурсии, и на 42, причём, узел будет один и тот же(характеристики, свойственные именно этому узлу будут общие, вне зависимости от уровня рекурсии - уровня графа), но данные в этом узле будут разные.  
PM MAIL   Вверх
Cashey
Дата 24.7.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(skyboy @  24.7.2006,  15:35 Найти цитируемый пост)
Потому как при формировании дерева на узел с условным идентификатором 222 я могу выйти и на втором уровне рекурсии, и на 42, причём, узел будет один и тот же(характеристики, свойственные именно этому узлу будут общие, вне зависимости от уровня рекурсии - уровня графа), но данные в этом узле будут разные.   

Ну вот ты сам пишешь правильные слова - с условным идентификатором. Я так понимаю, что хоть на 2-м, хоть на 42-м, хоть на 142-м шаге ты выходишь все равно на этот идентификатор? Данные будут разные? Не проблема, а по какому принципу они будут отличатся? 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
skyboy
Дата 24.7.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



Цитата(Cashey @  24.7.2006,  14:49 Найти цитируемый пост)
Ну вот ты сам пишешь правильные слова - с условным идентификатором.

Дать тебе ещё ссылки на "правильные слова" вроде "дерево" или "граф"?  smile А что, раньшене правильно говорил? 
Цитата(Cashey @  24.7.2006,  14:49 Найти цитируемый пост)
Я так понимаю, что хоть на 2-м, хоть на 42-м, хоть на 142-м шаге

не совсем "шаг". Это - почти "уровень". С той лишь разницей, что один и тото же узел может иметь одновременно несколько различных значений этого "уровня", те. будет достигаем за различное количество шагов, принимая за точку отсчёта вершину графа.
Цитата(Cashey @  24.7.2006,  14:49 Найти цитируемый пост)
а по какому принципу они будут отличатся

данные-то? а данные - произвольны smile Это могут быть адреса, номера телефонов, фамилии... По какому принципу могут отличаться друг от друга две фамилии? smile
 
PM MAIL   Вверх
Cashey
Дата 24.7.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(skyboy @  24.7.2006,  16:03 Найти цитируемый пост)

Дать тебе ещё ссылки на "правильные слова" вроде "дерево" или "граф"?  smile А что, раньшене правильно говорил? 

а мне уже показалось, что ты начал понимать то, что я хочу донести  smile 

Цитата(skyboy @  24.7.2006,  16:03 Найти цитируемый пост)
данные-то? а данные - произвольны smile Это могут быть адреса, номера телефонов, фамилии... По какому принципу могут отличаться друг от друга две фамилии? smile

фамилии то пусть будут произвольными, а вот по какому принципу конкретная фамилия должна соответствовать конкретному узлу? т.е почему
Цитата(skyboy @  24.7.2006,  15:35 Найти цитируемый пост)
причём, узел будет один и тот же(характеристики, свойственные именно этому узлу будут общие, вне зависимости от уровня рекурсии - уровня графа), но данные в этом узле будут разные.   

? 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
skyboy
Дата 24.7.2006, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



если у меня НЕ дерево, а граф(скажем так, направленный: т.е. как такого направления в логике структуры нет, но когда я обрабатываю структуру, я не могу "идти против потока", во время перебора узлов), то в этом графе одного и того же узла можно достигнуть разными "путями"(пройдя через различную последовательность узлов). Так вот, в заваисимости от этого "пройденного" пути, как раз и выбираются те или иные данные. 
Цитата(Cashey @  24.7.2006,  15:29 Найти цитируемый пост)
а мне уже показалось, что ты начал понимать то, что я хочу донести  

да я-то  понял, что ты хочешь донести. Именно потому уже неоднократно говорил, что это - не то. Ты мне предлагаешь дерево, с однозначной структурой и однозначной привязкой данных. Моя же структура НЕ дерево. Однозначна только изначально. В каждой своей "реализации"(наполнении данными) структура будет(может быть) уже другой. Не кардинально, но значительно: некоторые узлы продублируются, некоторые - отбросятся...  
PM MAIL   Вверх
Cashey
Дата 26.7.2006, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



skyboy, у меня складывается впечатление, что идет разговор глухого с немым smile то, что ты нарисовал на схеме является деревом, а ни каким не графом. и, как я понял, определение значения идет по тому, кто я вляется уровнем +1 для выбранной ветви данных. почему тебя клинит на каких-то графах я никак не пойму. думаю, будет лучше если ты опишешь всю задачу. тогда будет легче помочь тебе с алгоритмом ее решения. 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
pythonwin
Дата 27.7.2006, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 1
Всего: 36



Ничего не понимаю...  smile  Вы тут, что ли рекурсию в БД  обсуждаем? 
PM WWW GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1497 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.