Firebase/AngularFire中的数据建模最佳实践

rek*_*irt 4 json nosql angularjs firebase angularfire

我是第一次在Firebase中开发一个应用程序,并且很好奇我应该如何在两个对象a user和a 之间建模数据post.我来自更多的关系数据库背景,不仅好奇这是如何在非关系数据库中完成的,而且特别是如何在Firebase中设置两个对象之间的关系.

例如,我的应用程序有很多用户,每个用户创建许多帖子.

User {
    firstName: String,
    lastname: String,
    userName: String
}

Post {
    title: String,
    content: String,
    date: Date,
    writtenBy: [User object?]
}
Run Code Online (Sandbox Code Playgroud)

我应该如何在Firebase中构建这两个对象,以便帖子属于用户,但是无论用户如何都可以查询所有帖子,并且可以在不中断其他对象的数据和/或关系的情况下编辑用户和帖子对象?

我应该如何通过firebase创建新的"关系"对象:

sync.$set({userA: {
   firstname: "Billy",
   lastName: "Bob",
   userName: "BillyBob",
   Posts: {
       // .....
   }
}
});
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ale*_*ych 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)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以更改任何用户数据,而不会触发帖子中的数据更改事件,例如您的示例中(如果您有大量邮件,这将非常繁重).您可以独立于用户获取所有消息:

var postListRef = new Firebase(URL);
var lastPostQuery = postListRef.child("Post").limit(500);
Run Code Online (Sandbox Code Playgroud)

您还可以使用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);
Run Code Online (Sandbox Code Playgroud)

Angular/AngularFire对这种数据结构有很大的支持.