Ich muss JSON-Objekte in einer SQLite-Datenbank speichern und dann komplexe Abfragen ausführen.
Ich habe einen Tisch wie diesen gemacht:
+--------------------------------------+
|document | property | string | number|
+--------------------------------------+
|foo | "title" | "test" | |
+--------------------------------------+
|foo | "id" | | 42 |
+--------------------------------------+
|bar | "id" | | 43 |
+--------------------------------------+
für die beiden Objekte
foo {"title": "test", "id": 42}
bar {id: 43}
Aber ich kann keine "UND" -Abfragen machen, wie:
SELECT DISTINCT id FROM table WHERE title = "test" AND id = 42
Wie Sie sehen, ist der Teil nach dem "WO" totaler Unsinn, aber ich habe keine Ahnung, wie ich eine Abfrage erstellen soll, die das macht, was ich will.
Gibt es Ihrer Meinung nach eine bessere Möglichkeit, meine Daten zu speichern, oder eine Problemumgehung, um eine UND-Abfrage durchzuführen?
Und natürlich kann der JSON jede Eigenschaft enthalten, daher kann ich nicht für jede Eigenschaft eine Tabelle mit Spalten erstellen.
Ich benutze WebSQL, das SQLite ohne Erweiterungen ist.
Ich weiß, dass meine Frage ziemlich spezifisch ist, aber können Sie mir helfen?
Antworten:
In SQLite 3.9 wurde eine neue Erweiterung ( JSON1 ) eingeführt, mit der Sie problemlos mit JSON-Daten arbeiten können.
Außerdem wurde die Unterstützung von Indizes für Ausdrücke eingeführt , mit denen Sie (nach meinem Verständnis) auch Indizes für Ihre JSON-Daten definieren können.
quelle
PostgreSQL bietet einige nützliche Funktionen für den JSON-Speicher. Sie können die JSON-Werte auf diese Weise auswählen
Sie können auch die spezifischen Schlüssel für das JSON-Objekt indizieren, wenn Sie den
jsonb
Typ verwenden.quelle
Die vorhandenen Antworten zu diesem Thema beziehen sich auf das Speichern der OP-Daten als JSON (was möglicherweise eine bessere Lösung für sein zugrunde liegendes Problem war).
Die eigentliche Frage war jedoch, wie auf der Grundlage mehrerer Eigenschaften Suchdokumente in der bereitgestellten EAV-Tabelle abgerufen werden können. Vielleicht wäre eine Antwort auf diese Frage nützlich.
Die Standard-SQL-Methode für das, was Sie sagen, ist INTERSECTION.
Sie können dies auch mit Self Joins tun, wenn Sie dies vorziehen.
Die "korrektere" und wohl effizienteste Methode wäre natürlich, einfach eine Spalte für jede Eigenschaft zu erstellen, die Sie benötigen, z. B. "id" und "title".
quelle