过滤数据的最佳做法

Sam*_*off 3 d3.js

我看到它的方式,在使用过滤器构建动态图表时,每次用户请求过滤后的数据我都可以

  1. 执行一个新的MySQL查询,并使用MySQL进行过滤.

    SELECT date,
      SUM(IF( `column` = `condition`, 1, 0)) as count
      ...
    
    Run Code Online (Sandbox Code Playgroud)
  2. 执行一个新的MySQL查询,并使用服务器端语言(在我的情况下为PHP)进行过滤.

    function getData(condition)  {
      $resultSet = mysqli_query($link, "SELECT date, column ... ");
    
      $count = 0;
      while ($row = mysqli_fetch_assoc($result_set)) {
          if ($row['column'] == 'condition') {
              $count++;
          }
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最初执行单个MySQL查询,将所有数据传递给客户端,并使用Javascript&d3进行过滤.

我希望答案不是黑白的.例如,如果几乎没有请求某个过滤器,则让其他95%的用户等待相关数据可能没有意义,因此过滤器将需要新的数据调用.但我真的在考虑边缘情况 - 过滤器经常使用的情况,但是特殊情况.在这种情况下,将过滤逻辑放在前端,后端或数据库查询中是否更好?

pol*_*m23 5

通常,如果可以在前端完成过滤,则应该在那里完成.优点是:

  • 服务器出现故障无关紧要
  • 节省带宽成本
  • 保存等待往返时间的用户

缺点是它可能比后端更慢,更复杂.但是,依赖于数据量,有很多情况(比如你的例子)Javascript足够好.d3甚至还有内置的过滤功能:

//remove anything that isn't cake
d3.selectAll('whatever')
  .filter(function(d){return d.type != 'cake'})
  .remove()    
Run Code Online (Sandbox Code Playgroud)

如果您需要更复杂的过滤,如基本的聚集,可以使用Crossfilter(也由麦克·博斯托克)或优秀D3 + crossfilter包装dc.js.