anonymous@RULINUX.NET~# Last login: 2024-11-24 10:13:17
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

[мускуль] Какой номер листочка, если сказано его имя и на какой он ветке

Задание следующее. Допустим, у нас есть форум по адресу http://forum.lh . Но он имеет чуть необычную структуру. В нем может быть неограниченное количество форумов с неограниченной вложенностью. Структуру таблицы Forums представим следующей: [ID, Title, ParentID] Для облегчения задания предположим, что Title у нас может иметь только латинские буквы(минимум одна) и цифры и быть не больше 64 символов. ParentID - это айди форума-родителя, или NULL Структура таблицы Topics: [ID, Title, ForumID] Теперь суть задачи на примере:

forum.lh/first/second/third/HelloWorld.html Такой адрес должен открывать тему "HelloWorld" в форуме с названием "third", который лежит в форуме с названием "second", который лежит в форуме с названием "first".

Вопрос: как узнать ID темы, которую нам надо отобразить, если: Тем с таким названием может быть несколько, но только в разных форумах! Например: forum.lh/first/second/third/HelloWorld.html forum.lh/first/fourth/fifth/HelloWorld.html forum.lh/first/second/HelloWorld.html forum.lh/first/HelloWorld.html В данном случае это все реальные и, при этом РАЗНЫЕ темы. Более того, могут дублироватся названия форумов, но не в одном форуме. То есть forum.lh/second/second/ forum.lh/second/first/ forum.lh/first/second/ forum.lh/first/first/second/first/ Это все вполне валидные пути РАЗНЫХ форумов. Далее. Допустим, вложенность может быть очень большой. Например, 64 форума.

Повторяю вопрос и раскрываю чуть проблемы:

* Как узнать ID темы, которую нам надо отобразить.

Ситуация: 1. У нас есть только её название, которое НЕ УНИКАЛЬНО и полный путь к ней. 2. О каждом участке пути мы только знаем его неуникальное название и полный путь к нему 3. В пути может быть до 64 делений. 4. У нас есть высоконагруженная система, в которой количество запросов должно быть сведено к минимуму. Желательно, общее количество запросов(включая не только анализ пути) - не больше 15.

Решения, о которых я знаю: 1. Решение "вЛоб" Получаем айди первой секции простым запросом к базе: ${FirstID} = SELECT `ID` FROM `Forums` WHERE `Title` = `${Title}` AND `ParentID` IS NULL Получаем айди второй секции простым запросом к базе: ${SecondID} = SELECT `ID` FROM `Forums` WHERE `Title` = `${Title}` AND `ParentID` = '${FirstID}' И так пока не дойдем до последней секции, то есть темы. Решение не подходит. Причина: до 65 запросов только на получение темы.

2. Materialized Path У нас в базе хранятся полные пути к каждому форуму. Допустим, для этого у нас есть отдельная таблица "ForumsPathes" со структурой [ForumID, FullPath]. Пример содержимого: 1 | first 2 | first/second 3 | second 4 | third 5 | first/second/third Решение нежелательно. Причины: 1. Поле "FullPath" должно быть индексным varchar длинной (64*64+63) = 4159 символов. По этому полю будет регулярный поиск. Увеличение разрешенной длины названия темы/разрешенной глубины пропорционально увеличит длину поля. Решение, в общем то, ничего такое, но... "#1071 - Specified key was too long; max key length is 1000 bytes". То есть максимально-разрешенная длина в данном случае всего 1000 символов - недостаточно.

Более того, решение не должно быть слишком тяжелым для понимания (желательно, левому человеку посмотреть на код и сразу понять, как оно должно работать) и не перегружено Join'ами (скажем, максимум - 4-8 на запрос).

Пока очень застопорился на этом. Если кто сможет помочь описанием алгоритма решения этой задачи - буду рад. :)

anonymous(*) (2009-05-30 00:06:56)

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4

[Ответить на это сообщение]
avatar
Скрыть

Re:[мускуль] Какой номер листочка, если сказано его имя и на какой он ветке

1. SQL заебал ещё в университете.

2. То что ты просишь делают за деньги.

anonymous(*)(2009-05-30 00:25:40)

Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10
avatar
Скрыть

Re:[мускуль] Какой номер листочка, если сказано его имя и на какой он ветке

попробуй спросить здесь http://freelance.ru/

bugmaker(*)(2009-05-30 00:42:54)

Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4
avatar
Скрыть

Re:[мускуль] Какой номер листочка, если сказано его имя и на какой он ветке

>То что ты просишь делают за деньги.

/me прозреваент безработного студент-куна, ищущего где-бы подзаработать хотя бы на ролтон.

anonymous(*)(2009-05-30 01:07:52)

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4
avatar
Скрыть

Re:[мускуль] Какой номер листочка, если сказано его имя и на какой он ветке

>попробуй спросить здесь http://freelance.ru/

если бы не одно но: нужна не реализация, а идея. чувствуем разницу?

впрочем уже подсказали юзать хэши, что впринципе вполне неплохое решение.

anonymous(*)(2009-05-30 01:17:54)

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4
avatar
Скрыть

Re:[мускуль] Какой номер листочка, если сказано его имя и на какой он ветке

> если бы не одно но: нужна не реализация, а идея. чувствуем разницу?

если бы не одно но: нужна не оригинальная идея, а тыщу раз обсосатая тривиальщина http://www.google.ru/search?&hl=ru&q=хранение+деревьев+в+базе+данных

bugmaker(*)(2009-05-30 02:45:45)

Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4
avatar
Скрыть

Re:[мускуль] Какой номер листочка, если сказано его имя и на какой он ветке

> нужна не оригинальная идея, а тыщу раз обсосатая тривиальщина Ты - ошибаешься. Почему - лень сейчас объяснять. Если хочешь - перечитай ещё раз первое сообщение, но вникни, а не по диагонали. Нестет сетс не подходит потому что эта таблица будет очень часто менятся. Почему не подходят два остальных способа - написано в первом сообщении.

anonymous(*)(2009-05-30 07:01:03)

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121621 Debian Lenny Firefox/3.0.5 FirePHP/0.3
avatar
Скрыть

Re:[мускуль] Какой номер листочка, если сказано его имя и на какой он ветке

Чтото разрыв строки не поставился. Но, в общем, понятно все

anonymous(*)(2009-05-30 07:02:07)

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121621 Debian Lenny Firefox/3.0.5 FirePHP/0.3
avatar
Скрыть

Re:[мускуль] Какой номер листочка, если сказано его имя и на какой он ветке

> перечитай ещё раз первое сообщение, но вникни, а не по диагонали

перечитал ещё раз. Суть сводится к тому, что в реляционной бд нужно хранить (обширное) дерево. Решается стандартными методами, коих немногим больше чем nested sets+ещё два. Стандартными - потому что задача весьма распространена и лучшие методы давно выработаны. Крайне сомнительно, что тут заведётся девелопер сравнимого с авторами готовых методов уровня, который предложит что-то оригинальное.

> лень сейчас объяснять

> лень

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

2. materialized paths годится. Надо только разбивать строки путей на куски, не превышающие 1к символов и отразить факты разбивки в специальном поле таблицы.

3. nested sets годится. Тут приходится итти на компромисс скорости выборки со скоростью добавления. Если речь идёт о форуме, количество добавлений узлов будет на 2-3 порядка уступать количеству чтений, так что в целом по производительности несомненно будет выйгрыш. Вопрос только в его величине по сравнению с другими методами, а это вопрос скользкий.

вот щё пара методов, на первой же странице пойска в гуголе http://www.arbinada.com/main/node/25

bugmaker(*)(2009-05-30 08:26:59)

Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4
avatar
Скрыть

Re:[мускуль] Какой номер листочка, если сказано его имя и на какой он ветке

У меня хранение в базе не в стиле "Список смежности", как было указано в первом сообщении. Я указал этот способ, чтобы не слишком перегружать первый пост - он и так перегружен. Тот способ, который я использую называется, наверное, "Подмножества". Когда в отдельной таблице хранится ID и отдалённость всех родителей элемента. Задача не в хранении и показе дерева. Как раз показать дерево то и не тяжело. Тяжело определить, какой элемент используется сейчас, потому что для этого надо по-очереди обойти всех родителей. Но, я уже определился с решением. Хотя все-равно спасибо :)

anonymous(*)(2009-05-30 13:22:56)

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121621 Debian Lenny Firefox/3.0.5 FirePHP/0.3
avatar
Скрыть

Re:[мускуль] Какой номер листочка, если сказано его имя и на какой он ветке

А если для каждого узла создать свою колонку? NULL-ов будет много, но почему бы и нет раз так хочется отобразить иерархическую в реляционную структуру.

anonymous(*)(2009-05-30 15:38:41)

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.4) Gecko/20070601 SeaMonkey/1.1.2
avatar
Скрыть

Re:[мускуль] Какой номер листочка, если сказано его имя и на какой он ветке

А если я захочу увеличить макс глубину, скажем, до 1024 топиков?

anonymous(*)(2009-05-30 17:53:22)

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121621 Debian Lenny Firefox/3.0.5 FirePHP/0.3
avatar
Скрыть

Re:[мускуль] Какой номер листочка, если сказано его имя и на какой он ветке

s/топиков/форумов/

anonymous(*)(2009-05-30 17:53:55)

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121621 Debian Lenny Firefox/3.0.5 FirePHP/0.3
avatar
Скрыть

Fugcoosaura

The screenwriters were not politically motivated in any way. <a href=http://honerensfs.com>eem</a>

anonymous(*)(2009-07-29 04:11:32)

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FREE; .NET CLR 1.1.4322)
Этот тред читают 3 пользователя:
Анонимных: 3
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!