mysql - 不同自定义 View 的记录计数

标签 mysql algorithm data-structures memcached redis

我正在尝试解决获取 ListView 的不同自定义 View 的记录数的问题。自定义 View 是一个用户定义的 View ,其中将添加一些条件。

示例:

  All Records View(3): {criteria : none}
   Name |email       |age  
   John |john@foo.com| 23
   Ann  |ann@foo.com | 20
   Jack |jack@foo.com| 13


  Kids View(1): {criteria : age<15}
   Name |email       |age  
   Jack |jack@foo.com| 13

  Foo Kids View(1): {criteria : age<15 and email contains('foo.com')}
   Name |email       |age  
   Jack |jack@foo.com| 13

如上例所示,根据标准,必须为每个 View 计算 View 计数。每个 View 的计数甚至在用户选择特定 View 之前就已显示。有多个用户查看记录/添加/更新/删除记录。每次运行 mysql 查询以显示每个 View 的计数可能非常密集且耗时,因为可能有数百万行。我考虑过使用 memcached 或 redis 来存储 View 的初始记录计数和稍后在发生更改时更新它们。这里的问题是如何在运行时动态地找出哪些请求针对哪个 View 。

示例:如果从任何 View 中删除“Jacks”记录,则必须在所有 View 中减去计数,类似地,如果他的年龄更新为 20,则必须从 child 的 View 和 foo child 的 View 中减去计数。

欢迎就如何解决问题提出任何建议。

最佳答案

选项 1:缓存。缓存记录在某处计数(memcached、redis)并定期运行 cron 作业以刷新计数器。如果您不太在意计数器是否稍微不准确,请使用此方法。

选项 2:在您的代码中存储路由逻辑。您的语言可能会使它变得容易,也可能不会。这就是它在 Ruby 中的样子:

class ViewMatcher
  def initialize
    @views = {'all' => lambda{|params| true },

              'kids' => lambda{|params| params[:age] && params[:age] < 15 },

              'foo kids' => lambda{|params| params[:age] && 
                                            params[:age] < 15 && 
                                            params[:email] && 
                                            params[:email].include?('foo')}}
  end

  def print_matching_views(params)
    puts "Matching views for query: #{params.inspect}"
    result = []
    @views.each do |k, v|
      result << k if v.call(params)
    end
    puts result
    puts ""
  end
end


vm = ViewMatcher.new

vm.print_matching_views :age => 10
vm.print_matching_views :age => 20
vm.print_matching_views :age => 10, :email => 'foo@example.com'
vm.print_matching_views :age => 10, :email => 'moo@example.com'

输出:

Matching views for query: {:age=>10}
all
kids

Matching views for query: {:age=>20}
all

Matching views for query: {:age=>10, :email=>"foo@example.com"}
all
kids
foo kids

Matching views for query: {:age=>10, :email=>"moo@example.com"}
all
kids

关于mysql - 不同自定义 View 的记录计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8741751/

相关文章:

现场 PHP session 问题但不是本地问题

算法 - 寻找最大周长的三角形

python - 使用 python 将数据从 MySQL 迁移到 SAP HANA

java - Amazon.com 学生最终成绩

java - 如何提高Java中搜索特定Google Drive文件的效率?

python - 链表队列

algorithm - 子串算法建议

c++ - 为不同的文件扩展名调用不同的函数

php - 关于php和mysql

mysql - 如何在mysql中创建多对多关系