Firebase는 데이터에 대해 임의의 하위 키를 사용하는 임시 쿼리를 허용합니다. 색인을 미리 계획할 수 있으면 Firebase 실시간 데이터베이스 보안 규칙에서 .indexOn 규칙을 통해 색인을 정의하여 쿼리 성능을 높일 수 있습니다.
데이터 색인 정의
Firebase는 데이터 정렬 및 쿼리를 위한 강력한 도구를 제공합니다. 특히 Firebase는 노드 컬렉션에 대해 임의의 공통 하위 키를 사용한 즉석 쿼리를 허용합니다. 이 쿼리는 앱의 규모가 커질수록 성능이 저하됩니다. 그러나 쿼리 대상 키를 Firebase에 미리 알리면 Firebase가 서버에서 이 키를 색인화하여 쿼리 성능이 향상됩니다.
orderByChild로 색인 생성
예제를 통해 알기 쉽게 설명해 드리겠습니다. Firebase 개발팀 모두는 공룡을 매우
좋아해서 공룡을 예로 들어보겠습니다. 다음은 공룡 자료 샘플 데이터베이스의 스니펫입니다. 이 스니펫을 사용하여 .indexOn와 orderByChild()를 함께 사용하는 방법을 설명하려 합니다.
{
"lambeosaurus": {
"height" : 2.1,
"length" : 12.5,
"weight": 5000
},
"stegosaurus": {
"height" : 4,
"length" : 9,
"weight" : 2500
}
}앱에서 공룡을 이름, 키, 길이 순으로 자주 정렬하지만 무게로는 정렬하지 않는다고 가정하겠습니다. Firebase에 이 정보를 미리 알리면 쿼리의 성능을 높일 수
있습니다. 공룡의 이름 자체가 레코드의 키이므로 Firebase에서 이미 공룡 이름으로 쿼리가 최적화된 상태입니다.
.indexOn을 사용하여 Firebase에 높이 및 길이에 대한 쿼리를 최적화하도록 지시할 수도 있습니다.
{
"rules": {
"dinosaurs": {
".indexOn": ["height", "length"]
}
}
}다른 규칙과 마찬가지로 규칙의 모든 수준에서 .indexOn 규칙을 지정할 수 있습니다.
위 예시에서는 모든 공룡 데이터가 데이터베이스의 루트에 저장되어 있으므로 규칙을 루트 수준에 배치했습니다.
orderByValue로 색인 생성
이 예시에서는 .indexOn과 orderByValue()를 함께 사용하는 방법을 보여줍니다.
다음 데이터로 공룡 운동경기 점수 리더보드를 만든다고 가정해 보겠습니다.
{
"scores": {
"bruhathkayosaurus" : 55,
"lambeosaurus" : 21,
"linhenykus" : 80,
"pterodactyl" : 93,
"stegosaurus" : 5,
"triceratops" : 22
}
}orderByValue()를 사용하여 리더보드를 만들려고 하므로 /scores 노드에 .value 규칙을 추가하여 쿼리를 최적화할 수 있습니다.
{
"rules": {
"scores": {
".indexOn": ".value"
}
}
}