Quindi ho una tabella dei preferiti dell'utente. Ce ne sono alcuni milioni di file.Modo efficiente per memorizzare gli articoli riordinabili in un database
Attualmente, hanno solo tre colonne: id
(pk), userId
e someFkRef
. C'è un indice su userId
per permettermi di selezionare rapidamente i preferiti di un utente.
Attualmente questi sono ordinati per id
che è effettivamente solo l'ordine di inserimento. Vorremmo offrire all'utente la possibilità di riordinare i preferiti, molto probabilmente tramite una sorta di interazione drag and drop.
Il mio primo (e ho il sospetto ingenuo) approccio a questo sarebbe semplicemente aggiungere una colonna order
e un indice composito sopra userId
, order
. Tuttavia, dopo aver riflettuto, quando l'utente sposta la sua voce di una certa distanza sull'elenco, tutte le righe intermedie tra la posizione iniziale e la posizione finale dell'articolo avranno bisogno di ricalcolare la colonna order
e quindi anche l'indice.
Questo è (molto probabilmente) cattivo.
Prima di impiegare anni a cercare di quantificare esattamente quanto sia grave, mi chiedo se ci sia una rappresentazione basata su tabella migliore che è più economica da manipolare con i tipi di operazioni che descrivo sopra.
Non sono convinto che sia necessario indicizzare il nuovo campo. –
Generalmente, 'order by' ops richiede un indice, no? – spender
@spender Necessario no, ma se le righe della tabella sono grandi e si ottiene un set di risultati di grandi dimensioni, l'ordinamento utilizzando un indice potrebbe generare un numero di I/O un po 'inferiore. –