Muszę przechowywać obiekty JSON w bazie danych SQLite, a następnie wykonywać na nim złożone zapytania.
Zrobiłem taki stół:
+--------------------------------------+
|document | property | string | number|
+--------------------------------------+
|foo | "title" | "test" | |
+--------------------------------------+
|foo | "id" | | 42 |
+--------------------------------------+
|bar | "id" | | 43 |
+--------------------------------------+
dla dwóch obiektów
foo {"title": "test", "id": 42}
bar {id: 43}
Ale nie mogę wykonywać zapytań „ORAZ”, takich jak:
SELECT DISTINCT id FROM table WHERE title = "test" AND id = 42
jak widzisz, część po „GDZIE” to totalny nonsens, ale nie mam pojęcia, jak utworzyć zapytanie, które zrobiłoby to, co chcę.
Czy uważasz, że istnieje lepszy sposób na przechowywanie moich danych lub obejście tego problemu?
I oczywiście JSON może zawierać dowolną właściwość, więc nie mogę utworzyć tabeli z kolumnami dla każdej właściwości.
Używam WebSQL, który jest SQLite bez rozszerzeń.
Wiem, że moje pytanie jest dość konkretne, ale czy mógłbyś mi pomóc?
Odpowiedzi:
SQLite 3.9 wprowadził nowe rozszerzenie ( JSON1 ), które pozwala łatwo pracować z danymi JSON.
Wprowadzono także obsługę indeksów wyrażeń , co (w moim rozumieniu) powinno umożliwić również zdefiniowanie indeksów danych JSON.
źródło
PostgreSQL ma kilka fajnych funkcji do przechowywania JSON. Możesz wybrać wartości JSON wykonując
Możesz także indeksować określone klucze w obiekcie JSON, jeśli używasz tego
jsonb
typu.źródło
Istniejące odpowiedzi na ten temat dotyczą faktycznego przechowywania danych PO jako JSON (co może być lepszym rozwiązaniem jego podstawowego problemu).
Jednak rzeczywistym pytaniem było, jak znaleźć dokumenty w podanej tabeli w stylu EAV, na podstawie wielu właściwości. Być może przydatna byłaby odpowiedź na to pytanie.
Standardowym sposobem wykonywania tego, co mówisz, jest INTERSECTION.
Możesz to również zrobić za pomocą samodzielnego łączenia, jeśli wolisz.
Oczywiście bardziej „poprawnym” i prawdopodobnie najbardziej wydajnym sposobem byłoby po prostu utworzenie kolumny dla każdej potrzebnej właściwości, na przykład „id” i „title”.
źródło