È possibile archiviare e interrogare JSON in SQLite?


35

Devo archiviare oggetti JSON in un database SQLite e quindi eseguire query complesse su di esso.

Ho fatto un tavolo come questo:

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

per i due oggetti

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

Ma non posso fare query "AND", come:

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

come vedi, la parte dopo "WHERE" è una totale assurdità, ma non ho idea di come creare una query che farebbe quello che voglio.

Quindi pensi che esista un modo migliore per archiviare i miei dati o una soluzione alternativa per eseguire una query "AND"?

E, naturalmente, JSON può contenere qualsiasi proprietà, quindi non posso creare una tabella con colonne per ciascuna proprietà.

Sto usando WebSQL, che è SQLite senza estensioni.

So che la mia domanda è piuttosto specifica, ma potresti aiutarmi?


2
Se questo è davvero importante per la tua applicazione, probabilmente stai meglio utilizzando un archivio documenti reale ("NoSQL") o, ad esempio, passa a Postgres che combina un archivio JSON molto efficiente con potenti funzionalità relazionali.
a_horse_with_no_name il

3
CL.

@CL. Yupp. Questo è anche il primo risultato quando si cerca su Google "sqlite json" :)
Izzy,


@Izzy Prima di tutto, per me almeno questa domanda è ora il primo risultato, non i documenti. In secondo luogo, tale estensione non è una buona risposta a OP, che ha dichiarato esplicitamente di utilizzare "WebSQL, che è SQLite senza estensioni".
OJFord,

Risposte:


35

SQLite 3.9 ha introdotto una nuova estensione ( JSON1 ) che consente di lavorare facilmente con i dati JSON.

Inoltre, ha introdotto il supporto per gli indici sulle espressioni , che (a mio avviso) dovrebbe consentire di definire anche gli indici sui dati JSON.


7

PostgreSQL ha alcune belle funzionalità per l'archiviazione JSON. È possibile selezionare i valori JSON facendo

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

È inoltre possibile indicizzare le chiavi specifiche sull'oggetto JSON se si utilizza il jsonbtipo.


5

Le risposte esistenti per questo accordo riguardano l'archiviazione effettiva dei dati del PO come JSON (che potrebbe essere stata una soluzione migliore al suo problema di fondo).

Tuttavia, la vera domanda era come trovare i documenti nella tabella in stile EAV fornita, basata su più proprietà. Quindi, forse una risposta a questa domanda sarebbe utile.

Il modo SQL standard di fare ciò che stai dicendo è INTERSEZIONE.

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

Puoi anche farlo con self join se preferisci.

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"

Naturalmente il modo più "corretto" e probabilmente più efficace sarebbe quello di creare una colonna per ogni proprietà di cui hai bisogno, come "id" e "titolo".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.