IndexedDB的核心架构由数据库、对象存储空间和事务三层嵌套构成:数据库是带版本控制的顶层容器,对象存储空间是结构化数据的“表”级载体,事务是所有数据操作的强制执行环境。

IndexedDB 的核心架构围绕三个基础组件展开:数据库(Database)、对象存储空间(Object Store)和事务(Transaction)。它们不是并列的工具,而是层层嵌套、职责分明的协作体系——数据库是容器,对象存储空间是数据组织单元,事务是操作执行的唯一上下文。理解这三者的关系,就掌握了 IndexedDB 的运行逻辑。
数据库:带版本控制的顶层容器
数据库是 IndexedDB 的最高层级,代表一个独立的、同源(协议+域名+端口)命名空间。它不直接存数据,只负责管理多个对象存储空间,并通过版本号实现结构演进。
- 用 indexedDB.open(name, version) 打开或创建;若版本号升高,会触发 onupgradeneeded 事件
- onupgradeneeded 是唯一能创建/删除对象存储空间、添加/修改索引的地方;其他时候无法变更数据库结构
- 同一域名下可存在多个数据库(如 userDB、cacheDB),彼此完全隔离
对象存储空间:结构化数据的“表”级载体
对象存储空间(常简称为 object store)是实际存放数据的地方,功能上最接近传统数据库中的“表”,但更灵活。它以键值对形式组织记录,每个记录的值可以是任意可克隆的 JavaScript 对象(含数组、Date、Blob 等)。
- 创建时需指定 keyPath(如 'id')作为主键字段,或启用 autoIncrement: true 让系统自动生成数字键
- 支持为非主键字段建立 索引(如 createIndex('email_idx', 'email')),用于按 email 快速查找,避免全量扫描
- 一个数据库中可包含多个对象存储空间(如 users、posts、settings),各自独立管理
事务:所有数据操作的强制执行环境
IndexedDB 不允许任何裸操作——增、删、改、查都必须包裹在事务中。事务不仅是性能优化手段,更是数据一致性的保障机制。
- 事务类型有三种:readonly(仅查询,性能高)、readwrite(支持写入)、versionchange(仅在升级数据库时由系统自动开启)
- 事务生命周期内,所有操作要么全部成功,要么全部失败(原子性);例如 add + put 组合操作,任一失败则整个回滚
- 事务默认在第一个未完成操作结束后自动关闭;也可显式调用 transaction.abort() 或等待 transaction.oncomplete

















