我第一次在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: {
// .....
}
}
});
谢谢!
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)
}
}
}
}
然后,您可以更改任何用户数据,而无需触发Posts中的数据更改事件,就像在示例中一样(如果您有大量消息,这将是非常繁重的)。您可以独立于用户获取所有消息:
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对这种数据结构有很好的支持
我也是Firebase的新手,我推荐以下结构:
Users: {
userID: {
firstName: String,
lastname: String,
userName: String,
posts: {
postID1:true,
postID2:true
}
Posts: {
postID1:{
title: String,
content: String,
date: Date,
writtenBy: userID
}
}
它允许您获得最新的帖子,而不必通过任何用户。此外,您还可以获取任何用户发布的所有帖子。