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。

如果你不知道数据的直接路径并且不得不堆积查询查询 - 那么反规范化就是最有效的。此外,查询有很多开销,而只是观察您认识的路径上的节点。