随着前端技术发展的强大,越来越复杂的交互和业务都可以由前端来实现,那么前端就需要面对越来越庞大的数据体。对于这些不变的庞大数据体,就需要通过 IndexDB 来进行存储,从而提升页面渲染速度,减轻服务器端压力
IndexDB的特点
-
非关系型数据库
关系型数据库的主要特点是数据以一张二维表的形式存储,而 IndexDB 是非关系型数据库,主要以键值对的形式存储数据
-
持久化存储
当清除浏览器缓存后,像 Cookie、localStorage、sessionStorage 等方式存储的数据都会被清除掉,而使用 IndexDB 存储的数据则不会被清掉,除非手动删除该数据库
-
异步调用
IndexDB 的相关操作是异步调用的,当存储庞大的数据时,不会因为读写数据慢而导致页面阻塞
-
同源限制
受同源策略限制,只能访问自身域名下的数据库,不能进行跨域访问
-
支持事务
能够确保多个操作只要其中一步出现问题,整个事务就会取消,数据库回滚到事务发生之前的状态,确保数据的一致性
-
存储空间大
提供不少于 250MB 的存储空间,可以存储大量的结构化数据(包括文件/二进制大型对象blobs)
IndexDB包装库(Dexie.js)
-
概览
由于原生
IndexDB的API对开发者来说不够友好,所以我们选用其包装库Dexie.js在项目中使用IndexDB -
创建或获取数据库实例
const db = new Dexie(DBName)如果当前传入的数据库已经存在,则返回已经存在的数据库示例,否则将会新建一个数据库,并返回该数据库的实例
-
定义数据库结构
db.version(0.1).stores({ layerData: 'datasetId' })为了兼容
IE的一个BUG,所以在实际建库的时候版本号都会乘以10,当前设置的是0.1,则实际建库的版本就是1layerData是定义的存储键,其对应的值是定义的字段索引,通过索引可以实现对数据的高性能搜索 -
定义字段的四种索引
索引 说明 主键 索引列表的第一个字段会被当做主键,如果主键前有 ++符号,说明这个字段是自增的唯一索引 如果某个索引字段的值在所有记录中是唯一的,可以在字段前面添加 &号,表示唯一索引多值索引 如果某个字段具有多个值,可以在字段前面加 *号将其设置为多值索引复合索引 如果某个索引是基于多个字段的,就可以将其设置为复杂索引,格式为 [A+B] -
参阅文档