TGViewer
SQLite на практике SQLite на практике @sqliter · 2.25K subscribers
Post #76 3.19K
JSON и виртуальные столбцы

Допустим, вы решили вести журнал событий, которые происходят в системе. События бывают разных типов, у каждого свой набор полей. Например, вход в систему:

{
"timestamp": 1652614531,
"object": "user",
"object_id": 11,
"action": "login",
"details": {
"ip": "192.168.0.1"
}
}


Или пополнение счета:

{
"timestamp": 1652614584,
"object": "account",
"object_id": 12,
"action": "deposit",
"details": {
"amount": "1000",
"currency": "USD"
}
}


Вы решаете не заниматься нормализацией по таблицам, а хранить прямо в JSON. Заводите таблицу events с единственным полем value:

select value from events;

{"timestamp":1652614531,...
{"timestamp":1652614584,...
{"timestamp":1652614644,...


И выбираете события по конкретному объекту:

select
json_extract(value, '$.object'),
json_extract(value, '$.action')
from events
where json_extract(value, '$.object_id') = 11;


┌────────┬────────┐
│ object │ action │
├────────┼────────┤
│ user │ login │
└────────┴────────┘


Все здорово, но json_extract() при вызове каждый раз парсит текст, так что на сотне тысяч записей запрос будет работать медленно. Что делать?

Создать виртуальные столбцы:

alter table events
add column object_id integer
as (json_extract(value, '$.object_id'));


Построить индекс:

create index events_object_id on events(object_id);


Теперь запрос работает моментально:

select object, action
from events
where object_id = 11;


Благодаря виртуальным столбцам получилась практически NoSQL база данных ツ

песочница
  • 👍 42
  • 😱 3
  • 🔥 2
  • 🎉 1
More from @sqliter
  1. May 20, 2025fuzzy: Нечеткое сравнение строк в SQLite Расширение nalgeon/fuzzy помогает сравнивать стро…
  2. May 14, 2025fileio: Работа с файлами в SQLite Расширение nalgeon/fileio добавляет в SQLite возможность…
  3. May 10, 2025define: Пользовательские функции в SQLite Как известно, в SQLite нет хранимых процедур. Пр…
  4. May 7, 2025crypto: Хеши, кодирование и декодирование в SQLite Открываю новую серию заметок. В каждом…
  5. Aug 8, 2024Работа с датой и временем в SQLite В sqlite есть встроенные функции для работы с датами, н…
  6. May 8, 2024Современный SQLite: Вычисляемые столбцы Вычисляемые (generated) столбцы рассчитываются на…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →