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)
全体が私には子供の解決策のように見えます
- プレーヤーごとに統合されたテーブルが必要です
- このテーブルに多くのゲームへの道を挿入し、後でそれらを削除します
- 全体をマスターテーブル全体で参加者ごとに実行する必要があります。これを複数の参加者に対して同時に実行すると機能しません
より良いアイデアがあるに違いありません、これはとても悪いです。マスター テーブルは 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 のみを統合します。