Стабильный/повторяемый случайный вид (MySQL, направляющие)

Я хотел бы нумеровать страницы через случайным образом отсортированный список моделей ActiveRecord (строки от базы данных MySQL).

Однако эта рандомизация должна сохраниться на основе на сессию, так, чтобы другие люди, которые посещают веб-сайт также, получили случайное, нумеровали страницы - способный список записей.

Скажем, существует достаточно объектов (десятки тысяч), что хранение случайным образом отсортированных Значений идентификаторов или на сессии или на cookie является слишком большим, таким образом, я должен временно сохранить его некоторым другим способом (MySQL, файл, и т.д.).

Первоначально я думал, что мог создать функцию на основе идентификатора сессии и страницы ID (возвращающий идентификаторы объектов для той страницы) однако, так как значения идентификатора объекта в MySQL не последовательны (существуют разрывы), который, казалось, развалился, поскольку я вводил по абсолютному адресу в нем. Хорошая вещь состоит в том, что это потребовало бы нет/минимальный устройства хранения данных, но оборотные стороны - то, что это, вероятно, довольно сложно для реализации и вероятно интенсивный ЦП.

Мое чувство, я должен составить перекрестную таблицу, что-то как:

random_sorts( sort_id, created_at, user_id NULL if guest)

random_sort_items( sort_id, item_id, position )

И затем просто сохраните 'sort_id' на сессии. Затем я могу нумеровать страницы random_sorts ГДЕ sort_id = n ПРЕДЕЛ положения ORDER BY..., как обычно.

Конечно, я должен был бы поместить своего рода жнец там для удаления их после некоторого периода неактивности (на основе random_sorts.created_at).

К сожалению, я должен был бы делать недействительным вид, поскольку новые объекты были созданы (и/или старые удаляемые объекты, хотя удаление очень редко). И, поскольку загрузка увеличивает размер/производительность этой таблицы (даже правильно индексированный) отбрасывания.

Кажется, что это должно быть решенной проблемой, но я не могу найти плагины направляющих, которые делают это... Какие-либо идеи?Спасибо!!

6
задан Matt Rogish 8 March 2010 в 21:54
поделиться

3 ответа

В MySQL есть функция RAND, которую можно использовать в предложении ORDER, передавая семя, привязанное к сессии пользователя.

ORDER BY RAND(?)

Где ? - начальное значение из сессии. Это даст вам повторяющееся упорядочивание по всем запросам.

6
ответ дан 16 December 2019 в 21:38
поделиться

Я, наверное, чего-то упускаю, но не стал бы что-то вроде этого

select ... {{1} } order by sha1 (concat ($ session_id, item_id)) limit m, n;

работать, чтобы дать вам случайный, повторяемый список с разбивкой на страницы для каждого сеанса? Не очень хорошо использовать индекс, но вы избегаете каких-либо предварительных заполнений / tmp-таблиц / недействительности.

2
ответ дан 16 December 2019 в 21:38
поделиться

Лично для экономии места для хранения и рассудка я бы просто использовал случайное начальное число с вашим user_id.

srand user_id
items.sort_by{ rand }
0
ответ дан 16 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: