我使用GAE和Java(JPA)从我的数据库中检索记录。
此刻我有超过2000条记录(并且还在增长),我必须显示60条完全随机的记录。 目前我已按以下方式实施
我在这个实现中面临的问题是,因为每个请求都下载了整个数据库集,所以它在“数据存储小型操作”中增加了很多。 (免费)qouta,如果这个代码将来要扩展,那么感觉效率低下。
如何在不下载所有密钥的情况下获取随机60条记录?
答案 0 :(得分:3)
您可以记忆所有2000个密钥,这样您就不必在每个请求中查询它们。
您可以以每个用户获得独特的随机结果的方式记录60条随机记录,这些结果已经显示给以前的用户(可能不适用于您的情况)。
但这些都不是可扩展的。
答案 1 :(得分:2)
取决于。三种解决方案,其中没有一种可能是理想的:
ORDER BY RAND()
并获得前60个结果,但这不可移植,因为RAND或RANDOM不属于JPA规范。EntityManager.setFirstResult (random).setMaxResults (1)
滚动到随机行并重复60次。答案 2 :(得分:1)
有一个特殊的属性应用于名为__scatter__
的实体,地图缩减框架用于样本实体。
It is mentioned in the javadoc here
我实际上无法找到有关其工作原理/何时应用的信息,但是在数据存储区查看器中运行查询似乎会产生结果。然而,并非所有实体都具有此属性。
您可以尝试执行以下操作,看看它是如何实现的:
SELECT * FROM Kind order by __scatter__
答案 3 :(得分:1)
首次部署代码时,请获取当前unix时间戳的常量。然后对每条记录保存另一列,这是当前的unix时间戳。现在每次查询随机记录时,都会在常量时间戳和当前时间戳之间生成随机unix时间戳,并获取按生成的随机数排序的记录。
答案 4 :(得分:0)
我认为有两个选项,首先你可以缓存密钥,而且第一次只需要时间。
其次,您可以在查询中使用随机来获取任何随机记录