relational-indexdb组件开源npm已发布

144 阅读11分钟

relational-indexdb已发布npm开源仓库

阿勇的relational-indexdb已发布npm开源仓库,欢迎大家使用哟,源码地址放在了GitHub 别忘了点颗✨✨ 谢谢大家 github.com/AyongNice/r…

下载安装

yarn add relational-indexdb

关注微信公众号: 阿勇学前端

关注抖音: 阿勇学前端

个人搭建chatGpt网站 ayongnice.love/chatgpt/

IndexedDB:
  • IndexedDB 是一种客户端存储技术 非关系型数据库,用于在 Web 浏览器中存储和检索大量结构化数据。
  • 它提供了一个类似关系型数据库的API,但是数据存储在浏览器中而不是远程服务器上。
  • IndexedDB 使用对象存储空间来存储和检索数据,类似于关系型数据库的表。
  • 它支持复杂的查询和索引,以及事务操作。
  • IndexedDB 在 Web 应用程序中广泛用于离线数据存储、缓存数据和本地数据持久化等场景。
  • 虽然index DB是非关系型数据库 但是Ayong为大家封装好了各种方法(updateDataByCursor、queryDataByCursor、deleteDataByCursor) 可以到达关系型数据库 那样的操作效果所以财位组件名字命名为relational-indexdb

当谈到数据库时,有两种主要类型:关系型数据库和非关系型数据库。下面是对它们以及 IndexedDB 的简要介绍:

  1. 关系型数据库:

    • 关系型数据库使用表格结构来组织和存储数据。
    • 数据以行和列的形式存储在表中,其中每行表示一个记录,每列表示一个属性或字段。
    • 数据之间通过关系(主键和外键)建立关联。
    • 常见的关系型数据库有 MySQL、Oracle、SQL Server 和 PostgreSQL。
  2. 非关系型数据库(NoSQL):

    • 非关系型数据库采用不同的数据模型,如键值对、文档、列族和图形等。
    • 它们通常更灵活,适用于处理大量非结构化和半结构化数据。
    • 没有固定的表格结构,允许动态添加或删除字段。
    • 常见的非关系型数据库有 MongoDB、Cassandra、Redis 和 Elasticsearch。

我们打开浏览器index DB的数据将存储这里

image.png

使用说明下面给大家说下所有方法的使用方法

RelationalIndexDB构造函数
参数类型描述
databaseNamestring数据库名称
versionnumber数据库版本号
tableNamestring表名
keyPathstring主键
autoIncrementboolean是否自增
indexConfigsIndexConfigs[]索引配置
IndexConfigs 表配置字段结介绍
字段类型描述
namestring索引名称,用于标识该索引在对象存储空间中的唯一性
keyPathstring索引字段的路径,指定要索引的属性或键路径
uniqueboolean指示索引的值是否唯一,默认为false
const tableName = 'myTable';
const version = 1;
const keyPath = 'id';
const tableSchema = [
    {name: 'id', keyPath: 'id', unique: true},
    {name: 'issue', keyPath: 'issue', unique: false},
    {name: 'answer', keyPath: 'answer', unique: false},
];
//在new RelationalIndexDB 示例时候将会创建一个数据表
const indexDB = new RelationalIndexDB('ayong', 1, tableName, keyPath, true, tableSchema);

名次解释

主键

主键(Primary Key)是数据库表中用于唯一标识每个记录的一列或一组列。主键的作用是确保表中的每个记录都具有唯一的标识,以便进行准确的数据检索、更新和删除操作。

主键具有以下特点:

  1. 唯一性:主键的值在整个表中必须是唯一的,每个记录都必须具有不同的主键值。
  2. 非空性:主键的值不能为空,每个记录都必须具有非空的主键值。
  3. 不可更改性:主键值一旦确定,就不能更改。

主键的作用是:

  1. 唯一标识记录:通过主键,可以唯一地标识和区分表中的每个记录。
  2. 数据索引:主键通常会自动创建索引,加快数据的检索速度。
  3. 数据完整性:主键约束可以确保数据的完整性,防止插入重复的记录。

在关系型数据库中,主键可以由单个列或多个列组成。如果是由多个列组成的主键,称为复合主键。主键的选择应该具备唯一性和稳定性,通常使用自增长整数(例如自增ID)作为主键,以确保每个记录都具有唯一的标识。

总之,主键是数据库表中用于唯一标识每个记录的列或列组合。它确保了数据的唯一性和完整性,并提供了数据检索和操作的基础。

主键自增autoIncrement 可能没有写过使用过mysql的前端小伙伴有点陌生

在 IndexedDB 中,autoIncrement 是一个用于指示是否自动递增主键值的属性。当你创建一个存储空间(表)时,可以为其中的主键字段设置 autoIncrement 为 true。

当 autoIncrement 设置为 true 时,IndexedDB 将自动为每个新插入的记录分配一个唯一的递增主键值。每次插入记录时,如果没有显式指定主键值,系统会自动分配一个比上一个插入的记录的主键值更大的值。

这个自增主键值对于确保每个记录都具有唯一标识非常有用,并且可以方便地进行排序和检索。当你需要为每个记录分配唯一的标识符,但又不想手动管理主键值时,autoIncrement 是一个很好的选择。

需要注意的是,autoIncrement 只能应用于主键字段,而且在同一个存储空间中只能有一个字段设置为 autoIncrement。如果你尝试为多个字段设置 autoIncrement,或者将其应用于非主键字段,将会引发错误。

总之,autoIncrement 是 IndexedDB 中的一个属性,用于指示是否自动递增主键值。它简化了记录的唯一标识的分配过程,并提供了便利的排序和检索功能。

索引 indexConfigs数据表字段配置中unique字段解释

在 IndexConfigs 中,unique 是一个用于指示索引是否具有唯一性约束的属性。当你在 IndexedDB 中创建一个索引时,可以为该索引的字段设置 unique 属性。

当 unique 设置为 true 时,IndexedDB 将确保索引中的每个值都是唯一的,即不会有重复的值。如果尝试插入具有重复索引值的记录,将会引发错误。

唯一性约束对于确保数据的一致性和避免重复数据非常有用。它可以防止意外地插入重复的数据,并且在需要按照索引进行查询时提供更高的性能。

需要注意的是,unique 属性只能应用于索引字段,而且在同一个存储空间中可以有多个字段具有唯一索引。这意味着可以为多个字段创建独立的唯一性约束。

总之,unique 是 IndexConfigs 中的一个属性,用于指示索引是否具有唯一性约束。它可以防止插入重复的数据,并提供高效的索引查询功能。

方法methds ⚠️ 所有方法返回值都是proms

createTable(tableName, version, keyPath, autoIncrement, indexConfigs)

新增/创建表。

参数类型描述
tableNamestring表名
versionnumber版本号
keyPathstring主键
autoIncrementboolean是否自增
indexConfigsIndexConfigs[]索引配置

createTable使用代码示例

image.png

创建表时候有个特别要注意的地方这也是indexDB要注意的地方 每一次新增一个数据表都要给数据升级一个版本,例如截图我当前数据库有6个表 版本肯定是大于等于6的
const tableName = 'ayongmyTable';
const version = 1;
const keyPath = 'id';
const tableSchema = [
  {name: 'id', keyPath: 'id', unique: true},
  {name: 'issue', keyPath: 'issue', unique: false},
  {name: 'answer', keyPath: 'answer', unique: false},
];
//在new RelationalIndexDB 示例时候将会创建一个数据表
const indexDB = new RelationalIndexDB('ayong'1, tableName, keyPath, true, tableSchema);


//我们先要在增加一个表就这样使用必须给数据库升级一个版本

const tableName2 = 'ayongmyTable';
const version2 = 2;
const keyPath2 = 'id';
const tableSchema2 = [
  {name: 'id', keyPath: 'id', unique: true},
  {name: 'issue', keyPath: 'issue', unique: false},
  {name: 'answer', keyPath: 'answer', unique: false},


];

indexDB.createTable(tableName2,keyPath2,true,tableSchema2);

addRecord(key)

添加数据

参数类型描述
tableNamestring表名
dataObject存储数据:数据结构要与表结构相对应,主键不能重复
​
indexDB.addRecord('myTable', { id: '123', useName: 'John Doe', title: '阿勇学前端', level: 100 });
​

queryRecord(tableName,key)

根据主键查询数据

参数类型描述
tableNamestring表名
keystring主键值
indexDB.deleteRecord('myTable', '123');

deleteRecord(tableName, key)

删除记录。

参数类型描述
tableNamestring表名
keyany主键值
//删除主键 为123 的那条数据
indexDB.updateRecord('myTable', '123');

updateRecord(tableName, key, newData)

更新数据。

参数类型描述
tableNamestring表名
keyany主键值
newDataany新数据对象:要修改的具体字段会与老数据覆盖相同的ke y
/**
*这示例将会更新myTable表中 主键为 123。这条数据中 表字段 name 修改为 John Smith,更改哪个字段就写入哪个字段的新值就可以了
 类似于mysql中的s q l语句  但是要注意 index DB不能执行s q l 他是非关系型数据库
 UPDATE myTable SET name = 'John Smith' WHERE id = 123;
​
*/
indexDB.updateRecord('myTable', '123', { name: 'John Smith' });

batchUpdateRecords(tableName, updatesToUpdate)

参数类型描述
tableNamestring表名
updatesToUpdateupdatesToUpdate[]要批量修改的列表数组字段详情见下方

updatesToUpdate[] 批量修改的列表数组字段详情

参数类型描述
keyPathValuestring要修改的主键值
dataObject要修改的字段
/**
* 批量更新跟updateRecord 一样 不同的是更新多条
*
**/
indexDB.batchUpdateRecords("myTable", [{
    keyPathValue: 1688291753347,
    data: {
        id: 1688291753347,
        name: 'ayong---6666'
    }
},
    {
        keyPathValue: 1688291767078,
        data: {
            id: 1688291767078,
            title: '阿勇学前端'
        }
    }
])

batchDeleteRecords(tableName, keysToDelete)

批量删除数据。

参数类型描述
tableNamestring表名
keysToDeleteany[]需要删除的主键值数组
const keys = ['123', '456'];
indexDB.batchDeleteRecords('myTable', keys);

deleteTable(tableName)

删除表。

参数类型描述
tableNamestring表名
indexDB.deleteTable('myTable');

queryRecordsInRange(tableName, indexName, start, end)

范围查询记录。

类型描述
tableNamestring表名
indexNamestring索引名
startany范围起始值
endany范围结束值
 //查询主键为id 值在1——20 之间的数据
indexDB.queryRecordsInRange('myTable', 'id', 1, 10).then((record) => {
      console.log('Record-----:', record);
  })

deleteRecordsInRange(tableName, indexName, start, end)

参数类型描述
tableNamestring表名
indexNamestring索引名
startany范围起始值
endany范围结束值
 //删除主键为id 值在1——20 之间的数据
indexDB.deleteRecordsInRange('myTable', 'id', 1, 10).then((record) => {
      console.log('Record-----:', record);
  })

范围修改记录。

参数类型描述
tableNamestring表名
indexNamestring索引名
startany范围起始值
endany范围结束值
newDataany要更新的新数据

deleteDataByCursor(tableName: string, condition: object): Promise

参数类型描述
tableNamestring表名
conditionobject删除的条件对象
/**
这个方法就是筛选符合条件数据 将这条数据删除
* 删除title = 无意义内卷   id:'123 的这条数据 就是符合多条件筛选条件 并操作这条数据
与之前的范围修改数据deleteRecordsInRange  batchDeleteRecords 不同的是他们都是以主键为筛选条件操作数据
这个方法可以提供给你可以任意以表结构中筛选任意字段 符合条件后操作数据 
它类似于mysql中 s q l 语句 DELETE FROM myTable WHERE title = '无意义内卷' AND id = '123';
​
*
**/
indexDB.deleteDataByCursor('myTable', { title: '无意义内卷',id:'123' })
  .then(() => {
    console.log('数据删除成功');
  })
  .catch((error) => {
    console.log('删除数据时发生错误:', error);
  });
​

updateDataByCursor

该方法用于通过游标更新符合条件的数据。

参数类型描述
tableNamestring表名
conditionobject更新的条件对象
updateDataobject更新的数据对象
​
/**
*如果更改的数据字段中有主键 例如这个表中的主键是id。那你的id 不能跟被的数据重复
它类似于s q l中的
UPDATE myTable SET title = '我要加油', id = '1231231' WHERE title = '无意义内卷' AND id = '123';
​
**/
indexDB.updateDataByCursor('myTable', { title: '无意义内卷',id:'123' }, { title: '我要加油',id:'1231231' })
  .then(() => {
    console.log('数据更新成功');
  })
  .catch((error) => {
    console.log('更新数据时发生错误:', error);
  });
​

queryDataByCursor

该方法用于通过游标查询符合条件的数据。

参数类型描述
tableNamestring表名
conditionobject查询的条件对象
/**
根据表中多个字段查询数据 ;查询title = '无意义内卷'并且id = '123' 的数据 
它类似于s q l中的
SELECT * FROM myTable WHERE title = '无意义内卷' AND id = '123';
**/
indexDB.queryDataByCursor('myTable', { age: 30 })
  .then((results) => {
    console.log('查询到的数据:', results);
  })
  .catch((error) => {
    console.log('查询数据时发生错误:', error);
  });
​

clearTable(tableName)

参数类型描述
tableNamestring表名
indexDB.clearTable('myTable');

deleteDatabase()

删除数据库。

indexDB.deleteDatabase();

关注微信公众号: 阿勇学前端

关注抖音: 阿勇学前端

个人搭建chatGpt网站 ayongnice.love/chatgpt/

每天分享前端有趣的技术