2015-09-19 6 views
0

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

В моем случае я хотел бы присоединиться к нескольким таблицам, вот пример, допустим, у меня есть 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) в этих случаях?

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

ответ

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

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

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

+0

спасибо большое Майкл! // 1. Я перемещаю 'concatMap' вместе, потому что это будет короче (только одна« карта ») и более согласованная мне (vars внутри' map') // 2. отлично! // 3. Я понял, что вы имеете в виду, 'concatMap' возвращает именно то, что мне нужно для этого случая. собираюсь прочитать больше материалов о 'merge' vs' concatMap' в RethinkDB и подумать о том, что мне нужно сделать, прежде чем снова обратиться за помощью. // Большое спасибо за быстрый ответ! :) – oldlam