Je dois stocker des objets JSON dans une base de données SQLite, puis effectuer des requêtes complexes à ce sujet.
J'ai fait un tableau comme ça:
+--------------------------------------+
|document | property | string | number|
+--------------------------------------+
|foo | "title" | "test" | |
+--------------------------------------+
|foo | "id" | | 42 |
+--------------------------------------+
|bar | "id" | | 43 |
+--------------------------------------+
pour les deux objets
foo {"title": "test", "id": 42}
bar {id: 43}
Mais je ne peux pas faire de requêtes "ET", comme:
SELECT DISTINCT id FROM table WHERE title = "test" AND id = 42
comme vous le voyez, la partie après "WHERE" est un non-sens total, mais je ne sais pas comment créer une requête qui ferait ce que je veux.
Alors, pensez-vous qu'il existe un meilleur moyen de stocker mes données ou une solution de contournement pour effectuer une requête "AND"?
Et bien sûr, le JSON peut contenir n'importe quelle propriété, je ne peux donc pas créer de table avec des colonnes pour chaque propriété.
J'utilise WebSQL, qui est SQLite sans extensions.
Je sais que ma question est assez précise, mais pourriez-vous m'aider?
Réponses:
SQLite 3.9 a introduit une nouvelle extension ( JSON1 ) qui vous permet de travailler facilement avec des données JSON.
En outre, il introduisait la prise en charge des index sur les expressions , ce qui devrait (selon ma compréhension) également vous permettre de définir des index sur vos données JSON.
la source
PostgreSQL a quelques fonctionnalités intéressantes pour le stockage JSON. Vous pouvez sélectionner les valeurs JSON en faisant
Vous pouvez également indexer les clés spécifiques sur l'objet JSON si vous utilisez le
jsonb
type.la source
Les réponses existantes à ce problème consistent à stocker les données du PO sous forme de JSON (ce qui aurait pu être une meilleure solution à son problème sous-jacent).
Cependant, la vraie question était de savoir comment obtenir des documents trouvés dans la table de style EAV fournie, en fonction de plusieurs propriétés. Alors, peut-être une réponse à cette question serait utile.
INTERSECTION est la méthode standard utilisée par SQL pour faire ce que vous dites.
Vous pouvez également le faire avec des auto-jointes si vous préférez.
Bien sûr, le moyen le plus "correct" et sans doute le plus efficace serait de créer une colonne pour chaque propriété dont vous avez besoin, comme "id" et "titre".
la source