1

我正在建立一家商店,想随机化一个产品页面,但每天只更改一次。

我知道带有种子编号的随机发生器可以返回一致的结果,因此也许使用当天作为种子会起作用。

缓存也可以工作,或者将结果存储在表中。

什么是这样做的好方法?

4

3 回答 3

2

创建物化视图。这只是当前 PostgreSQL 中的另一个表,使用查询结果进行了更新。我可能会安装一个触发重新填充的 cron 作业。除此之外,您可以拥有任意数量的缓存。

即将推出的 Postgres 9.3 将有一个新功能。
更多关于Postgres wiki 中的物化视图

对于拉随机行的快速方法,您可能对这个相关问题感兴趣:
Best way to select random rows PostgreSQL

于 2013-06-07T15:59:54.563 回答
1

你肯定想缓存结果。随机排序很慢(尤其是在大型数据集中)。你可以有一个每天晚上运行的 cron 作业来清除旧缓存并选择新的随机产品。如果您可以将其关闭,则页面缓存是最好的,但片段缓存也可以正常工作。

于 2013-06-07T15:54:04.103 回答
0

我找到了一种不同的方法来实现这一点,这也可以让我使用 will_paginate gem 并在产品更新时获得新信息。

sort_order在表中添加了一个长整数。然后,每天一次,我将运行一个查询以使用随机数更新该字段。我将对该字段进行排序。

概念 Rails 代码:

# Pulling in the products in the specified random order
def show
  @category = Category.where(slug: params[:id].to_s).first
  if @category
    @random_products = @category.products.order(sort_order: :desc) # desc so new products are at the end
  end
end

# Elsewhere...
def update_product_order
  products = Product.order("RANDOM()").all
  order_index = 0
  products.each do |p|
    product.sort_order = order_index
    product.save! # this can be done much more efficiently, obviously
    order_index += 1
  end
end
于 2013-06-07T16:53:10.227 回答