Firebase/AngularFire数据建模最佳实践



我第一次在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
  }
}

它允许您获得最新的帖子,而不必通过任何用户。此外,您还可以获取任何用户发布的所有帖子。

最新更新