我是第一次在Firebase中开发应用程序,并且很好奇我应该如何在两个对象(user
和post
之间建模数据。我来自更多的关系数据库背景,不仅好奇这是如何在非关系数据库中完成的,而且特别是如何在Firebase中设置两个对象之间的关系。
例如,我的应用程序有很多用户,每个用户都创建了很多帖子。
User {
firstName: String,
lastname: String,
userName: String
}
Post {
title: String,
content: String,
date: Date,
writtenBy: [User object?]
}
我应如何在Firebase中构建这两个对象,以便帖子属于用户,但无论用户如何都可以查询所有帖子,并且可以编辑用户和帖子对象而不会中断其他对象的数据和/或关系?
我应该如何通过firebase创建新的“关系”对象:
sync.$set({userA: {
firstname: "Billy",
lastName: "Bob",
userName: "BillyBob",
Posts: {
// .....
}
}
});
谢谢!
答案 0 :(得分:9)
Firebase的构建充分考虑了性能。这就是你必须以不同方式设计数据结构的原因,在大多数情况下,规范化是你的敌人。 Firebase中的每个对象都可以通过URL访问,您应该始终牢记这一点。 设计数据结构的方法仍然很多,这取决于您要执行哪些查询。如果其中一个查询能够显示所有消息(我相信一些最新消息将是最常见的用例),但同时您希望能够显示每个用户的消息而不是一个可能的消息数据结构可能如下所示:
User {
userId(assigned by Firebase automatically) {
firstName: String,
lastname: String,
userName: String
}
}
Post {
User {
userId(matching userId in the User object) {
postId(assigned by Firebase for every new post automatically) {
title: String,
content: String,
date: Date,
writtenBy: String, userName or userId (this is not really needed, but may keep it for easier data access)
}
}
}
}
然后,您可以更改任何用户数据,而不会触发帖子中的数据更改事件,例如您的示例中(如果您有大量邮件,则会非常繁重)。 您可以独立于用户获取所有消息:
var postListRef = new Firebase(URL);
var lastPostQuery = postListRef.child("Post").limit(500);
你也可以使用startAt()和endAt()问题https://www.firebase.com/docs/web/api/query/limit.html 作为一个缺点 - 如果你只需要显示消息,你必须在for循环中解压缩每条消息,但我希望你也会显示用户信息,所以它应该没问题。
如果您只想收听一条用户消息,那么它非常简单快捷:
var postListRef = new Firebase(URL);
var lastPostQuery = postListRef.child("Post/User").child(userId);
Angular / AngularFire对这种数据结构有很大的支持。
答案 1 :(得分:0)
我也是Firebase的新手,我建议使用以下结构。
Users: {
userID: {
firstName: String,
lastname: String,
userName: String,
posts: {
postID1:true,
postID2:true
}
Posts: {
postID1:{
title: String,
content: String,
date: Date,
writtenBy: userID
}
}
它允许您无需通过任何用户即可获取最新帖子。另外,您可以获得任何用户发布的所有帖子。