Firebase数据库结构建议

时间:2017-11-19 17:42:30

标签: android firebase firebase-realtime-database

我需要一些关于如何构建数据库以便正确查询的建议。据我所知,数据库的结构就是一切,但我不确定我是否正确使用它。

基本上我的应用程序应该从api中检索数据并在列表视图中显示。列表视图中的每个项目(新闻广告)都可以包含来自firebase用户的评论。

所以我有“NewsPost”,“User”和“Comment”模型看起来像这样。'

NewsPost.class

private String id;
private String date;
private String title;
private String commentsNumber;
private List<Comment> comments;
private String imageUrl;

User.class
private String userName;
private String userAvatar;
private String firstName;
private String lastName;
private String eMail;

Comment.class
private UUID uuid;
private String postId;
private String message;
private String postDate;
private String userAvatar;
private String userName;

所以这就是我试图存储它的方式:

Firebase data structure

这就是当用户点击以使用newsPostId作为查询参数读取listView中特定newsPostItem的注释时,我尝试获取注释的方法。

public void getComments(String postId) {

comments = new ArrayList<>();
Query query = databaseReference.child("comments").orderByChild(postId).equalTo(postId);
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    for (DataSnapshot issue : dataSnapshot.getChildren()) {
                        Comment comment = issue.getValue(Comment.class);
                        comments.add(comment);
                    }
                    Log.d("GETCOMMENTS", "SNAPSHOT EXISTS");
                    view.onCommentsLoaded(comments);
                }

                else{
                    view.onCommentsLoaded(comments);
                    Log.d("GETCOMMENTS", "SNAPSHOT NOT EXISTS");
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                view.onCommentsLoaded(comments);
                Log.d("GETCOMMENTS", databaseError.getMessage());
            }
        });
}

我的问题是,amidoinitrite?

我得到了本月警告(10 GB)的firebase下载限制,这不应该发生,因为我现在是唯一的用户。

感谢任何帮助!

旁注:userAvatar存储在数据库中的byte []中,不行吗?

2 个答案:

答案 0 :(得分:0)

使用Firebase时,我们需要记住一些规则。在您的特定情况下,我使用非规范化重新命令您并将数据库更改为尽可能扁平化。为了更好地理解,我重新命令您看到此视频,Denormalization is normal with the Firebase Database。由于Firebase实时数据库无法查询多个属性,因此ussaly涉及复制数据。所以这对Firebase来说是正常的。在你的特殊情况下,我会重复你做这两件事。

我还要重温你读这篇文章,Structuring your Firebase Data correctly for a Complex App。它解释得非常好,可以帮助您做出最好的决定。

您需要知道数据库没有完美的结构。您需要以允许您以非常有效的方式非常轻松地读/写数据的方式构建数据库。如果您还不知道,Firebase已推出名为Cloud Firestore的新产品。实时数据库在新Firestore执行时不会自动扩展。

答案 1 :(得分:0)

目前您正在添加&#34; NewsPostID&#34;作为根节点内部&#34;评论&#34;。 这种结构将消耗更多的存储空间,因为每个新的注释都被添加为新的根内部&#34;注释&#34;节点

假设我们想查询:特定用户对任何单个日期的所有评论。所以,在这种情况下,当前结构应用查询很复杂。

您可以更改结构:

"comments" 
     -"userEmail"
            - "NewPostDate"
                       - "NewpostID:15478"
                                       -KHZzTwazaSd (this is random id)
                                          -"message: hey.."  
                                          -"postDate: Date + 12:10PM"  
                                       -KHZzTwazaSd (this is random id)
                                          -"message: Nice post.."  
                                          -"postDate: Date + 12:22PM"  
                       - "NewpostID:54478"
                                       -KHZzTwazaSd (this is random id)
                                          -"message: Nice day"  
                                          -"postDate: Date + 10:45PM"  

您可以使用&#34; userEmail&#34;从用户表中获取所有与用户相关的详细信息。来自&#34;评论&#34;。这将减少节点大小,也将有助于查询。