Sto prendendo in considerazione l'utilizzo di Ltree module di PostgreSQL nella mia applicazione per aiutare con commenti a thread. L'ho messo da parte per un po 'di tempo per i commenti con thread. Immagino che sarebbe d'aiuto nei casi in cui è necessario aggiornare un nodo e i suoi figli, come quando si desidera nascondere un commento e le sue risposte.Il modulo Ltree di PostgreSQL è adatto per i commenti con thread?
Sto pensando a ltree (o qualcosa di simile) sarebbe utile se fosse abbinato ad una tradizionale lista di adiacenze ("comment_id"/"parent_comment_id").
Prima di prendere il tuffo in uso ltree, mi chiedo alcune cose:
- sei, o ha, ltree utilizzati? È quello che si potrebbe chiamare "produzione pronta"?
- Se sì, quali problemi l'hai usato per risolvere? Ha fatto un buon lavoro?
- Pensi che sia adatto per un sistema di commento con thread ?
- Se lo hai usato, cosa hai usato per la parte "testo" del percorso? Hai impostato qualcosa come l'esempio DMOZ che usano "Top.Astronomy.Cosmology" o basandolo su qualcosa come la chiave primaria "1.403.29.5"?
- C'è un modo migliore per farlo? Sono un po 'nervoso usando un approccio di elenco annidato - tutto quello che ho letto suggerisce che non è tutto molto caldo con gli AGGIORNAMENTI o INSERTI (non devi riordinare il tutto?). Inoltre, non sono un CS senior e quel tipo di struttura dei dati è qualcosa che potrei dimenticare in futuro. Qualcuno usa liste annidate per commenti o qualcosa del genere?
Se si tratta di alcun aiuto, qui è lo schema Sto pensando:
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 colonna "percorso", usato da ltree, sarebbe simile:
<thread_id>.<parent_comment_id_#1>.<parent_comment_id_#2>.<my_comment_id>
C'è qualcosa di sbagliato nell'usare le chiavi primarie nel percorso? Dovrei includere la chiave primaria del nodo nel percorso? Se lo facessi, avrebbe senso inserire un indice univoco su di esso per fungere da vincolo?
ltree è un'implementazione di "percorso materializzato". vedere http://www.dbazine.com/oracle/or-articles/tropashko4 per un confronto delle possibili soluzioni, compresi i metodi più portatili (ma meno efficienti) come i set annidati. – vladr
sentiti libero di aggiungere questo come risposta. Sono aperto ad altre idee. Ho esaminato i set annidati, ma sembrano un rompicapo da implementare e piuttosto lenti sugli aggiornamenti/inserimenti (non devi spostare tutto in basso?). –
oh, e stavo pensando di usare ltree in aggiunta alla lista di adiacenza. quindi "comment_id" e "parent_comment_id". quello che avevo in mente era di usare ltree per velocizzare le operazioni su un ramo –