Django PostgreSQL db_index บน JSONField เพื่อสืบค้นด้วยคีย์ที่แน่นอน

ฉันมีโมเดลสถานที่:

class Place(models.Model):

    ... some not interesting fields

    distances = models.JSONField()

ใน JSONField (ระยะทาง) จะเก็บข้อมูลดังนี้:

{
    '1': 10
    '2': 20
    '3': 30
    '4': 40
    ...
    '1000': 10000
}

โดยที่คีย์คือ 'id' ของโมเดลตำแหน่งบางรุ่น และความคุ้มค่า - 'time in road' ไปยังตำแหน่งนี้จากสถานที่นี้

หากผู้ใช้เว็บไซต์เลือกตำแหน่ง ฉันจะแสดงสถานที่ตามลำดับจากใกล้ที่สุดไปยังเพิ่มเติมไปยังตำแหน่งที่เลือก:

places = Place.objects.all().order_by(
    RawSQL('distances->%s', (str(selected_location_id),))
)

และทุกอย่างเจ๋งยกเว้นประสิทธิภาพ

แต่ PostgreSQL รองรับการจัดทำดัชนีสำหรับฟิลด์ JSONB (ซึ่งใช้ Django สำหรับ JSONField):

GIN, btree และ แฮช

  1. ความแตกต่างระหว่างพวกเขาคืออะไร? อันไหนที่เหมาะกับตัวอย่างของฉัน?
  2. django รองรับ db_index บน JSONField หรือไม่ ถ้าใช่จะระบุได้อย่างไรว่าจะใช้ดัชนีใด?

ขอบคุณมากสำหรับความช่วยเหลือ!


person MaxCore    schedule 25.06.2016    source แหล่งที่มา
comment
อาจซ้ำกันของ วิธีกำหนดประเภทของดัชนี เพื่อใช้ใน Postgres?   -  person e4c5    schedule 26.06.2016
comment
คำถามของคุณจำนวนมากได้รับคำตอบจากคำถามที่เชื่อมโยง ที่เหลือดูเหมือนสถานการณ์ที่คุณไม่ควรใช้ jsonb   -  person e4c5    schedule 26.06.2016


คำตอบ (1)


หากต้องการจัดทำดัชนีคีย์เฉพาะใน json ให้สร้างการโยกย้าย sql แบบ raw:

  1. เรียกใช้ ./manage.py makemigrations --empty yourApp โดยที่ yourApp คือแอปของโมเดลที่คุณต้องการเปลี่ยนดัชนี

  2. แก้ไขการโยกย้ายเช่น

operations = [
    migrations.RunSQL("CREATE INDEX idx_name ON your_table((json_field->>'json_key'));")
]

โดยที่ idx_name คือชื่อของดัชนี your_table คือตารางของคุณ json_field คือ JSONField ของคุณ และ json_key ในกรณีนี้คือคีย์ที่คุณต้องการสร้างดัชนี

ไม่แน่ใจว่ามี wrapper ดั้งเดิมสำหรับสิ่งนี้ใน django หรือไม่ ฉันค้นหาแล้วไม่พบ แต่ควรทำ คุณอาจต้องการทราบว่าดัชนีนี้ถูกสร้างขึ้นผ่านการย้ายข้อมูลนี้ในเมตาโมเดลของคุณเช่นกัน ไชโย!

person radtek    schedule 22.09.2020