Как ни стараешься избежать хранения деревьев в sql, рано или поздно приходится.
СУБД - postgresql.
Исходная задача: система комметариев как на хабре - собственно сами комментарии, возможность отвечать на них, оценка самого объекта (в случае хабра например - статья) и комментариев.
Готовые решения не подошли.
Из ширико известных выбрать пока не могу. Возможно, если кто сталкивался с подобными задачами, расскажите, какой из методов выбрали и почему.
Попутно возникла своя идея.
Таблица простейшая: id, name, parent. Но обход нерекурсвный - при помощи стэка. Его реализовать при помощи временной таблицы. Саму иерархию каметов - в другую временную.
На чём встал: не хватает переменных (в понятиях, схожих со структурными языками программирования) и цикла типа while. Вернее есть, но в pl.
Сам стэк будет примерно так (на примере потомков корня):
Добавление:
SELECT id INTO TEMPORARY TABLE a FROM cm WHERE parent=X;
Удаление:
SELECT min(id) AS n INTO TEMPORARY TABLE b FROM a;
DELETE FROM a WHERE id=(SELECT n FROM b);
a - хранит детей
b.n - текущий элемент
Ну и далее что-то вроде
FOR cc IN SELECT * FROM cm
LOOP
Вставляем в c (конечная таблица)
Удаляем из a
Если есть дети - добавить в a как указано выше
END;
Вернуть c.
Как Вам такой вариант? Реализуем ли? Намного ли "дешевле" будет "традиционных" методов? Есть ли возможность релизовать без pl?
Примечание:
Trubor, проще, чем что???
Вопрос не об удалении, а о выборке.
Примечание:
Никита, ну уж если на пхп, то явно это надо делать при помощи стэка - там вообще проблем нет.
Несколько запросов на пхп нежелательно по той причине, что сервер БД - отдельных сервак, хоть и локальный, но всё равно время.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.