LoginSignup
17

More than 5 years have passed since last update.

FirebaseでテーブルをJOINする

Posted at

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する方法でした。

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17