具有 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
第二点:如果你想实现两个功能(喜欢和收藏),我认为你应该将它作为不同的数据。所以它将是userJokeLike
和userJokeFavorite
(或类似的东西)。并且它们每个的结构都应该与我在第一个注释中提到的相同。
结论:
每个笑话数据仍在它们的源路径中(即在jokes
中),并且只有它们的 id 被复制到新创建的数据路径中(userJokeLike
和 userJokeFavorite
)
当您想搜索 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
数据时,它包括likes
和favorite
。所以在每个数据中你只需要检查当前用户的 UID 是否存在于likes
和/或favorite
中。这样计数器会容易得多。
编码愉快:)
【讨论】:
我可能错过了我的问题的重点。我想在列表中显示笑话,就像任何社交应用程序中的提要一样。在显示笑话的同时,我还想根据用户已经完成的操作立即显示喜欢、不喜欢和收藏的适当图标。就像 Instagram 的提要在已经被点赞的图片上显示红心一样。所以,我希望这些数据已经存在,而不必进行新的查询。这就是为什么我建议第一个解决方案,我将每个笑话保存在用户 UID 键下,并带有表示喜欢、不喜欢和收藏的附加信息。 我已经编辑了我的答案,希望这次我做对了:D以上是关于具有 Firebase 身份验证用户的 Firebase 数据库数据结构的主要内容,如果未能解决你的问题,请参考以下文章
具有 Firebase 身份验证用户的 Firebase 数据库数据结构
具有客户端/应用身份验证而非用户身份验证的 Firebase Android 应用
Firebase Auth 与 firebaseui-web 在身份验证后不会重定向