FirebaseでもRDBのようにテーブルをJOINしたい。そんなときは以下のように実装する。
const ref = new Firebase('https://examples.firebaseio.com/');
ref.child('posts/12345').once('value', (postSnap) => {
ref.child('users/' + postSnap.val().userId).once('value', (userSnap) => {
console.log(postSnap.val());
console.log(userSnap.val());
});
});
ref.child('posts/12345').once
でひとつの投稿をとってきて、その中でposts
にはいっているuserId
を使って、該当するuser
を取得している。
では、投稿すべてを取得する時はどうするか?それは以下のようになる。
const ref = new Firebase('https://examples.firebaseio.com/');
ref.child('posts').once('value', (postsSnap) => {
postsSnap.forEach((postSnap) => {
ref.child('users/' + postSnap.val().userId).once('value', (userSnap) => {
console.log(postSnap.val());
console.log(userSnap.val());
});
})
});
ref.child('posts').once
で全投稿を取得し、投稿毎に該当するuser
を取得している。
RDB的に考えると、いわゆるn+1問題が心配になるかもしれない(実際懸念していた)。しかし、Firebaseはwebsocketを使っていて、何万ものリクエストをしない限り、この方法は極めて妥当な実装になるように設計されていると公式でもいっている。実際には、何万データもあったとしても、一度に取得することはないので、特に心配することはなさそうである。
以上、FirebaseでテーブルをJOINする方法でした。