我需要一些关于如何构建数据库以便正确查询的建议。据我所知,数据库的结构就是一切,但我不确定我是否正确使用它。
基本上我的应用程序应该从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;
所以这就是我试图存储它的方式:
这就是当用户点击以使用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 []中,不行吗?
答案 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;。这将减少节点大小,也将有助于查询。