0

RethinkDB Web サイトの concatMap api ページでは、eqJoin が concatMap + getAll で実装されていると述べており、これは他の結合よりも優れたパフォーマンスを提供するはずです。

私の場合、複数のテーブルを結合したいと思います。ここに例を示します。3 つのテーブルがあると仮定usersdepartmentsますcompanies。すべてのuserドキュメントに と が含まれdepartment idますcompany id。例えば:

var user = {
  name: 'Peter',
  company: '12345',
  department: '8888',
  otherDetails: 'abc 123'
}

結合クエリの後に取得したい結果は、concatMap/eqJoin の結果と非常に似ていますが、3 つのテーブルすべてがあります。

[{
  user: {...},
  company: {...},
  department: {...}
}, ...]

結果を得ることができる私が書いたクエリは次のとおりです。

r.table('users')
  .concatMap(function(user) {
    return r.table("companies").getAll(
      user("company")
    ).map(function(company) {
      return { user: user, company: company }
    })
  })
  .concatMap(function(row) {
    return r.table("departments").getAll(
      row("user")("department")
    ).map(function(department) {
      return { user: row("user"), company: row("company"), department: department }
    })
  })

私の質問:

  1. これを行うより良い方法はありますか?
  2. 上記のクエリのパフォーマンスは、2 つのテーブルに対する通常の eqJoin と同じくらい良好ですか?
  3. これらの場合、merge を使用した場合のパフォーマンスは、eqJoin (concatMap) を使用した場合よりもはるかに悪いのでしょうか?

どうもありがとう。

4

1 に答える 1

0
  1. それが私には最善の方法のように思えます。concatMap必要に応じて、2 番目を 1番目に移動できます.concatMap(したがって、 の最後にチェーンしますgetAll)。それはより速いかもしれません。調べるためにベンチマークする必要がありますが、ほぼ同じ速度になるはずです。

  2. はい、そうすべきです。

  3. このタスクをマージで実行できるとは思いません。1 つの入力行を複数の出力行に変換する場合はいつでもconcatMap、または結合を使用する必要があります。ユーザー/会社/部門のペアごとに 1 つの出力ドキュメントの代わりに、会社と部門の配列を含むユーザーごとに 1 つの出力ドキュメントがmerge必要な場合は、そのために使用することができ、ほぼ同じ速度 (または少し速くなる場合) が必要です。 )。

于 2015-09-19T17:10:12.613 に答える