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

Qual è il modo più efficiente per archiviare un ordinamento su un gruppo di record in un database?

Che ne dici semplicemente di usare un integer colonna che definisce l'ordine? Per impostazione predefinita assegni i numeri * 1000, come 1000, 2000, 3000 .... e se sposti 3000 tra 1000 e 2000 lo cambi in 1500. Quindi nella maggior parte dei casi non è necessario aggiornare gli altri numeri. Uso questo approccio e funziona bene. Puoi anche usare double ma poi non hai il controllo sulla precisione e sugli errori di arrotondamento, quindi piuttosto non usarlo.

Quindi l'algoritmo sarebbe simile a :supponiamo di spostare B nella posizione dopo A. Per prima cosa esegui select per vedere l'ordine del record accanto ad A. Se è almeno +2 superiore all'ordine di A, devi semplicemente impostare l'ordine di B per adattarsi in mezzo. Ma se è solo +1 più alto (non c'è spazio dopo A), selezioni i record confinanti di B per vedere quanto spazio c'è su questo lato, dividi per 2 e quindi aggiungi questo valore all'ordine di tutti i record tra A e B. Questo è tutto!

(Nota che dovresti usare transazione/blocco per qualsiasi algoritmo che contiene più di una singola query, quindi questo vale anche per questo caso. Il modo più semplice è usare la transazione InnoDB.)