데이터 색인 생성

Firebase는 데이터에 대해 임의의 하위 키를 사용하는 임시 쿼리를 허용합니다. 색인을 미리 계획할 수 있으면 Firebase 실시간 데이터베이스 보안 규칙에서 .indexOn 규칙을 통해 색인을 정의하여 쿼리 성능을 높일 수 있습니다.

데이터 색인 정의

Firebase는 데이터 정렬쿼리를 위한 강력한 도구를 제공합니다. 특히 Firebase는 노드 컬렉션에 대해 임의의 공통 하위 키를 사용한 즉석 쿼리를 허용합니다. 이 쿼리는 앱의 규모가 커질수록 성능이 저하됩니다. 그러나 쿼리 대상 키를 Firebase에 미리 알리면 Firebase가 서버에서 이 키를 색인화하여 쿼리 성능이 향상됩니다.

orderByChild로 색인 생성

예제를 통해 알기 쉽게 설명해 드리겠습니다. Firebase 개발팀 모두는 공룡을 매우 좋아해서 공룡을 예로 들어보겠습니다. 다음은 공룡 자료 샘플 데이터베이스의 스니펫입니다. 이 스니펫을 사용하여 .indexOnorderByChild()를 함께 사용하는 방법을 설명하려 합니다.

{
  "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로 색인 생성

이 예시에서는 .indexOnorderByValue()를 함께 사용하는 방법을 보여줍니다. 다음 데이터로 공룡 운동경기 점수 리더보드를 만든다고 가정해 보겠습니다.

{
  "scores": {
    "bruhathkayosaurus" : 55,
    "lambeosaurus" : 21,
    "linhenykus" : 80,
    "pterodactyl" : 93,
    "stegosaurus" : 5,
    "triceratops" : 22
  }
}

orderByValue()를 사용하여 리더보드를 만들려고 하므로 /scores 노드에 .value 규칙을 추가하여 쿼리를 최적화할 수 있습니다.

{
  "rules": {
    "scores": {
      ".indexOn": ".value"
    }
  }
}