首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >稳定/可重复的随机排序(MySQL、Rails)

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

Stack Overflow用户
提问于 2010-03-09 05:54:37
回答 3查看 1.7K关注 0票数 6

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

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

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

最初,我认为可以根据会话ID和页面ID创建一个函数(返回该页面的对象ID ),然而,由于MySQL中的对象ID值不是连续的(有间隙),当我查看它时,它似乎就崩溃了。优点是它不需要/最少的存储空间,但缺点是它的实现可能相当复杂,可能会占用大量的CPU。

我的感觉是我应该创建一个交叉表,类似于:

代码语言:javascript
复制
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 position LIMIT...像往常一样。

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

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

这看起来应该是一个可以解决的问题,但是我找不到任何能做到这一点的rails插件。有什么想法吗?谢谢!!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-09 06:47:33

MySQL有一个可以在您的ORDER子句中使用的RAND函数,它传递一个绑定到用户会话的种子。

按RAND排序(?)

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

票数 6
EN

Stack Overflow用户

发布于 2010-03-09 06:06:22

我可能漏掉了一些东西,但像这样的东西

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

努力为你提供一个随机排序的,可重复的每个会话的分页列表?在索引使用上不是很好,但您可以避免任何预填充/ tmp表/无效。

票数 2
EN

Stack Overflow用户

发布于 2010-03-09 06:10:55

就我个人而言,为了节省存储空间和理智,我只使用一个使用user_id的随机种子。

代码语言:javascript
复制
srand user_id
items.sort_by{ rand }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2405077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档