Mysql
 sql >> Database >  >> RDS >> Mysql

Come consentire a un utente di inserire ovunque in un elenco?

Il metodo più semplice dal punto di vista del codice consiste nell'utilizzare uno stile di elenco collegato, in cui si dispone di un ID elemento successivo, anziché di un valore dell'ordine. Questo è meno utile negli elenchi piccoli, ma quando inizi ad aumentare le dimensioni dell'elenco, rende gli aggiornamenti/spostamenti/rimozioni molto più puliti e impedisce l'eventuale aggiornamento di migliaia di tuple per apportare 1 modifica all'ordine.

++ Non ho un esempio di codice esatto a portata di mano, ma faresti una chiamata per tutte le liste di un utente

SELECT Posts.id, Posts.next, Posts.content, User.firstPost FROM db.posts AS Posts 
JOIN db.user as User ON Posts.ownerid = User.id 
WHERE User.id='123' AND Posts.active = 1;

Questo otterrebbe tutti i post di un singolo utente e quindi avresti un campo che contiene l'id del post successivo. Per iniziare avresti bisogno di una chiave per identificare il primo post (memorizza l'id del primo post nelle informazioni dell'utente). Dopo aver estratto il primo post, prendi il valore "successivo" e lo usi per identificare il post successivo.

Sembra un po' folle per un breve elenco, ma pensa a un utente con 1000 post. Se hanno bisogno di aggiungere 1 post in 2a posizione. In un sistema di ordinamento numerico tradizionale, ora dovresti aggiornare altre 999 righe con un aggiornamento +1. Con questa soluzione, se devi inserire un post nella seconda posizione, devi semplicemente interrogare il primo post per ottenere il suo valore successivo. Una volta ottenuto, lo modifichi in modo che sia il valore del nuovo secondo post e imposti il ​​valore successivo del secondo post in modo che sia quello originariamente detenuto dal primo.

[1st Post] --Next---> [2nd Post] --Next---> [3rd Post]

Dopo l'inserimento:

[1st Post] -.                          .--> [2nd Post] --Next---> [3rd Post]
            `--Next--> [New 2nd Post]--`