anonymous@RULINUX.NET~# | Last login: 2024-11-23 12:56:07 |
Регистрация Вход | Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск |
Форум - Talks | [RSS] |
Задание следующее. Допустим, у нас есть форум по адресу 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
|
|
|
Скрыть
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 |
Скрыть
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 |
Скрыть
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 |
Скрыть
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 |
Скрыть
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 |
Скрыть
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 |
Скрыть
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 |
Скрыть
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 |
Скрыть
FugcoosauraThe 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) |
|
|
|
Этот тред читают 2 пользователя: |
Анонимных: 2 Зарегистрированных: 0 |
Re:[мускуль] Какой номер листочка, если сказано его имя и на какой он ветке
1. SQL заебал ещё в университете.
2. То что ты просишь делают за деньги.
Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.0.10) Gecko/2009042523 Ubuntu/9.04 (jaunty) Firefox/3.0.10