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

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

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

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"
    }
  }
}