所以我最近才瞭解反規範化,我只是想弄清楚構建我的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的另一個層次。