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?
Jawaban:
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.
sumber
PostgreSQL memiliki beberapa fitur bagus untuk penyimpanan JSON. Anda dapat memilih nilai JSON dengan melakukan
Anda juga bisa mengindeks kunci tertentu pada objek JSON jika Anda menggunakan
jsonb
tipe itu.sumber
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.
Anda juga dapat melakukan ini dengan bergabung sendiri jika diinginkan.
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'.
sumber