Чи можливо зберігати і запитувати 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 без розширень.

Я знаю, що моє запитання досить конкретне, але ви могли б мені допомогти?


2
Якщо це дійсно важливо для вашої програми, вам, ймовірно, краще скористатися або реальним сховищем документів ("NoSQL"), або, наприклад, перейти на Postgres, який поєднує дуже ефективне зберігання JSON з сильними реляційними функціями.
a_horse_with_no_name

3
Прочитайте документацію .
ЗР.

@CL. Юп. Це також перший результат, коли гугл для "sqlite json" :)
Іззи

Ви повинні мати облікові записи та їх об’єднати: dba.stackexchange.com/users/81459/tuxlu та dba.stackexchange.com/users/81513/tuxlu Ви можете скористатись цією довідковою сторінкою: dba.stackexchange.com/help/merging-accounts
Жульєн Вавассер

@Izzy Перш за все, для мене принаймні це питання є першим результатом, а не документами. По-друге, це розширення не є гарною відповіддю до ОП, який чітко заявив, використовуючи "WebSQL, що є SQLite без розширень".
OJFord

Відповіді:


35

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

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


7

PostgreSQL має деякі приємні функції для зберігання JSON. Ви можете вибрати значення JSON, виконавши

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

Ви також можете проіндексувати конкретні клавіші на об'єкті JSON, якщо використовується jsonbтип.


5

Існуючі відповіді на цю угоду з фактичним зберіганням даних ОП як 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".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.