存储在Firebase数据库中的数据的最佳做法

时间:2018-01-17 17:03:38

标签: javascript php firebase firebase-realtime-database

我正在开发一个与PHP后端连接的Ionic项目,但我开始在Firebase数据库中存储一些数据,以便加快我的应用程序交互。

我目前正在存储这样的帖子:

-/posts
   - /20  (User group ID)
     - /8  (User ID)
       - _postKey1
       - _postKey2
       - _postKey3

因此,当用户登录应用时,我会从后端获取群组和用户ID,因此我可以使用像/posts/20/8/这样的引用从Firebase数据库获取帖子。

到目前为止工作正常,但为了让其他用户角色能够看到这些帖子,我只将帖子密钥存储在订阅者集合中,例如:

- /subscribers
-   /88 (The subscriber id)
-     _postKey1
-     _postKey2
-     _postKey3 (subscriber has access to see these posts from /posts/ collection)

当我订阅者登录应用时,我必须获取此用户的帖子密钥,然后为每个人/posts/20/8/_postKey1/posts/20/8/_postKey2拨打电话,以便检索帖子对于此订阅者。

我很确定我正在构建意大利面条代码,所以我试图了解如何做得更好。

非常感谢!

代码示例

var ref = firebase.database().ref('/subscribers/88');

var postsRef = firebase.database().ref('posts/20/8');

// Get posts keys for this subscriber
ref.orderByChild('reverseDate').once("value", function(data) {
    // save post keys
    postKeys = data.val();

    // go trhough each post key
    Object.keys(postKeys).forEach(function(key) {

        // get the real post
        postsRef.child(postKeys[key].id).once("value", function(
            if(null !== data.val()) {
                // Append post to html list
            }
        });
    });
});

1 个答案:

答案 0 :(得分:0)

Firebase数据库无法查询子键的值(多个,在下面的示例中为key1,key2)。因此,尽可能保持集合平坦是一个好主意。 像这样的东西

csrfFilter(CsrfFilter, new HttpSessionCsrfTokenRepository()) {
        accessDeniedHandler = ref('fnAccessDeniedHandler')
        requireCsrfProtectionMatcher = ref('fnRequireCsrfProtectionMatcher')
    }

使用此架构,您可以运行deep path queries并使用postCreationTimestamp进行排序/限制

posts:{  
   key1:{  
      postdata:"",
      author:userId,
      subscribers:{  
         userId1:postCreationTimestamp (or just a true val if you handle sorting with postkey),
         userId2:postCreationTimestamp
      }
   },
   key2:{...}
}

我们在这里所做的就是在创建帖子时用户对他/她所有帖子的重复订阅者。 但它带有价格;如果您希望新订阅者可以看到用户现有帖子,那么您应该运行一个后台作业,该作业开始向所有发布作者的帖子添加新的订阅者ID