0

그래서 저는 최근에 비정규 화에 대해 배웠습니다. 그리고 나는 firebase 데이터베이스를 구조화하는 최선의 방법을 찾으려하고 있습니다. 내가 현재 가지고있는 것은 클래스 코스 번호와 인과 관계 이름으로 사용자 클래스 스케줄을 표시하고있다. 중포 기지 나를 위해 다음과 같습니다NoSQL Firebase denormalization

-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 이름을 잡아 필요가 내 스케줄에 바로 사람에 클래스의 내 마스터 목록을 필터링 끝났입니다 때 당신이 볼 수 있듯이

. 둘 다 내가 다시 파이어베이스를 부를 것을 요구한다. 그래서 비동기로 인해 문제가되는 것으로 보이는 파이어베이스 연구를 줄이기 위해 데이터를 비정규 화해야합니까? courseKey1 만 저장하는 대신 firebase의 클래스 루트에서 couseKey1과 관련된 모든 데이터를 저장해야합니까? 그러나 이것은 파이어베이스에 뿌리를 내릴 것입니다. 왜냐하면 내가 키를 저장하는 대신 인트로 스터 키를 말할 때 코스 루트에이 방식을 사용하면 더 깊은 파이어베이스가있는 또 다른 레벨 만 저장하게 될 것이기 때문입니다.

비정규 데이터는 좋은 일이지만 같은 경우는 필요하지 않을 수있다 :

답변

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)를 지정한 다음 instructors/instructor1/name을 입력합니다.

문제가되는 부분은 데이터의 직접 경로를 모르고 쿼리에서 쿼리를 쌓아 올려야하는 경우입니다. 즉, 비정규 화가 가장 효과적인 곳입니다. 또한 쿼리에는 알고있는 경로에서 노드를 관찰하는 것보다 많은 오버 헤드가 있습니다.