localforage的数据仓库、实例、storeName和name的概念和区别

localForage 中,数据仓库实例storeNamename 是核心概念,用于管理底层存储(IndexedDB/WebSQL/localStorage)。以下是详细解释和区别:


1. 数据仓库 (Database)

  • 定义:指底层的物理数据库(如 IndexedDB 数据库)。
  • 作用:实际存储数据的容器,由浏览器管理。
  • 特点
    • 一个域名下可创建多个数据库(通过不同的 name 区分)。
    • 每个数据库可包含多个 Object Store (通过 storeName 区分)。
  • 示例
    myAppDB 是一个 IndexedDB 数据库。

2. 实例 (Instance)

  • 定义:localForage 创建的独立配置对象,用于操作数据。

  • 作用 :封装数据库的配置和操作方法(如 getItem/setItem)。

  • 特点

    • 通过 createInstance() 创建多个独立实例。
    • 每个实例有独立的配置(namestoreName 等)。
    • 实例间数据隔离(除非使用相同的 namestoreName)。
  • 示例

    javascript 复制代码
    const userStorage = localforage.createInstance({
      name: "myAppDB",
      storeName: "users"
    });

3. name (数据库名称)

  • 定义:数据库的唯一标识。

  • 作用:指定操作哪个底层数据库。

  • 规则

    • 相同 name 的实例共享同一个数据库。
    • 不同 name 的实例访问完全独立的数据库。
  • 示例

    javascript 复制代码
    // 操作数据库 "myAppDB"
    localforage.config({ name: "myAppDB" });

4. storeName (存储仓库名称)

  • 定义 :数据库中的 Object Store(类似数据库表)。

  • 作用:在同一个数据库中隔离不同数据集。

  • 规则

    • 相同数据库(name)下,不同 storeName 的数据互不干扰。
    • 在 IndexedDB 中表现为不同的 Object Store。
  • 示例

    javascript 复制代码
    // 在数据库 "myAppDB" 中创建两个独立仓库
    const config = { name: "myAppDB" };
    const userStore = localforage.createInstance({ ...config, storeName: "users" });
    const productStore = localforage.createInstance({ ...config, storeName: "products" });

概念关系图

plaintext 复制代码
┌───────────────────────┐
│ 数据库 (Database)     │
│ name: "myAppDB"       │
├───────────────────────┤
│   storeName: "users"  │ → userStorage 实例操作的数据
├───────────────────────┤
│   storeName: "products" → productStore 实例操作的数据
└───────────────────────┘

关键区别总结

概念 作用 类比
数据仓库 物理存储容器(IndexedDB 等) 银行的金库
实例 操作数据库的配置对象 银行的不同业务柜台
name 数据库的唯一标识 金库的名称(如"总行")
storeName 数据库中的子存储空间(Object Store) 金库中的保险箱编号

使用场景示例

javascript 复制代码
// 场景:隔离用户数据和系统配置
const userStorage = localforage.createInstance({
  name: "appData",
  storeName: "user" // 存储用户数据
});

const configStorage = localforage.createInstance({
  name: "appData",
  storeName: "config" // 存储配置
});

// 互不影响
userStorage.setItem("name", "Alice"); 
configStorage.setItem("theme", "dark");

通过合理配置 namestoreName,可实现数据的模块化存储,避免命名冲突。