Как лучше всего выполнить вложенный concatMap для объединения нескольких таблиц?

На странице API concatMap на веб-сайте RethinkDB говорится, что eqJoin реализован с помощью concatMap + getAll, который должен обеспечивать лучшую производительность, чем другие объединения.

в моем случае я хотел бы объединить несколько таблиц, вот пример, давайте предположим, что у меня есть 3 таблицы, users, departments а также 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. производительность вышеупомянутого запроса все еще так же хороша, как обычно eqJoin на 2 таблицах?
  3. Производительность использования слияния намного хуже, чем использование eqJoin (concatMap) в этих случаях?

большое спасибо.

1 ответ

Решение
  1. Это выглядит как лучший способ сделать это для меня. Если бы вы хотели, вы могли бы переместить второй concatMap в первый .concatMap (так что вы цепляете это на конец getAll). Это может быть быстрее, вам придется сравнить его, чтобы выяснить это, но скорость должна быть примерно такой же.

  2. Да, так и должно быть.

  3. Я не думаю, что вы можете сделать эту задачу слиянием. Каждый раз, когда вы хотите превратить одну входную строку в несколько выходных строк, вам нужно использовать concatMap или объединение. Если вместо одного выходного документа на пару пользователь / компания / отдел требуется один выходной документ на пользователя с массивами компаний и отделов в них, то merge может быть использован для этого и должен быть примерно такой же скорости (или, если угодно, чуть-чуть быстрее).

Другие вопросы по тегам