Mi piacerebbe impaginare attraverso un elenco ordinato a caso di modelli ActiveRecord (righe dal database MySQL).Ordinamento casuale stabile/ripetibile (MySQL, Rails)
Tuttavia, questa randomizzazione deve persistere su una base per sessione, in modo che altre persone che visitano il sito Web ricevano anche un elenco di record casuali e impaginabili.
Diciamo che ci sono abbastanza entità (decine di migliaia) che l'archiviazione dei valori ID ordinati in modo casuale nella sessione o in un cookie è troppo grande, quindi devo persistere temporaneamente in un altro modo (MySQL, file, ecc.).
Inizialmente pensavo di poter creare una funzione basata sull'ID di sessione e sull'ID di pagina (restituendo gli ID oggetto per quella pagina), tuttavia poiché i valori di ID oggetto in MySQL non sono sequenziali (ci sono spazi vuoti), che sembrava cadere a pezzi mentre lo stavo colpendo. La cosa bella è che non richiede uno storage minimo/minimo, ma gli svantaggi sono che è probabilmente piuttosto complesso da implementare e probabilmente richiede un uso intensivo della CPU.
La mia sensazione è che dovrei creare una tabella di intersezione, qualcosa di simile:
random_sorts(sort_id, created_at, user_id NULL if guest)
random_sort_items(sort_id, item_id, position)
E poi semplicemente memorizzare il 'sort_id' nella sessione. Quindi, posso impaginare random_sorts WHERE sort_id = n ORDER BY position LIMIT ... come al solito.
Ovviamente, dovrei mettere una specie di mietitore per rimuoverli dopo un certo periodo di inattività (basato su random_sorts.created_at).
Sfortunatamente, dovrei invalidare l'ordinamento quando sono stati creati nuovi oggetti (e/o vecchi oggetti rimossi, sebbene la cancellazione sia molto rara). E, come il carico aumenta le dimensioni/prestazioni di questa tabella (anche indicizzati correttamente) scende.
Sembra che questo dovrebbe essere un problema risolto ma non riesco a trovare alcun plugin per i binari che faccia questo ... Qualche idea? Grazie!!
Sì, funziona fintanto che le righe nella tabella non cambiano mai (se ne viene aggiunto uno nuovo, sono a conoscenza che l'intero set potrebbe cambiare). Inoltre, causa una scansione della tabella ogni volta, il che può essere un grande successo di prestazioni ... –
il tuo commento sembra valido (anche se a volte tu * vuoi * tutto da fare se la tabella sottostante aggiunge qualcosa di nuovo). Sfortunatamente non riesco a pensare ad un modo per evitare di scansionare l'intero tavolo ogni volta, anche se forse un 'ordine entro il limite 10' potrebbe essere abbastanza intelligente da uscire presto ...). Se non si esegue un "ordine per", tuttavia, aggiungere una nuova voce potrebbe ancora randomizzare l'output, AFAIK, quindi questa potrebbe essere una domanda difficile da ottenere nel modo giusto ... – rogerdpack
sembra ordine per rand quindi limitare " "Almeno una scansione completa della tabella (in mysql) anche se potrebbero esserci trucchi che potreste usare per evitarlo per velocizzarlo per tabelle di grandi dimensioni: http://stackoverflow.com/questions/211329/quick-selection-of-a- random-fila-da-un-grande-tavolo-in-mysql/211.388 – rogerdpack