Apakah mungkin untuk menyimpan dan meminta JSON dalam SQLite?

35

Saya perlu menyimpan objek JSON dalam database SQLite, dan kemudian melakukan pertanyaan kompleks di atasnya.

Saya melakukan tabel seperti ini:

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

untuk dua objek

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

Tapi saya tidak bisa melakukan permintaan "DAN", seperti:

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

seperti yang Anda lihat, bagian setelah "WHERE" adalah omong kosong, tapi saya tidak tahu bagaimana cara membuat kueri yang akan melakukan apa yang saya inginkan.

Jadi menurut Anda ada cara yang lebih baik untuk menyimpan data saya, atau solusi untuk melakukan kueri "DAN"?

Dan tentu saja, JSON dapat berisi properti apa pun, jadi saya tidak bisa membuat tabel dengan kolom untuk setiap properti.

Saya menggunakan WebSQL, yang merupakan SQLite tanpa ekstensi.

Saya tahu pertanyaan saya cukup spesifik, tetapi bisakah Anda membantu saya?

tuxlu
sumber
2
Jika itu benar-benar penting untuk aplikasi Anda, Anda mungkin lebih baik menggunakan toko dokumen nyata ("NoSQL") atau misalnya beralih ke Postgres yang menggabungkan penyimpanan JSON yang sangat efisien dengan fitur relasional yang kuat.
a_horse_with_no_name
3
Baca dokumentasinya .
CL.
@CL. Yupp. Itu juga hasil pertama ketika googling untuk "sqlite json" :)
Izzy
Anda harus membuat akun dan menggabungkannya: dba.stackexchange.com/users/81459/tuxlu dan dba.stackexchange.com/users/81513/tuxlu Anda dapat menggunakan halaman bantuan ini: dba.stackexchange.com/help/merging-accounts
Julien Vavasseur
@Izzy Pertama-tama, bagi saya setidaknya pertanyaan ini sekarang adalah hasil pertama, bukan dokumen. Kedua, ekstensi itu bukan jawaban yang baik untuk OP, yang secara eksplisit dinyatakan menggunakan 'WebSQL, yang merupakan SQLite tanpa ekstensi'.
OJFord

Jawaban:

35

SQLite 3.9 memperkenalkan ekstensi baru ( JSON1 ) yang memungkinkan Anda bekerja dengan mudah dengan data JSON.

Juga, itu memperkenalkan dukungan untuk indeks pada ekspresi , yang (dalam pemahaman saya) harus memungkinkan Anda untuk menentukan indeks pada data JSON Anda juga.

Ahli Fisika
sumber
7

PostgreSQL memiliki beberapa fitur bagus untuk penyimpanan JSON. Anda dapat memilih nilai JSON dengan melakukan

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

Anda juga bisa mengindeks kunci tertentu pada objek JSON jika Anda menggunakan jsonbtipe itu.

redneckProgrammer
sumber
5

Jawaban yang ada untuk kesepakatan ini dengan benar-benar menyimpan data OP sebagai JSON (yang mungkin merupakan solusi yang lebih baik untuk masalah yang mendasarinya).

Namun, pertanyaan sebenarnya adalah bagaimana mendapatkan dokumen dalam tabel gaya EAV yang disediakan, berdasarkan beberapa properti. Jadi, mungkin jawaban untuk pertanyaan itu akan bermanfaat.

Cara SQL standar untuk melakukan apa yang Anda katakan adalah INTERSECTION.

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

Anda juga dapat melakukan ini dengan bergabung sendiri jika diinginkan.

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"

Tentu saja cara yang lebih "benar" dan bisa dibilang paling efisien adalah dengan membuat kolom untuk setiap properti yang Anda butuhkan, seperti 'id' dan 'title'.

Thomas Ahle
sumber