Necesito almacenar objetos JSON en una base de datos SQLite, y luego hacer consultas complejas sobre él.
Hice una mesa como esta:
+--------------------------------------+
|document | property | string | number|
+--------------------------------------+
|foo | "title" | "test" | |
+--------------------------------------+
|foo | "id" | | 42 |
+--------------------------------------+
|bar | "id" | | 43 |
+--------------------------------------+
para los dos objetos
foo {"title": "test", "id": 42}
bar {id: 43}
Pero no puedo hacer consultas "Y", como:
SELECT DISTINCT id FROM table WHERE title = "test" AND id = 42
Como puede ver, la parte después del "DÓNDE" no tiene sentido, pero no tengo idea de cómo crear una consulta que haga lo que quiero.
Entonces, ¿crees que hay una mejor manera de almacenar mis datos o una solución alternativa para hacer una consulta "Y"?
Y, por supuesto, el JSON puede contener cualquier propiedad, por lo que no puedo crear una tabla con columnas para cada propiedad.
Estoy usando WebSQL, que es SQLite sin extensiones.
Sé que mi pregunta es bastante específica, pero ¿podrían ayudarme?
Respuestas:
SQLite 3.9 introdujo una nueva extensión ( JSON1 ) que le permite trabajar fácilmente con datos JSON.
Además, introdujo soporte para índices en expresiones , que (según tengo entendido) también debería permitirle definir índices en sus datos JSON.
fuente
PostgreSQL tiene algunas características agradables para el almacenamiento JSON. Puede seleccionar los valores JSON haciendo
También puede indexar las claves específicas en el objeto JSON si usa el
jsonb
tipo.fuente
Las respuestas existentes para este acuerdo en realidad almacenan los datos del OP como JSON (que puede haber sido una mejor solución a su problema subyacente).
Sin embargo, la pregunta real era cómo encontrar documentos en la tabla de estilo EAV proporcionada, basada en múltiples propiedades. Entonces, quizás una respuesta a esa pregunta sería útil.
La forma estándar de SQL de hacer lo que está diciendo es INTERSECCIÓN.
También puede hacer esto con autouniones si lo prefiere.
Por supuesto, la forma más "correcta" y posiblemente más eficiente sería simplemente hacer una columna para cada propiedad que necesite, como 'id' y 'título'.
fuente