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

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

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

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

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

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

【问题讨论】:

    标签: android ios node.js firebase-realtime-database firebase-authentication


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2017-06-19
    • 2019-04-19
    • 1970-01-01
    • 2019-04-25
    • 2020-09-24
    • 2017-12-26
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多