具有 Firebase 身份验证用户的 Firebase 数据库数据结构

Posted

技术标签:

【中文标题】具有 Firebase 身份验证用户的 Firebase 数据库数据结构【英文标题】:Firebase Database data structure with Firebase Authentication user 【发布时间】:2017-07-28 18:37:11 【问题描述】:

我的 Firebase 数据库中有(有点)大的笑话列表,如下图所示。

我将它们显示在我的 android 应用程序中的列表中,类似于提要。我还实现了使用 Firebase 身份验证登录的可能性,现在我想为登录用户添加选项以(不)喜欢笑话并将它们添加到收藏夹(收藏夹应该像私人书签一样)。我正在思考如何构建我的数据,我有两个建议:

    添加名为“userJokes”的新根节点,其子节点表示来自 Firebase 身份验证的用户 UID。每个 UID 子节点都应该具有来自“笑话”节点的每个笑话的副本,并带有表示(不)喜欢和最喜欢状态的附加布尔值。

    另一种解决方案是将每个用户 UID 添加到用户(不)喜欢或添加到收藏夹的笑话中。

第一个解决方案是合乎逻辑的,但是如果我以这种方式构造数据,我如何计算喜欢和不喜欢的数量?将每个笑话从“笑话”节点复制到“userJokes”节点以让每个用户显示在提要中的最佳方法是什么?第二个是不切实际的,因为在检索笑话时,我会得到每个用户(不)喜欢或添加到收藏夹的信息,这不是我需要的。哪种解决方案更好?还有其他的吗?可以将 Firebase 身份验证中的用户 UID 添加到 Firebase 数据库中的数据库吗?

【问题讨论】:

【参考方案1】:

我认为第一个更受欢迎,虽然它需要一些调整:)

第一个注意事项:如果您创建的数据仅用作关系数据(如userJokes),最好只为其添加简单的值而不复制整个源数据(jokes 数据) ,像这样:

userJokes: 
    randomUserId: 
        randomJokeId:true,
        anotherRandomJokeId:true
    
    awesomeUser: 
        randomJokeId:true
    


第二点:如果你想实现两个功能(喜欢和收藏),我认为你应该将它作为不同的数据。所以它将是userJokeLikeuserJokeFavorite(或类似的东西)。并且它们每个的结构都应该与我在第一个注释中提到的相同。


结论

每个笑话数据仍在它们的源路径中(即在jokes 中),并且只有它们的 id 被复制到新创建的数据路径中(userJokeLikeuserJokeFavorite

当您想搜索 ID 为 randomUserId 的用户喜欢的笑话时,您应该检查 userJokeLike\randomUserId。然后从你得到的每个笑话 id 中,从内部源 jokes 路径中获取真实数据。

当你想搜索id为randomUserId的用户喜欢的笑话时,基本上和上面一样。

当你想计算每个笑话的喜欢和喜爱时,只需使用这样的东西:

FirebaseDatabase.getInstance().getReference("userJokeLike")
    .orderByChild().equalsTo("randomJokeId")
    .addListenerForSingleValueEvent(new ValueEventListener() 
        ... onDataChange(DataSnapshot dataSnapshot) 
            int jokeCount = dataSnapshot.getChildrenCount();
        
    );

到此为止,希望对您有所帮助。

注意:我没有检查最后的代码,希望可以工作:p

编辑:

看来我误会了:D

上面的解决方案是我认为最适合结构本身的解决方案。但是,如果我们需要简单快速的东西,那么每种情况/情况都会有所不同。我认为最好的解决方案是如果您想获得包含喜欢和收藏的笑话(无需创建另一个请求),那么您的结构应该如下所示:

jokes: 
    randomJokeId: 
        // joke data here
        likes:
            randomUserId:true,
            anotherUserId:true
        ,
        favorites:
            randomUserId:true
        
    

当您请求jokes 数据时,它包括likesfavorite。所以在每个数据中你只需要检查当前用户的 UID 是否存在于likes 和/或favorite 中。这样计数器会容易得多。

编码愉快:)

【讨论】:

我可能错过了我的问题的重点。我想在列表中显示笑话,就像任何社交应用程序中的提要一样。在显示笑话的同时,我还想根据用户已经完成的操作立即显示喜欢、不喜欢和收藏的适当图标。就像 Instagram 的提要在已经被点赞的图片上显示红心一样。所以,我希望这些数据已经存在,而不必进行新的查询。这就是为什么我建议第一个解决方案,我将每个笑话保存在用户 UID 键下,并带有表示喜欢、不喜欢和收藏的附加信息。 我已经编辑了我的答案,希望这次我做对了:D

以上是关于具有 Firebase 身份验证用户的 Firebase 数据库数据结构的主要内容,如果未能解决你的问题,请参考以下文章

具有 Firebase 身份验证用户的 Firebase 数据库数据结构

具有客户端/应用身份验证而非用户身份验证的 Firebase Android 应用

Firebase Auth 与 firebaseui-web 在身份验证后不会重定向

具有 facebook 身份验证和唯一 ID 的 Firebase 规则

具有 Firebase 身份验证的拦截器

使用Firebase Google用户身份验证更改用户