그래서 저는 최근에 비정규 화에 대해 배웠습니다. 그리고 나는 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과 관련된 모든 데이터를 저장해야합니까? 그러나 이것은 파이어베이스에 뿌리를 내릴 것입니다. 왜냐하면 내가 키를 저장하는 대신 인트로 스터 키를 말할 때 코스 루트에이 방식을 사용하면 더 깊은 파이어베이스가있는 또 다른 레벨 만 저장하게 될 것이기 때문입니다.비정규 데이터는 좋은 일이지만 같은 경우는 필요하지 않을 수있다 :