mysql select - come recuperare un risultato per i messaggi thread / nidificati?
-
10-07-2019 - |
Domanda
Sto creando una bacheca di thread e sto cercando di mantenerlo semplice. C'è una tabella di messaggi e quindi una tabella di risposte che ha un campo "reply_id" che può essere nullo per indicare una risposta di livello superiore o un valore che indica una risposta con thread.
Sono un po 'confuso su come effettuare una chiamata SELECT su questo tipo di tabella?
Reply
-id (every reply gets a unique id)
-message_id (the message it is replying to)
-reply_id (the id of the reply it may be replying to - for threading)
-reply
So che questo può essere un problema complesso, soprattutto per le prestazioni, ma sto davvero cercando la soluzione più semplice per questo.
grazie ...
Soluzione
Stai utilizzando l'ingenuo "libro di testo" modo di conservare gli alberi, ovvero memorizzare un riferimento al genitore immediato. Questo design si chiama Elenco di adiacenza . Esistono altre soluzioni:
- Enumerazione percorso , in cui si memorizza in ciascun nodo dell'albero una stringa che codifica tutti i suoi antenati diretti.
- Set nidificati , un approccio intelligente di Joe Celko in cui si utilizzano due valori numerici per nodo per associare tutti i suoi discendenti.
- Tabella di chiusura (o relazione di adiacenza), in cui si utilizza una tabella separata per elencare ogni coppia antenata-discendente.
Vedi la mia risposta a " Qual è il modo più efficiente / elegante per analizzare un tavolo piatto in un albero? " per riferimenti ed esempi del design della Tabella di chiusura.