mysql - 稳定/可重复的随机排序(MySQL、Rails)

标签 mysql ruby-on-rails sorting persistence random

我想对随机排序的 ActiveRecord 模型列表(来自 MySQL 数据库的行)进行分页。

但是,这种随机化需要在每个 session 的基础上持续存在,以便访问该网站的其他人也会收到一个随机的、可分页的记录列表。

假设有足够多的实体(数万个)将随机排序的 ID 值存储在 session 或 cookie 中太大,所以我必须暂时以其他方式(MySQL、文件等)持久保存它.

最初我认为我可以创建一个基于 session ID 和页面 ID 的函数(返回该页面的对象 ID),但是由于 MySQL 中的对象 ID 值不是连续的(存在间隙),这似乎落空了除了我在戳它。好处是它不需要/需要最少的存储空间,但缺点是它可能实现起来非常复杂,而且可能会占用大量 CPU。

我的感觉是我应该创建一个交集表,例如:

random_sorts( sort_id, created_at, user_id NULL if guest)

random_sort_items( sort_id, item_id, position )

然后只需将“sort_id”存储在 session 中。然后,我可以像往常一样对 random_sorts WHERE sort_id = n ORDER BY position LIMIT... 进行分页。

当然,在一段时间不活动后(基于 random_sorts.created_at),我必须在其中放置某种收割机来移除它们。

不幸的是,我必须在创建新对象(和/或删除旧对象,尽管删除非常罕见)时使排序无效。而且,随着负载的增加,该表(即使正确索引)的大小/性能也会下降。

这似乎应该是一个已解决的问题,但我找不到执行此操作的任何 Rails 插件...有什么想法吗?谢谢!!

最佳答案

MySQL 有一个 RAND 函数,您可以在 ORDER 子句中使用它,传递与用户 session 相关的种子。

按兰德顺序(?)

在哪里?是来自 session 的种子值。这将为您提供跨请求的可重复排序。

关于mysql - 稳定/可重复的随机排序(MySQL、Rails),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2405077/

相关文章:

ruby-on-rails - 计算 table 的大小并设置为 cucumber capybara

python - 从python中的特定索引值排序列表

c++ - C++使用 vector 实现Mergesort

php - 尝试在 php 中对 mysql 表中的数据表进行排序

mysql - 使用 "IN"不区分大小写的 SELECT

mysql - Laravel 根据种子数据迁移外键

php - 在 jquery 中处理分页的问题

mysql NOW() 返回错误值,而全局时区设置为 +00 :00

ruby-on-rails - 有时会出现 ActiveRecord::AssociationTypeMismatch 错误

javascript - 部分渲染后的 Rails javascript 调用