เป็นไปได้หรือไม่ที่จะจัดเก็บและสืบค้น JSON ใน SQLite


34

ฉันต้องการเก็บวัตถุ JSON ในฐานข้อมูล SQLite แล้วทำการสืบค้นที่ซับซ้อน

ฉันทำโต๊ะแบบนี้:

+--------------------------------------+
|document |  property | string | number|
+--------------------------------------+
|foo      |  "title"  | "test" |       | 
+--------------------------------------+
|foo      |  "id"     |        |  42   | 
+--------------------------------------+
|bar      |  "id"     |        |  43   | 
+--------------------------------------+

สำหรับวัตถุทั้งสอง

foo {"title": "test", "id": 42} 
bar {id: 43}

แต่ฉันไม่สามารถทำคำค้นหา "และ" เช่น:

SELECT DISTINCT id  FROM table WHERE title = "test" AND id = 42 

อย่างที่คุณเห็นส่วนหลัง "WHERE" นั้นเป็นเรื่องไร้สาระทั้งหมด แต่ฉันไม่รู้ว่าจะสร้างคิวรีที่จะทำสิ่งที่ฉันต้องการได้อย่างไร

คุณคิดว่ามีวิธีที่ดีกว่าในการจัดเก็บข้อมูลของฉันหรือวิธีแก้ปัญหาในการทำแบบสอบถาม "AND" หรือไม่

และแน่นอน JSON สามารถมีคุณสมบัติใด ๆ ดังนั้นฉันไม่สามารถสร้างตารางที่มีคอลัมน์สำหรับแต่ละคุณสมบัติ

ฉันใช้ WebSQL ซึ่งเป็น SQLite ที่ไม่มีส่วนขยาย

ฉันรู้ว่าคำถามของฉันค่อนข้างเฉพาะเจาะจง แต่คุณสามารถช่วยฉันได้ไหม


2
ถ้านั่นเป็นสิ่งสำคัญสำหรับแอปพลิเคชันของคุณคุณน่าจะดีกว่าการใช้ที่เก็บเอกสารจริง ("NoSQL") หรือเปลี่ยนไปใช้ Postgres ซึ่งรวมที่เก็บข้อมูล JSON ที่มีประสิทธิภาพมากเข้ากับคุณสมบัติเชิงสัมพันธ์ที่แข็งแกร่ง
a_horse_with_no_name

3
อ่านเอกสาร
CL

@CL yupp ที่ยังเป็นผลแรกเมื่อ googling สำหรับ "SQLite JSON" :)
อิซซี่

คุณต้องรวมบัญชีและควรรวม: dba.stackexchange.com/users/81459/tuxluและdba.stackexchange.com/users/81513/tuxluคุณสามารถใช้หน้าช่วยเหลือนี้: dba.stackexchange.com/help/merging-accounts
Julien Vavasseur

@Izzy ก่อนอื่นเลยสำหรับฉันอย่างน้อยคำถามนี้ตอนนี้เป็นผลลัพธ์แรกไม่ใช่เอกสาร ประการที่สองส่วนขยายนั้นไม่ใช่คำตอบที่ดีสำหรับ OP ซึ่งระบุอย่างชัดเจนโดยใช้ 'WebSQL ซึ่งเป็น SQLite ที่ไม่มีส่วนขยาย'
OJFord

คำตอบ:


32

SQLite 3.9 แนะนำส่วนขยายใหม่ ( JSON1 ) ที่ช่วยให้คุณทำงานกับข้อมูล JSON ได้อย่างง่ายดาย

นอกจากนี้ยังแนะนำการสนับสนุนดัชนีในนิพจน์ซึ่ง (ในความเข้าใจของฉัน) ควรอนุญาตให้คุณกำหนดดัชนีในข้อมูล JSON ของคุณด้วย


7

PostgreSQL มีคุณสมบัติที่ดีสำหรับการจัดเก็บ JSON คุณสามารถเลือกค่า JSON ได้โดยทำ

SELECT DISTINCT FROM TABLE WHERE foo->title=test AND id=42

คุณยังสามารถจัดทำดัชนีคีย์เฉพาะบนวัตถุ JSON หากคุณใช้jsonbประเภท


5

คำตอบที่มีอยู่สำหรับข้อตกลงนี้ด้วยการจัดเก็บข้อมูลของ OP เป็น JSON (ซึ่งอาจเป็นทางออกที่ดีกว่าสำหรับปัญหาพื้นฐานของเขา)

อย่างไรก็ตามคำถามที่เกิดขึ้นจริงคือวิธีการค้นหาเอกสารในตารางสไตล์ EAV ที่จัดเตรียมโดยยึดตามคุณสมบัติหลายประการ ดังนั้นบางทีคำตอบสำหรับคำถามนั้นอาจเป็นประโยชน์

วิธี SQL มาตรฐานในการทำสิ่งที่คุณพูดนั้นคือ INTERSECTION

(SELECT document FROM table WHERE property="id" AND number=43)
INTERSECTION 
(SELECT document FROM table WHERE property="title" AND string="test")

นอกจากนี้คุณยังสามารถทำได้ด้วยการรวมตัวเองหากคุณต้องการ

SELECT t1.document
FROM table as t1, table as t2
WHERE t1.document = t2.document
AND t1.property="id" AND t1.number=43
AND t2.property="title" AND t2.string="test"

แน่นอนยิ่ง "ถูกต้อง" และวิธีที่มีประสิทธิภาพมากที่สุดคือการสร้างคอลัมน์สำหรับแต่ละคุณสมบัติที่คุณต้องการเช่น 'id' และ 'title'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.