จัดทำดัชนีข้อมูลของคุณ

Firebase ให้คุณค้นหาเฉพาะกิจเกี่ยวกับข้อมูลโดยใช้คีย์ย่อยที่กำหนดเองได้ หากทราบล่วงหน้าว่าจะใช้ดัชนีใด คุณสามารถกําหนดดัชนีผ่านกฎ .indexOn ในกฎความปลอดภัยของ Firebase Realtime Database เพื่อปรับปรุงประสิทธิภาพการค้นหา

การกําหนดดัชนีข้อมูล

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() เพื่อสร้างตารางอันดับ เราจึงเพิ่มประสิทธิภาพการค้นหาได้โดยเพิ่มกฎ .value ที่โหนด /scores ดังนี้

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