0

m:n という用語が正しくない場合は申し訳ありません。より適切な用語を知っていれば、訂正します。次の状況があります。これは私の元のデータです。

gameID
participID
result

データ自体はそのように見えます

1     5      10
1     4     -10
2     5     150
2     2    -100
2     1     -50

このテーブルを抽出すると、約 100mio の行と約 1mio の participID 以上が簡単に作成されます。

私は必要になります:

show me all results of all games from participant x, where participant y was present

幸運なことに、参加者は非常に限られており、変更される可能性があるため、完全なテーブルが必要であり、2 番目のステップで減らすことができます。

私の考えは次のとおりです。非常に最適化されていないように見えます

1) 「視点参加者」が含まれるゲームのリストを取得する"

insert into consolidatedtable (gameid, participid, result)
    select gameID,participID,sum(result) from mastertable where participID=x and result<>0

2) 他の参加者が含まれるすべてのゲームを取得する

insert into consolidatedtable (gameid, participid, result)
where gameID in (select gameID from consolidatedtable)
AND participID=y and result<>0

3) count<2 のすべてのゲームを統合テーブルから削除する

delete from consolidatedDB where gameID in (select gameid from consolidatedtable where count(distinct(participID)<2 group by gameid)

全体が私には子供の解決策のように見えます

  1. プレーヤーごとに統合されたテーブルが必要です
  2. このテーブルに多くのゲームへの道を挿入し、後でそれらを削除します
  3. 全体をマスターテーブル全体で参加者ごとに実行する必要があります。これを複数の参加者に対して同時に実行すると機能しません

より良いアイデアがあるに違いありません、これはとても悪いです。マスター テーブルは DW サーバー上の postgreSQL になり、統合ビューは mySQL になります (ただし、数値計算は postgreSQL で行われます)


私の問題

1)マスターテーブル全体で各プレーヤーに対して単一のクエリを実行する必要なく、統合テーブルを作成する方法(s - 複数必要ですか)(プレーヤーx、y、zなどのデータが必要です)他に誰がプレイしているか) - これは DW サーバーの統合タスクであり、Web サーバーのテーブルを作成する必要があります (要約されています)。

2) Web サーバーで高速に抽出するにはどうすればよいか (したがって、(1) のテーブル設計ではこれを考慮に入れる必要があります。ここでは多くのプレイヤーについて話しているわけではありません。この情報が必要です。おそらく 100 ですか?)プレイヤー ID で分割するか、単一のテーブルを作成するかのいずれか)


  • データウェアハウス: postgreSQL 9.2 (48GB、SSD)
  • ウェブサーバー: mySQL 5.5 (4GB RAM、SSD)

    • マスター テーブル: gameid BIGINT、participID、Result INT、particiP ID の外部キー (参加者テーブルへ)
  • DWサーバーはマスターテーブルを保持し、DWサーバーは統合/抽出されたテーブルも準備する必要があります(処理能力、SSDスペースは問題ではありません)
  • Web サーバーは統合されたテーブル (情報が必要な 100 人のプレーヤーのみ) を保持し、このデータを非常に効率的な方法でクエリする必要があります。

Webサーバーでの非常に効率的なクエリ>> DWサーバーのワークロード)


これは重要だと思います。最初にそれを含めなかったことをお詫びします。

DW サーバーのデータは毎日更新されますが、「マスター テーブル」全体を毎日完全にクエリする必要はありません。このセットアップでは、never 値のみを統合できます。例: 昨日の統合は ID 500 までで、現在の ID=550 だったので、今日は 501 から 550 のみを統合します。

4

2 に答える 2