0

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

回答

0

這是一種間接的回答:

反規範化的數據是一件好事,但在相同的情況下,它可能沒有必要。

例如,在這種情況下,學生想知道他的課程,所以你知道直接路徑給學生;用戶/ uid_0,然後也許對你有興趣在學期的查詢。

這裏是與你的課程和教師

users 
    uid_0 
    schedules 
     -Yiaiajsdaoiojasd 
     semester: 1 
     courses 
      course1: true 
      course3: true 
     -Jyuhus99jsijskkss 
     semester: 2 
     courses 
      course2: true 
      course4: true 
    uid_1 
    schedules 
     -Yjs909k0s0s0ks0s 
     semester: 1 
     courses 
      course1: true 
      course3: true 
     -Jyuhus99jsijskkss 
     semester: 2 
     courses 
      course2: true 
      course4: true 

這真的不是很深刻,因爲一旦你在閱讀雲的結構用戶節點,您具有指向您需要的其他數據的特定路徑:例如/ courses/courseKey1/instructors,然後是教師/ instructor1/name。

如果你不知道數據的直接路徑並且不得不堆積查詢查詢 - 那麼反規範化就是最有效的。此外,查詢有很多開銷,而只是觀察您認識的路徑上的節點。