Estoy considerando utilizar Ltree module de PostgreSQL en mi aplicación para ayudar con los comentarios enhebrados. Lo he estado buscando por un tiempo para usarlo para comentarios enhebrados. Me imagino que ayudaría con los casos en los que necesita actualizar un nodo y sus hijos, como cuando quiere ocultar un comentario y sus respuestas.¿El módulo Ltree de PostgreSQL es adecuado para los comentarios de subprocesos?
Creo que ltree (o algo así) sería útil si se combinara con una lista de adyacencia tradicional ("comment_id"/"parent_comment_id").
Antes de dar el paso en el uso de ltree, me pregunto algunas cosas:
- está usted, o ha, ltree utilizados? ¿Es lo que uno podría llamar "producción lista"?
- Si es así, ¿qué problemas usó para resolverlo? Hizo un buen trabajo?
- ¿Cree que es una buena opción para un sistema de comentarios roscados ?
- Si lo usaste, ¿qué usaste para la parte de "texto" de la ruta? ¿Configuraron algo así como el ejemplo de DMOZ que usan "Top.Astronomy.osmology" o lo basan en algo así como la clave principal "1.403.29.5"?
- ¿Hay una manera mejor de hacer esto? Estoy un poco nervioso usando un enfoque de lista anidada: todo lo que he leído sugiere que no todo está demasiado caliente con ACTUALIZACIONES o INSERTOS (¿no tienes que volver a ordenar todo?). Tampoco soy especialista en CS y ese tipo de estructura de datos es algo que podría olvidar en el futuro. ¿Alguien está usando listas anidadas para comentarios o algo así?
Si se trata de alguna ayuda, aquí es el esquema que estoy considerando:
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
);
La columna "camino", utilizado por ltree, sería algo como:
<thread_id>.<parent_comment_id_#1>.<parent_comment_id_#2>.<my_comment_id>
¿Hay algún problema con el uso de las teclas principales en la ruta? ¿Debería incluir la clave principal propia del nodo en la ruta? Si lo hiciera, ¿tendría sentido poner un índice único en él para que sirva como una restricción?
ltree es una implementación de 'ruta materializada'. vea http://www.dbazine.com/oracle/or-articles/tropashko4 para una comparación de soluciones posibles, incluyendo métodos más portátiles (pero menos eficientes) como conjuntos anidados. – vladr
no dude en agregar esto como una respuesta. estoy abierto a otras ideas He analizado conjuntos anidados, pero parecen ser un fastidio para implementar y más lentos en las actualizaciones/inserciones (¿no tienes que cambiar todo?). –
oh, y estaba pensando en usar lree además de la lista de adyacencia. de ahí "comment_id" y "parent_comment_id". lo que tenía en mente era usar ltree para acelerar operaciones en una rama –