В библиотеке Idb-keyval взаимодействие с IndexedDB реализуется через удобный и минималистичный API, которое позволяет работать с данными в формате ключ–значение. При проектировании структуры хранения данных важно понять различие между использованием одного ключа и множества ключей, поскольку этот выбор напрямую влияет на производительность, простоту кода и масштабируемость приложения.
Использование одного ключа подразумевает хранение всех связанных данных под одним идентификатором. Например, если необходимо сохранять состояние приложения:
import { set, get } from 'idb-keyval';
const appState = {
user: { name: 'Alice', age: 28 },
theme: 'dark',
notifications: true
};
await set('appState', appState);
const state = await get('appState');
console.log(state.theme); // 'dark'
Преимущества такого подхода:
Недостатки:
Подход с множеством ключей подразумевает раздельное хранение каждого элемента данных под своим ключом. Пример:
import { set, get } from 'idb-keyval';
await set('user', { name: 'Alice', age: 28 });
await set('theme', 'dark');
await set('notifications', true);
const user = await get('user');
const theme = await get('theme');
console.log(user.name, theme); // Alice dark
Преимущества такого подхода:
Недостатки:
Promise.all или цепочки
await.userSettings, appPreferences,
sessionData. Это позволяет снизить количество операций при
обновлении каждой группы и при этом сохранить гибкость управления.Для одновременного чтения нескольких ключей удобно использовать
Promise.all:
const keys = ['user', 'theme', 'notifications'];
const [user, theme, notifications] = await Promise.all(keys.map(key => get(key)));
Запись нескольких ключей может быть выполнена параллельно:
const entries = [
['user', { name: 'Bob', age: 35 }],
['theme', 'light'],
['notifications', false]
];
await Promise.all(entries.map(([key, value]) => set(key, value)));
Такой подход повышает производительность и упрощает обработку ошибок — каждая операция выполняется независимо.
| Критерий | Один ключ | Множество ключей |
|---|---|---|
| Обновление данных | Полное обновление объекта | Частичное обновление |
| Количество операций | Меньше операций | Больше операций |
| Производительность | При больших объектах хуже | Более эффективно для мелких данных |
| Целостность | Высокая, атомарная | Требуется контроль синхронизации |
| Сложность кода | Низкая | Выше, нужны промисы или async/await |
Понимание этих различий позволяет проектировать структуры хранения в Idb-keyval, которые оптимальны по скорости, потреблению памяти и удобству дальнейшего сопровождения кода.