3

私の見方では、フィルターを使用して動的チャートを作成する場合、ユーザーがフィルター処理されたデータを要求するたびに、

  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. 最初に 1 つの MySQL クエリを実行し、すべてのデータをクライアントに渡し、Javascript と d3 を使用してフィルタリングを行います。

答えは白黒ではないと思います。たとえば、一部のフィルターがほとんど要求されない場合、残りの 95% のユーザーに関連データを待機させるのは意味がない可能性があるため、フィルターは新しいデータ呼び出しを必要とします。しかし、私は本当にエッジケースについて考えています-フィルターが定期的に使用されているが、特異な状況です。このような場合、フィルタリング ロジックをフロントエンド、バックエンド、またはデータベース クエリ内に配置した方がよいでしょうか?

4

1 に答える 1

5

一般に、フィルタリングがフロントエンドで実行できる場合は、そこで実行する必要があります。利点は次のとおりです。

  • サーバーがダウンしても問題ありません
  • 帯域幅のコストを節約
  • ラウンド トリップ時間を待つユーザーを節約します。

欠点は、バックエンドよりも遅く、複雑になる可能性があることです。ただし、データ量によっては、(例のように) 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を使用できます。

于 2013-02-20T02:38:40.997 に答える