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

Поиск:

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


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Создать дерево с неограниченным уровнем вложенности - не проблема, но мне необходмо, чтобы содержимое какой-то ветки могло находится одновременно в нескольких ветках(разного уровня вложенности). Как посоветуете хранить данные и какую структуру выбрать?

P.S. программировать на PHP буду.
PM WWW   Вверх
Akina
Дата 27.1.2005, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



Ввести тип "алиас". Или, если хочешь, "ярлык". Как это сделано с мягкими ссылками в файловой системе.
Или разделить таблицу на "Объекты" и "Зависимости".


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Се ля ви
Дата 27.1.2005, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

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



ИМХО, подойдёт любая реальзация связи "многие ко многим" между сущностями внутри одной таблицы.

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


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Vyacheslav
Дата 2.2.2005, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Первая таблица Items (листья дерева )
ID - уникальный идентифкатор
Name - имя
...


Вторая таблица Tree(структура)

ID - уникальный идентифкатор
ParentID - индентифкатор владельца (ParentID->Tree.ID)
ItemID - идентификатор листа (ItemID->Items.ID)
...


Добавлено @ 13:07
Кстати есть и другие подходы
Вот посмотри на это
http://sdm.viptop.ru/articles/sqltrees.html


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Vit
Дата 2.2.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

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



Id|Parent|Level|Type|Context


Id - уникальный номер
Parent - ссылка на родительский узел
Level - уровень (не обязательно но деревья рисовать помогает)
Type - тип узла: узел, конечная статья, ярлык на другой узел, корневой узел
Context - содержимое




--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Се ля ви
Дата 2.2.2005, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

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



Цитата(Vit @ 2.2.2005, 15:49)
Level - уровень (не обязательно но деревья рисовать помогает)

Насколько я понял Admin`а, елементу нельзя задасть однозначный уровень, лишь в контексте одного пути обхода дерева такой уровень будет иметь смысл...


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
skyboy
Дата 19.7.2006, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А если для каждого "листа" может быть несколько значений - как из хапомнить? Ну, чтоб можно было восстановить? В моём случае дерево только хранит структуру ввода и отображения, а данных может быть много. Не создавать же каждый раз для каждого случая дерево-дубликат, но с конкретными данными!  
PM MAIL   Вверх
Wowa
Дата 19.7.2006, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Цитата(skyboy @  19.7.2006,  07:47 Найти цитируемый пост)
несколько значений

несколько это сколько? 
PM WWW   Вверх
skyboy
Дата 19.7.2006, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Wowa, неограничено. Структура деревянная хранит структуру полей объявления. Некоторые поля могут быть продублированы. Но суть не в том. А в том, что мне надо хранить данные отдельно от структуры, иначе получается дублирование данных. Идентификаторы полей я использовать не могу, потому как в дереве данных объявления(пускай будет раздел "обмен квартир") поле, к примеру, "количество комнат" будет входить не менее двух раз(кол-во комнат в меняемой квартире и в предполагаемой), но по дереву данных мы приходим к одному и тому же идентификатору поля, а ведь по смыслу это совсем разное. А по структуре они(поля) отличаются только путём достижения от корня - к количеству комнат целевой квартиры подходим через узел "квартира, которую ищу", а к количеству комнат имеющейся квартиры через узел "меняю квартиру"....  
PM MAIL   Вверх
LSD
Дата 19.7.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

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



Используй кросс и добавь туда поле с указанием типа связи: например указание, что это комнаты для меняемой квартиры или наоборот, для предполагаемой. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Cashey
Дата 19.7.2006, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(skyboy @  19.7.2006,  09:47 Найти цитируемый пост)
А если для каждого "листа" может быть несколько значений - как из хапомнить?

Связь много-ко-многим. Храни сожержимое в отдельной таблице и еще в одной таблице храни идентификаторы записей из таблицы структуры и из таблицы с содержимым 


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


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


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

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



давайте попробуем абстрагироваться от ТЗ и всяких там объявлений. И придумаем "универсальную" структуру для хранения данных уже не в дереве, а в графе с циклами. Вот на схеме набросал возможный вариант структуры. Как в этом случае хранить данные? Сам я реализовал вроде предложенного LSD, только храню не тип, а, фактически, весь путь по дереву(графу), который надо пройти, чтоб добраться до значения. Например для значения d я могу указать "1*1 3*1 7*1 8*1 d*1" или "1*1 2*1 4*1 7*1 8*1 d*1". "*1" надо для того, чтоб разрешить коллизии в случае, если ветка дерева может дублироваться(как можно ввести, например, в базу несколько телефонов, неограниченного количества). Если я захочу продублировать ветку 3, то данные будут в 
"1*1 3*1 7*1 8*1 d*1" и "1*1 3*2 7*1 8*1 d*1" - для поля "d" и так же для остальных полей... Вот только парсить строку потом долго. Но если разбить на пары и хранить в базе в числовом виде, то:
а) будет фактически копия исходной структуры - зачем дублировать информацию
б) для работы всё равно придётся собирать дерево - а SQL слабо подготовлен к подобным операциям
Вобщем, тупик smile

Добавлено @ 11:19 
Цитата(Cashey @  19.7.2006,  11:11 Найти цитируемый пост)
идентификаторы записей из таблицы

как мне определить однозначно каждую вариацию листа? всё-таки, неверно я деревом свою структуру назвал smile Это граф. Однозначно - направленный. Но с возможными циклами.  

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  graph.png 5,30 Kb
PM MAIL   Вверх
chief39
Дата 19.7.2006, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

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



Цитата(Wowa @  27.1.2005,  12:08 Найти цитируемый пост)
Создать дерево с неограниченным уровнем вложенности - не проблема, но мне необходмо, чтобы содержимое какой-то ветки могло находится одновременно в нескольких ветках(разного уровня вложенности). Как посоветуете хранить данные и какую структуру выбрать?

Переведём на аналог - файловую систему.

Цитата(Wowa @  27.1.2005,  12:08 Найти цитируемый пост)
но мне необходмо, чтобы содержимое какой-то ветки могло находится одновременно в нескольких ветках

Имеется в виду, "содержимое" - это "лист" или "в т.ч. и ветка", которая содержит ветви?
То есть:
а) есть дерево, и любой "лист" может копировать значение иного листа.
б) ветка может содержать в себе другую ветку, которая ещё до неё кем-то содержалась?
В варианте а) лучше сделать по примеру жёстких ссылок в линуховых FS
В варианте б) - многие-ко-многим "ребёнок-родитель".
Правда... могут быть зацикленности.... "когда папа является сыном соседа, а сын соседа - твоим папой"....
 


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Cashey
Дата 20.7.2006, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



skyboy, я так и не понимаю в чем тупик? У тебя практически обычное дерево, с наследованием. Единственное только у тебя один наследник может быть от разных "родителей". Для этого создаем связь много-ко-многим. Реализуя либо связующей таблицей, либо хранением guid через разделитель. Но второй способ явно неконструктивный.
Тебе надо создать (лучше использовать уже созданные) алгоритм присваения уникального значения. И у тебя получится 4 таблицу
В первой у тебя будет хранится структура дерева, где у кадой записи будет уникальный идентификатор, уровень вложенности.
Во второй будет 2 поля guid каждой записи из первой таблицы и guid "родительской" записи из той же таблицы. Это нужно, что бы отследить несколько "родителей" каждой ветви дерева.
В третей таблице будут хранится описания для каждой ветви
И четвертая будет по структуре копия второй, только хранить она будет guid из первой и привязанный к нему guid из третий таблицы. Понятно? 


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


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


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

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



Цитата(Cashey @  20.7.2006,  21:46 Найти цитируемый пост)
один наследник может быть от разных "родителей"

не "от разных", а от "нескольких". Причём - одновременно. Например, структура номера телефона может наследоваться от ветви "Я" и от ветви "Мой брат". Т.к. структура всё равно едина, то уникальный идентификатор листа "телефон" в пределах структуры будет неуникален. И, запомнив телефон, будет неясно, к какой подветви относятся данные. Потому - либо делать все листья уникальными(в общем случае - бессмысленно, т.к. одна и та же структура может входить в родительскую структуру в разных вариациях, и дублировать структуру - нерационально), либо же каким-то образом запоминать весь путь восстановления данных - т.е. фактически запоминать структуру. 
И опять же про телефон - у каждого из нас с братом может быть не один номер телефона. Это аргумент в пользу динамической структуры в противовес жестко заданной, но с уникальными  идентификаторами. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

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

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

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

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

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


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

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

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

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

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


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

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


 




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


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

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