Параметр name: имя базы данных

В библиотеке localForage параметр name определяет имя логической базы данных, которая создаётся поверх доступных механизмов хранения браузера: IndexedDB, WebSQL (устаревший) или localStorage. Этот параметр играет ключевую роль в изоляции данных между различными приложениями и их экземплярами, а также влияет на структуру хранилища в IndexedDB.


Роль name в архитектуре localForage

При инициализации localForage создаётся абстракция над нативными API хранения. В случае IndexedDB формируется база данных, внутри которой находятся object store (аналог таблиц).

Параметр name:

  • определяет имя IndexedDB базы данных
  • влияет на namespace хранения данных
  • обеспечивает разделение данных между приложениями
  • используется при создании отдельных экземпляров localForage

Если не задан явно, применяется значение по умолчанию:

localforage.config({
  name: 'localforage'
});

Таким образом, все данные будут помещены в базу с именем localforage.


Поведение в разных драйверах

IndexedDB

В IndexedDB параметр name становится именем базы данных:

localforage.config({
  name: 'myAppDB'
});

Результат в браузере:

  • IndexedDB database name: myAppDB
  • внутри создаются object store (обычно один — keyvaluepairs или заданный storeName)

Это означает, что все ключи и значения будут изолированы внутри этой базы.


WebSQL

В WebSQL name соответствует имени базы данных SQL:

localforage.config({
  name: 'myAppDB'
});

Создаётся SQL-база:

OPEN DATABASE myAppDB;

Хотя WebSQL считается устаревшим стандартом, localForage поддерживает его как fallback.


localStorage

В случае localStorage параметр name не создаёт реальную базу данных, но участвует в формировании ключей:

myAppDB/keyName

Или аналогичный префикс, зависящий от реализации драйвера.


Изоляция данных через name

Одним из ключевых применений name является разделение данных между разными приложениями или модулями.

const appStorage = localforage.createInstance({
  name: 'appStorage'
});

const cacheStorage = localforage.createInstance({
  name: 'cacheStorage'
});

В результате:

  • данные appStorage не пересекаются с cacheStorage
  • создаются разные базы IndexedDB
  • возможно независимое управление жизненным циклом данных

Связь name и storeName

Важно различать два параметра:

  • name — имя базы данных
  • storeName — имя object store внутри базы
localforage.config({
  name: 'myDatabase',
  storeName: 'users'
});

Структура в IndexedDB:

Database: myDatabase
  ObjectStore: users

При этом изменение name создаёт полностью новую базу, а изменение storeName лишь меняет структуру внутри неё.


Влияние на создание нескольких экземпляров

localForage позволяет создавать независимые экземпляры через createInstance. Каждый экземпляр может иметь собственное значение name.

const userDB = localforage.createInstance({
  name: 'userDB'
});

const settingsDB = localforage.createInstance({
  name: 'settingsDB'
});

Каждый экземпляр:

  • открывает отдельную IndexedDB базу
  • использует собственный namespace ключей
  • не разделяет транзакции с другими экземплярами

Поведение при смене name

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

localforage.config({ name: 'db1' });
await localforage.setItem('key', 'value');

localforage.config({ name: 'db2' });
await localforage.getItem('key'); // null

Причина:

  • db1 и db2 — разные IndexedDB базы
  • данные физически разделены

Ограничения и особенности именования

При выборе значения name учитываются ограничения браузерных API:

  • имя должно быть строкой
  • желательно избегать спецсимволов, пробелов и юникода с нестандартной нормализацией
  • рекомендуется использовать стабильные идентификаторы (например, app_name, project_v2)

Примеры корректных значений:

name: 'todoApp'
name: 'analytics_dashboard'
name: 'user_cache_v1'

Поведение при отсутствии name

Если параметр не указан:

localforage.config({});

используется значение по умолчанию:

  • IndexedDB база: localforage
  • WebSQL база: localforage
  • localStorage ключевой namespace: localforage

Это может привести к конфликтам при использовании нескольких независимых модулей в одном origin.


Практическая архитектура с использованием name

Типичный паттерн разделения данных:

const authStorage = localforage.createInstance({
  name: 'authDB',
  storeName: 'auth'
});

const cacheStorage = localforage.createInstance({
  name: 'cacheDB',
  storeName: 'responses'
});

const settingsStorage = localforage.createInstance({
  name: 'settingsDB',
  storeName: 'config'
});

Такое разделение обеспечивает:

  • независимое управление очисткой данных
  • снижение риска конфликтов ключей
  • упрощение миграций структуры хранения

Влияние на производительность и миграции

При смене name браузер:

  • создаёт новую IndexedDB базу при первом обращении
  • не выполняет автоматическую миграцию данных
  • не связывает старые и новые базы

Это означает, что смена имени базы фактически эквивалентна созданию нового хранилища с нуля.


Внутреннее представление в IndexedDB

При использовании name: 'appDB' структура выглядит следующим образом:

IndexedDB
 └── appDB (Database)
      └── keyvaluepairs (Object Store)
           ├── key: "user"
           ├── key: "settings"

При создании другого экземпляра:

IndexedDB
 └── cacheDB (Database)
      └── keyvaluepairs

Каждая база изолирована на уровне браузера.


Использование name в многомодульных приложениях

В архитектуре SPA или микрофронтендов параметр name часто становится инструментом пространственной изоляции:

  • модуль авторизации использует authDB
  • модуль аналитики использует analyticsDB
  • модуль оффлайн-кеша использует offlineDB

Такое разделение предотвращает:

  • коллизии ключей
  • случайное перетирание данных
  • сложность очистки всего хранилища

Итоговая роль параметра в системе хранения

Параметр name формирует верхнеуровневую границу данных в localForage, определяя:

  • физическую базу IndexedDB
  • логический namespace ключей
  • область изоляции данных между экземплярами
  • основу для масштабирования клиентского хранения