![]() |
|
Модераторы: LSD |
![]()
|
|
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
Создать дерево с неограниченным уровнем вложенности - не проблема, но мне необходмо, чтобы содержимое какой-то ветки могло находится одновременно в нескольких ветках(разного уровня вложенности). Как посоветуете хранить данные и какую структуру выбрать?
P.S. программировать на PHP буду. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 13 Всего: 454 |
Ввести тип "алиас". Или, если хочешь, "ярлык". Как это сделано с мягкими ссылками в файловой системе.
Или разделить таблицу на "Объекты" и "Зависимости". -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Се ля ви |
|
|||
![]() Java/SOAрхитектор ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2016 Регистрация: 5.6.2004 Где: place without tim e and space Репутация: нет Всего: 127 |
ИМХО, подойдёт любая реальзация связи "многие ко многим" между сущностями внутри одной таблицы.
Вообще-то такие структуры лучше делать в XML и обращаться при помощи XQL или XQuary - поддержка этого есть в Оракле и некоторых других БД (собственно, для таких задачь и создаётся XML-ные БД, по-моему). -------------------- |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 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 -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Vit |
|
|||
![]() 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 |
|||
|
||||
| Се ля ви |
|
|||
![]() Java/SOAрхитектор ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2016 Регистрация: 5.6.2004 Где: place without tim e and space Репутация: нет Всего: 127 |
Насколько я понял Admin`а, елементу нельзя задасть однозначный уровень, лишь в контексте одного пути обхода дерева такой уровень будет иметь смысл... -------------------- |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 5 Всего: 260 |
А если для каждого "листа" может быть несколько значений - как из хапомнить? Ну, чтоб можно было восстановить? В моём случае дерево только хранит структуру ввода и отображения, а данных может быть много. Не создавать же каждый раз для каждого случая дерево-дубликат, но с конкретными данными!
|
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: 1 Всего: 290 |
||||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 5 Всего: 260 |
Wowa, неограничено. Структура деревянная хранит структуру полей объявления. Некоторые поля могут быть продублированы. Но суть не в том. А в том, что мне надо хранить данные отдельно от структуры, иначе получается дублирование данных. Идентификаторы полей я использовать не могу, потому как в дереве данных объявления(пускай будет раздел "обмен квартир") поле, к примеру, "количество комнат" будет входить не менее двух раз(кол-во комнат в меняемой квартире и в предполагаемой), но по дереву данных мы приходим к одному и тому же идентификатору поля, а ведь по смыслу это совсем разное. А по структуре они(поля) отличаются только путём достижения от корня - к количеству комнат целевой квартиры подходим через узел "квартира, которую ищу", а к количеству комнат имеющейся квартиры через узел "меняю квартиру"....
|
|||
|
||||
| LSD |
|
|||
![]() 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. |
|||
|
||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: нет Всего: 60 |
Связь много-ко-многим. Храни сожержимое в отдельной таблице и еще в одной таблице храни идентификаторы записей из таблицы структуры и из таблицы с содержимым -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 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 слабо подготовлен к подобным операциям Вобщем, тупик Добавлено @ 11:19 как мне определить однозначно каждую вариацию листа? всё-таки, неверно я деревом свою структуру назвал Присоединённый файл ( Кол-во скачиваний: 13 )
graph.png 5,30 Kb |
|||
|
||||
| chief39 |
|
|||
![]() карманная тигра ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1631 Регистрация: 20.5.2005 Где: Киев Репутация: 8 Всего: 77 |
Переведём на аналог - файловую систему.
Имеется в виду, "содержимое" - это "лист" или "в т.ч. и ветка", которая содержит ветви? То есть: а) есть дерево, и любой "лист" может копировать значение иного листа. б) ветка может содержать в себе другую ветку, которая ещё до неё кем-то содержалась? В варианте а) лучше сделать по примеру жёстких ссылок в линуховых FS В варианте б) - многие-ко-многим "ребёнок-родитель". Правда... могут быть зацикленности.... "когда папа является сыном соседа, а сын соседа - твоим папой".... -------------------- Люди - это свечи. Они либо горят, либо их - в жопу!(с) |
|||
|
||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: нет Всего: 60 |
skyboy, я так и не понимаю в чем тупик? У тебя практически обычное дерево, с наследованием. Единственное только у тебя один наследник может быть от разных "родителей". Для этого создаем связь много-ко-многим. Реализуя либо связующей таблицей, либо хранением guid через разделитель. Но второй способ явно неконструктивный.
Тебе надо создать (лучше использовать уже созданные) алгоритм присваения уникального значения. И у тебя получится 4 таблицу В первой у тебя будет хранится структура дерева, где у кадой записи будет уникальный идентификатор, уровень вложенности. Во второй будет 2 поля guid каждой записи из первой таблицы и guid "родительской" записи из той же таблицы. Это нужно, что бы отследить несколько "родителей" каждой ветви дерева. В третей таблице будут хранится описания для каждой ветви И четвертая будет по структуре копия второй, только хранить она будет guid из первой и привязанный к нему guid из третий таблицы. Понятно? -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 5 Всего: 260 |
не "от разных", а от "нескольких". Причём - одновременно. Например, структура номера телефона может наследоваться от ветви "Я" и от ветви "Мой брат". Т.к. структура всё равно едина, то уникальный идентификатор листа "телефон" в пределах структуры будет неуникален. И, запомнив телефон, будет неясно, к какой подветви относятся данные. Потому - либо делать все листья уникальными(в общем случае - бессмысленно, т.к. одна и та же структура может входить в родительскую структуру в разных вариациях, и дублировать структуру - нерационально), либо же каким-то образом запоминать весь путь восстановления данных - т.е. фактически запоминать структуру. И опять же про телефон - у каждого из нас с братом может быть не один номер телефона. Это аргумент в пользу динамической структуры в противовес жестко заданной, но с уникальными идентификаторами. |
|||
|
||||
![]()
|
| Правила форума "Общие вопросы по базам данных" | |
|
|
Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:
Данный форум не предназначен для:
Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение.
Полезные советы: Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | СУБД, общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |