所以我最近才了解反规范化,我只是想弄清楚构建我的Firebase数据库的最佳方法。我目前拥有的是我显示的课程编号和入侵者名称的用户类课程表。火力地堡看起来像这样对我说:NoSQL Firebase非规范化
-root
-users
-uid1
-uid2
-schedules
-uid1 : true (match with users uid)
-uid2 : true (match with users uid)
-class
-classKey1
-users
-uid1 : true
-uid2 : true
-courseKey1 : true
-intructorKey1 : true
-classKey1
-users
-uid1
-courseKey2 : true
-intructorKey2 : true
-courses
-courseKey1
-intructors
-intructorKey1 : true
-intructorKey2 : true
-courseKey2
-similar to above
-intructors
-intructorKey1
-courses
-courseKey1: true
-courseKey2: true
-intructorKey2
-similar to above
现在,这就是我与合作,排除所有不需要的信息的基本结构。比方说,我想显示当前登录用户的所有日程安排,我将需要执行以下操作。
_af.auth.subscribe(authState => {
let userID = authState.uid;
_af.database.list('/schedule/' + userID).subscribe(schedule =>{
this.schedule = schedule; //global variable
this.filterClasses(); call function
});
});
_af.database.list('/class').subscribe(classes => {
this.masterClasses = classes; //gloabal variable
this.filterClasses();
});
现在,因为它的所有步骤都是异步完成的,所以我认为可以这样做的唯一方法是在每个订阅内调用filterClasses函数。
filterClasses(): void {
if (this.scheduleKeys != null && this.masterClasses.length > 0) {
this.outputClasses = this.masterClasses.filter(value => {
let bool = false;
for (let i = 0; i < this.scheduleKeys.length; i++) {
if (this.scheduleKeys[i].$key === value.$key) {
bool = true;
break;
}
}
return bool;
});
this.outputClasses.forEach((value, i) => {
_af.database.object('courses/' + value.courseKey).subscribe(v => {
this.outputClasses[i]['courseNum'] = v.course;
})
_af.database.object('intructors/' + value.intructorKey).subscribe(v => {
this.outputClasses[i]['intructorName'] = v.name;
})
})
}
}
正如你可以当我做了过滤的班我的主人名单逼到我的日程安排那些我现在也需要去抓住课程号火力点和intructors名字就能看出。这两个都要求我再次调用firebase。因此,试图减少研究firebase,这似乎是由于异步造成的一些问题,而不是反正我的数据非规范化?应该在firebase的类根中而不是只存储courseKey1中是否应该存储与couseKey1相关的所有数据?然而,这会导致firebase生根,因为如果我现在在我的课程根目录中构建这种方式,当我说入侵者键而不是只保存键时,我会保存所有只是深入Firebase的另一个层次。