JSON'u SQLite'ta depolamak ve sorgulamak mümkün mü?


34

JSON nesnelerini bir SQLite veritabanında depolamam ve sonra üzerinde karmaşık sorgular yapmam gerekiyor.

Böyle bir masa yaptım:

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

iki nesne için

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

Ancak, "VE" sorgularını yapamam:

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

Gördüğünüz gibi, "NEREDE" den sonraki kısım tamamen saçmalıktır, ancak istediğimi yapacak bir sorgunun nasıl oluşturulacağı hakkında hiçbir fikrim yok.

Peki, verilerimi depolamak için daha iyi bir yol veya "VE" sorgusu yapmak için geçici bir çözüm olduğunu düşünüyor musunuz?

Ve elbette, JSON herhangi bir özellik içerebilir, dolayısıyla her özellik için sütun içeren bir tablo oluşturamıyorum.

Uzantıları olmayan SQLite olan WebSQL kullanıyorum.

Sorumun özel olduğunu biliyorum ama bana yardımcı olabilir misiniz?


2
Bu, uygulamanız için gerçekten önemliyse, muhtemelen gerçek bir belge deposunu ("NoSQL") kullanarak veya örneğin, çok verimli JSON depolamasını güçlü ilişkisel özelliklerle birleştiren Postgres'e geçiş yapmanıza gerek kalmaz.
a_horse_with_no_name

3
Belgeleri okuyun .
CL.

@CL. Yupp. Aynı zamanda "sqlite json" için googling yaparken ilk sonuç :)
Izzy


@Zzy Her şeyden önce, benim için en azından bu soru şimdi ilk sonuç, dokümanlar değil. İkincisi, bu uzantı , 'WebSQL, uzantısız SQLite' kullanılarak açıkça ifade edilen OP'ye iyi bir cevap değildir.
OJFord

Yanıtlar:


32

SQLite 3.9 , JSON verileriyle kolayca çalışmanıza olanak sağlayan yeni bir uzantı ( JSON1 ) tanıttı .

Ayrıca, (benim anladığım kadarıyla) JSON verileriniz üzerinde de indeksler tanımlamanıza izin vermesi gereken ifadelerdeki indeksler için destek sağlamıştır .


7

PostgreSQL, JSON depolama için bazı güzel özelliklere sahiptir. Yaparak JSON değerlerini seçebilirsiniz.

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

Ayrıca jsonbtipi kullanıyorsanız, JSON nesnesindeki belirli tuşları da indeksleyebilirsiniz .


5

Bu sorunun mevcut cevapları, OP'nin verilerini JSON olarak depolamakla (bunun altında yatan sorun için daha iyi bir çözüm olabilir).

Ancak asıl soru, birden fazla özelliğe dayalı olarak sağlanan EAV stili tabloda belgeleri nasıl bulacağımızdı. Yani, belki de bu sorunun cevabı faydalı olacaktır.

Söylediklerinizi yapmanın standart SQL yolu Kesişim'dir.

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

İsterseniz bunu kendinizle de yapabilirsiniz.

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"

Tabii ki daha "doğru" ve tartışmasız en verimli yol, 'id' ve 'title' gibi ihtiyacınız olan her özellik için yalnızca bir sütun oluşturmak olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.