Я рассматриваю возможность использования модуля Ltree в PostgreSQL в моем приложении, чтобы помочь с многопоточными комментариями. Я уже давно смотрю на это, чтобы использовать его для комментариев. Я полагаю, что это поможет в случаях, когда вам нужно обновить узел и его дочерние элементы, например, когда вы хотите скрыть комментарий и его ответы.
Я думаю, что дерево (или что-то подобное) было бы полезно, если бы оно было связано с традиционным списком смежности ("comment_id" / "parent_comment_id").
Прежде чем окунуться в использование ltree, мне интересно несколько вещей:
- Вы использовали или использовали дерево? Это то, что можно назвать «готовым к производству»?
- Если да, то какие проблемы вы использовали для его решения? Это хорошо сработало?
- Как вы думаете, это хорошо подходит для
многопоточная система комментариев?
- Если вы использовали его, что вы использовали для «текстовой» части пути? Вы настроили что-то вроде примера DMOZ, в котором они используют «Top.Astronomy.Cosmology» или основали его на чем-то вроде первичного ключа «1.403.29.5»?
- Есть ли лучший способ сделать это? Я немного нервничаю, используя подход с вложенными списками - все, что я прочитал, говорит о том, что не все так просто с UPDATES или INSERTS (вам не нужно переупорядочивать все это?). Я также не майор CS, и такую структуру данных я могу забыть в будущем. Кто-нибудь использует вложенные списки для комментариев или что-то в этом роде?
Если это поможет, вот схема, которую я рассматриваю:
CREATE TABLE comments (
comment_id SERIAL PRIMARY KEY,
parent_comment_id int REFERENCES comments(comment_id) ON UPDATE CASCADE ON DELETE CASCADE,
thread_id int NOT NULL REFERENCES threads(thread_id) ON UPDATE CASCADE ON DELETE CASCADE,
path ltree NOT NULL,
comment_body text NOT NULL,
hide boolean not null default false
);
Столбец "path", используемый ltree, будет выглядеть примерно так:
<thread_id>.<parent_comment_id_#1>.<parent_comment_id_#2>.<my_comment_id>
Что-то не так с использованием первичных ключей в пути? Должен ли я включить собственный первичный ключ узла в путь? Если бы я это сделал, имеет ли смысл ставить на него уникальный индекс, чтобы он служил ограничением?