IndexedDB
IndexedDB — локальная база данных, которая восрана в современные веб-обозреватели.
Описание[править]
До появления IndexedDB веб-разработчики располагали лишь localStorage, sessionStorage и устаревшим Web SQL Database. Последняя работала сравнительно потужно, но была признана тупиковой ветвью развития, поскольку в её основе лежал конкретный продукт SQLite, который мог перестать быть открытым.
Тогда известный разработчик Mozilla восрала Indexed Database API.
IndexedDB является объектно-ориентированной базой данных, организованной по принципу ключ-значение. В отличие от реляционных СУБД, здесь нет таблиц, столбцов и SQL-запросов. Вместо них используются следующие базовые понятия, посредством которых база данных начинает царить.
- База данных — именованный контейнер верхнего уровня, связанный с конкретным источником (origin: схема + домен + порт). Каждый origin может иметь несколько баз данных, каждая из которых имеет имя и версию.
- Объектное хранилище — аналог таблицы в относительных базах. Это именованное хранилище, в котором содержатся записи в виде пар ключ-значение. Значениями могут быть любые объекты, сериализуемые алгоритмом структурированного клонирования.
- Транзакция — атомарная единица работы с базой данных. Все операции чтения и записи выполняются в контексте транзакции.
- Индекс — вспомогательная структура, позволяющая эффективно искать записи по значениям полей, отличных от первичного ключа.
Транзакция в IndexedDB автоматически фиксируется, как только все связанные с ней запросы выполнены и цикл событий возвращается к основному потоку. Это означает, что нельзя открыть транзакцию, выполнить асинхронную операцию (например, fetch), дождаться её завершения, а потом продолжить работу с транзакцией — она к тому моменту уже будет зафиксирована или отброшена.
Использует явное числовое версионирование базы данных. Каждый раз при открытии базы с номером версии, превышающим текущую, срабатывает событие onupgradeneeded. Это единственное место, где можно изменять структуру базы данных. Есть баг, что если в другой вкладке браузера открыто соединение со старой версией базы, событие onblocked на запросе открытия не позволит обновлению произойти до тех пор, пока старое соединение не будет закрыто.