Составные ключи через разделители

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


Основы составных ключей

Составной ключ представляет собой строку, объединяющую несколько частей с помощью определённого разделителя. Чаще всего используется символ : или /, хотя библиотека не накладывает ограничений на выбор разделителя. Пример:

import { set, get } from 'idb-keyval';

const key = 'user:123:settings:theme';
await set(key, 'dark');

const theme = await get('user:123:settings:theme');
console.log(theme); // 'dark'

Здесь ключ 'user:123:settings:theme' состоит из четырёх сегментов:

  1. user — категория.
  2. 123 — идентификатор пользователя.
  3. settings — подкатегория.
  4. theme — конкретный параметр.

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


Преимущества использования разделителей

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

Создание и использование функций для генерации ключей

Для упрощения работы с составными ключами удобно создавать универсальные функции:

function makeKey(...segments) {
  return segments.join(':');
}

// Использование
const userThemeKey = makeKey('user', '123', 'settings', 'theme');
await set(userThemeKey, 'light');

const theme = await get(userThemeKey);
console.log(theme); // 'light'

Функция makeKey обеспечивает единообразие формирования ключей и уменьшает риск ошибок при ручной сборке строк.


Чтение данных по префиксу

Idb-keyval не поддерживает нативные запросы по шаблону ключей, но можно реализовать обход всех ключей через IDBKeyVal.keys():

import { keys, get } from 'idb-keyval';

async function getByPrefix(prefix) {
  const allKeys = await keys();
  const matchedKeys = allKeys.filter(key => key.startsWith(prefix));
  const results = {};
  for (const key of matchedKeys) {
    results[key] = await get(key);
  }
  return results;
}

// Пример
const userSettings = await getByPrefix('user:123:settings');
console.log(userSettings);

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


Вложенные объекты через ключи

Использование составных ключей позволяет хранить данные, которые по своей сути являются вложенными объектами:

await set(makeKey('user', '123', 'profile', 'name'), 'Алексей');
await set(makeKey('user', '123', 'profile', 'age'), 30);

const name = await get(makeKey('user', '123', 'profile', 'name'));
const age = await get(makeKey('user', '123', 'profile', 'age'));
console.log({ name, age }); // { name: 'Алексей', age: 30 }

При необходимости можно динамически формировать ключи на основе данных или схемы объекта.


Стратегии разделителей

Выбор разделителя зависит от особенностей проекта:

  • : — привычный и читаемый для большинства случаев.
  • / — подходит, если данные предполагается синхронизировать с URL или путями файловой системы.
  • . — часто используется для отображения вложенных объектов (user.123.settings.theme).

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


Вывод

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