Preciso armazenar objetos JSON em um banco de dados SQLite e fazer consultas complexas nele.
Eu fiz uma tabela como esta:
+--------------------------------------+
|document | property | string | number|
+--------------------------------------+
|foo | "title" | "test" | |
+--------------------------------------+
|foo | "id" | | 42 |
+--------------------------------------+
|bar | "id" | | 43 |
+--------------------------------------+
para os dois objetos
foo {"title": "test", "id": 42}
bar {id: 43}
Mas não posso fazer consultas "AND", como:
SELECT DISTINCT id FROM table WHERE title = "test" AND id = 42
como você vê, a parte após o "WHERE" é totalmente sem sentido, mas não tenho idéia de como criar uma consulta que faria o que eu quero.
Então, você acha que existe uma maneira melhor de armazenar meus dados ou uma solução alternativa para fazer uma consulta "AND"?
E, é claro, o JSON pode conter qualquer propriedade, portanto, não posso criar uma tabela com colunas para cada propriedade.
Estou usando o WebSQL, que é SQLite sem extensões.
Sei que minha pergunta é bem específica, mas você poderia me ajudar?
Respostas:
O SQLite 3.9 introduziu uma nova extensão ( JSON1 ) que permite trabalhar facilmente com dados JSON.
Além disso, ele introduziu suporte para índices de expressões , o que (no meu entendimento) deve permitir que você defina índices nos seus dados JSON também.
fonte
O PostgreSQL possui alguns recursos interessantes para armazenamento JSON. Você pode selecionar os valores JSON fazendo
Você também pode indexar as chaves específicas no objeto JSON se você usar o
jsonb
tipofonte
As respostas existentes para esse acordo realmente armazenam os dados do OP como JSON (que pode ter sido uma solução melhor para o problema subjacente).
No entanto, a questão real era como encontrar documentos na tabela de estilo EAV fornecida, com base em várias propriedades. Portanto, talvez uma resposta para essa pergunta seja útil.
A maneira padrão do SQL de fazer o que você está dizendo é INTERSECTION.
Você também pode fazer isso com auto-junções, se preferir.
É claro que a maneira mais "correta" e sem dúvida mais eficiente seria criar uma coluna para cada propriedade necessária, como 'id' e 'title'.
fonte