Как лучше всего выполнить вложенный 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 }
})
})
мои вопросы:
- Есть лучший способ сделать это?
- производительность вышеупомянутого запроса все еще так же хороша, как обычно eqJoin на 2 таблицах?
- Производительность использования слияния намного хуже, чем использование eqJoin (concatMap) в этих случаях?
большое спасибо.
1 ответ
Это выглядит как лучший способ сделать это для меня. Если бы вы хотели, вы могли бы переместить второй
concatMap
в первый.concatMap
(так что вы цепляете это на конецgetAll
). Это может быть быстрее, вам придется сравнить его, чтобы выяснить это, но скорость должна быть примерно такой же.Да, так и должно быть.
Я не думаю, что вы можете сделать эту задачу слиянием. Каждый раз, когда вы хотите превратить одну входную строку в несколько выходных строк, вам нужно использовать
concatMap
или объединение. Если вместо одного выходного документа на пару пользователь / компания / отдел требуется один выходной документ на пользователя с массивами компаний и отделов в них, тоmerge
может быть использован для этого и должен быть примерно такой же скорости (или, если угодно, чуть-чуть быстрее).