Мне нужно хранить объекты JSON в базе данных SQLite, а затем делать сложные запросы к ней.
Я сделал таблицу, как это:
+--------------------------------------+
|document | property | string | number|
+--------------------------------------+
|foo | "title" | "test" | |
+--------------------------------------+
|foo | "id" | | 42 |
+--------------------------------------+
|bar | "id" | | 43 |
+--------------------------------------+
для двух объектов
foo {"title": "test", "id": 42}
bar {id: 43}
Но я не могу делать запросы "И", например:
SELECT DISTINCT id FROM table WHERE title = "test" AND id = 42
как видите, часть после «ГДЕ» - полная чушь, но я понятия не имею, как создать запрос, который будет делать то, что я хочу.
Как вы думаете, есть ли лучший способ хранения моих данных или обходной путь для выполнения запроса «И»?
И, конечно, JSON может содержать любое свойство, поэтому я не могу создать таблицу со столбцами для каждого свойства.
Я использую WebSQL, который является SQLite без расширений.
Я знаю, что мой вопрос довольно конкретный, но не могли бы вы мне помочь?
Ответы:
SQLite 3.9 представил новое расширение ( JSON1 ), которое позволяет легко работать с данными JSON.
Кроме того, он ввел поддержку индексов в выражениях , что (в моем понимании) должно позволить вам также определять индексы для ваших данных JSON.
источник
PostgreSQL имеет несколько полезных функций для хранения JSON. Вы можете выбрать значения JSON, выполнив
Вы также можете индексировать определенные ключи в объекте JSON, если используете
jsonb
тип.источник
Существующие ответы на этот вопрос касаются фактического хранения данных OP в формате JSON (что, возможно, было лучшим решением его основной проблемы).
Однако реальный вопрос заключался в том, как найти документы в представленной таблице в стиле EAV на основе нескольких свойств. Так что, возможно, ответ на этот вопрос будет полезен.
Стандартный SQL-способ сделать то, что вы говорите, это пересечение.
Вы также можете сделать это с самостоятельными соединениями, если хотите.
Конечно, более «правильным» и, возможно, наиболее эффективным способом было бы просто создать столбец для каждого нужного вам свойства, например, «id» и «title».
источник