过滤数据的最佳做法

时间:2013-02-19 19:54:42

标签: d3.js

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

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

    SELECT date,
      SUM(IF( `column` = `condition`, 1, 0)) as count
      ...
    
  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++;
          }
      }
    }
    
  3. 最初执行单个MySQL查询,将所有数据传递给客户端,并使用Javascript& d3进行过滤。

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

1 个答案:

答案 0 :(得分:5)

通常,如果过滤可以在前端完成,那么<​​em>应该在那里完成。优点是:

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

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

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

如果您需要更复杂的过滤,例如基本聚合,您可以使用Crossfilter(也来自Mike Bostock)或优秀的d3 + crossfilter包装器dc.js