Можно ли хранить и запрашивать JSON в SQLite?

35

Мне нужно хранить объекты 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 без расширений.

Я знаю, что мой вопрос довольно конкретный, но не могли бы вы мне помочь?

tuxlu
источник
2
Если это действительно важно для вашего приложения, вам, вероятно, лучше использовать реальное хранилище документов («NoSQL») или, например, переключиться на Postgres, который сочетает в себе очень эффективное хранилище JSON с мощными реляционными функциями.
a_horse_with_no_name
3
Прочитайте документацию .
кл.
@CL. ЮПП. Это также первый результат при поиске "sqlite json" :)
Izzy
Вы должны иметь учетные записи и должны объединить их: dba.stackexchange.com/users/81459/tuxlu и dba.stackexchange.com/users/81513/tuxlu Вы можете использовать эту страницу справки: dba.stackexchange.com/help/merging-accounts
Жюльен Вавассер
@Izzy Прежде всего, по крайней мере, для меня этот вопрос теперь является первым результатом, а не документами. Во-вторых, это расширение не является хорошим ответом для OP, который явно заявил, что использует «WebSQL, то есть SQLite без расширений».
OJFord

Ответы:

35

SQLite 3.9 представил новое расширение ( JSON1 ), которое позволяет легко работать с данными JSON.

Кроме того, он ввел поддержку индексов в выражениях , что (в моем понимании) должно позволить вам также определять индексы для ваших данных JSON.

ThePhysicist
источник
7

PostgreSQL имеет несколько полезных функций для хранения JSON. Вы можете выбрать значения JSON, выполнив

SELECT DISTINCT FROM TABLE WHERE foo->title=test AND id=42

Вы также можете индексировать определенные ключи в объекте JSON, если используете jsonbтип.

redneckProgrammer
источник
5

Существующие ответы на этот вопрос касаются фактического хранения данных OP в формате JSON (что, возможно, было лучшим решением его основной проблемы).

Однако реальный вопрос заключался в том, как найти документы в представленной таблице в стиле EAV на основе нескольких свойств. Так что, возможно, ответ на этот вопрос будет полезен.

Стандартный SQL-способ сделать то, что вы говорите, это пересечение.

(SELECT document FROM table WHERE property="id" AND number=43)
INTERSECTION 
(SELECT document FROM table WHERE property="title" AND string="test")

Вы также можете сделать это с самостоятельными соединениями, если хотите.

SELECT t1.document
FROM table as t1, table as t2
WHERE t1.document = t2.document
AND t1.property="id" AND t1.number=43
AND t2.property="title" AND t2.string="test"

Конечно, более «правильным» и, возможно, наиболее эффективным способом было бы просто создать столбец для каждого нужного вам свойства, например, «id» и «title».

Томас Але
источник