Почему библиотека не поддерживает индексы и курсоры

Библиотека Idb-keyval построена на основе IndexedDB и предоставляет упрощённый API для работы с ключ–значение парами. Основная идея заключается в минимизации сложности взаимодействия с IndexedDB: вместо создания транзакций, объектов хранилищ и обработчиков событий, разработчик получает функции для простого чтения, записи и удаления данных.

Idb-keyval использует единственное хранилище объектов (store) и оперирует исключительно ключами и значениями. Каждый ключ должен быть уникальным, а значение может быть любым сериализуемым объектом. Такая структура делает библиотеку удобной для задач типа сохранения настроек, кеширования данных или хранения небольших коллекций объектов.

Ограничение на использование индексов

В IndexedDB индексы создаются для того, чтобы обеспечить быстрый доступ к данным по вторичному ключу или свойству объекта. В Idb-keyval отсутствует поддержка индексов, что напрямую связано с архитектурной философией библиотеки:

  • Минимализм API. Библиотека ориентирована на максимально простой доступ: один ключ = одно значение. Поддержка индексов требует дополнительной конфигурации хранилища и схемы данных, что противоречит идее лёгкости использования.
  • Единое хранилище. Все данные хранятся в одном объектном хранилище. Для добавления индекса необходимо создавать отдельные хранилища или расширенные структуры, что усложняет внутреннюю логику.
  • Отсутствие сложных транзакций. Индексы в IndexedDB работают через транзакции и курсоры. Поскольку Idb-keyval абстрагирует транзакции, управление индексами стало бы непрозрачным и потенциально источником ошибок.

Следовательно, библиотека ориентирована на сценарии, где доступ по ключу является основным способом извлечения данных. Попытка использовать фильтрацию по значениям или свойствам объектов через индексы невозможна напрямую, вместо этого предлагается извлекать весь набор данных и выполнять фильтрацию на уровне приложения.

Ограничение на использование курсоров

Курсоры в IndexedDB позволяют последовательно обходить записи хранилища с возможностью фильтрации и сортировки. В Idb-keyval нет поддержки курсоров по нескольким причинам:

  • Упрощение интерфейса. Курсоры требуют обработки событий и асинхронного цикла, что добавляет сложность к минималистичному API.
  • Ненужность для типичных кейсов. Для хранения ключ–значение курсор редко необходим, так как операции чтения и записи осуществляются напрямую по ключу.
  • Производительность против абстракции. Использование курсоров подразумевает возможность работы с большими наборами данных. Idb-keyval рассчитана на лёгкие и быстрые операции с небольшими объёмами, где выгрузка всех данных в память для фильтрации не представляет критической проблемы.

Таким образом, курсоры заменены на более простые функции, такие как get(), set(), del() и clear(). Эти методы покрывают большинство практических сценариев без необходимости изучения сложной структуры IndexedDB.

Практические последствия отсутствия индексов и курсоров

Отсутствие поддержки индексов и курсоров накладывает ограничения на архитектуру приложения:

  • Фильтрация данных. Чтобы найти объекты по определённому полю, приходится извлекать все значения и выполнять фильтрацию на уровне JavaScript. Это увеличивает использование памяти и нагрузку на процессор при больших объёмах данных.
  • Сортировка и поиск диапазонов. Такие операции недоступны на уровне базы данных, поэтому сортировка выполняется вручную после получения всех записей.
  • Масштабируемость. Idb-keyval подходит для небольших коллекций и кэшей, но не для сложных систем с тысячами и миллионами записей, где индексы и курсоры необходимы для производительности.

Итоговая архитектурная философия

Библиотека выбирает путь простоты и доступности ценой отказа от более сложных механизмов IndexedDB. Ключевые принципы:

  • один ключ = одно значение;
  • единое хранилище объектов;
  • минимальный API без транзакций, курсоров и индексов;
  • работа преимущественно с небольшими наборами данных.

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