1、关系型数据库和非关系型数据库

一致性: 事务完成时,必须让所有的数据具有一致的状态,例如要写入100个数据,前99个成功了,结果第100个不合法,此时事务会回滚到最初状态。这样保证事务结束和开始时候的存储数据处于一致状态。

关系型数据库: 一致性要求高,读写性能低,使用通用sql

非关系型数据库:灵活,key-value的形式,读写性能好,数据结构不固定

2、事务,ACID特性

事务:指对数据库一个序列上的操作,比如先执行插入,再执行更改,两个操作按顺序执行, 要么都执行,要么都不执行。

ACID特性:

原子性(Atomicity):事务中的所有操作作为一个整体提交或回滚。

一致性(Consistemcy):事物完成时,数据必须是一致的,以保证数据的无损。

隔离性(Isolation):对数据进行修改的多个事务是彼此隔离的。

持久性(Durability):事务完成之后,它对于系统的影响是永久的,该修改即使出现系统故障也将一直保留。

3、数据库中的游标

是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力(向后或向前浏览数据,结果集可以是表,也可以是索引)

4、数据库中锁机制的概念

执行多线程时强制限制资源访问, 比如两个用户同时对数据库进行更改操作,到底是该执行谁的命令,这时候就有锁的概念.

5、索引

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。(在数据库中按照某个字段(或多个)按值排序的一种结构,然后按值查找,主要能实现快速查找和定位)

开始学习indexDB

1、indexDB的诞生:

IndexedDB 就是浏览器提供的本地非关系型数据库,它可以被网页脚本创建和操作,允许存储大量数据,提供查找和建立索引等功能

2、indexDB的特点

1、非关系型数据库(NoSQL)

2、key-value形式存储

3、异步 注意localStorage是同步的

4、支持事务,索引、游标

5、同源限制

6、存储空间大 250M+

7、支持存储二进制

8、提供查找接口和能够建立索引

同源 异步 支持事务 、索引...

3、基本概念

1、数据库

2、对象仓库 相当于关系型数据库中的表

3、数据记录 相当于表中的每一条记录

4、索引 为了加速数据的检索,可以在对象仓库里面,为不同的属性建立索引。

5、事务

4、基本使用

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
#btn,#update,#get{
line-height: 30px;
font-size: 16px;
color: #fff;
background-color: blue;
padding: 0 30px;
}
</style>
</head>
<body>
<button id="btn">添加数据</button>
<button id="update">更新数据</button>
<button id="get">获取数据</button>
<script>
//异步的处理方式是回调,可以用promise改写,也可以写一个发布订阅模式
var indexDB = {
db: null,
dbName: "",
objectStoreList: [],
init: function (dbName, objectStoreList) {
this.dbName = dbName;
this.objectStoreList = objectStoreList.slice(0);
this.openDB(dbName);
},
openDB: function (name, version) {
var _this = this;
version = version ? version : 1;//version不能为0
var request = window.indexedDB.open(name, version);
request.onerror = function (e) {
console.log(e.currentTarget.error.message);
}
request.onsuccess = function (e) {
_this.db = e.target.result;
console.log("DB " + name + " created");
}
request.onupgradeneeded = function (e) {
//创建objectStore(也就是表)
var db = e.target.result;
if (_this.objectStoreList.length != 0){
for(var i = 0; i < _this.objectStoreList.length; i++){
var item = _this.objectStoreList[i];
if (!db.objectStoreNames.contains(item.name)) {
//keyPath 键值 (也就是用哪一个字段做键)
var store = db.createObjectStore(item.name, { keyPath: item.keyPath });
//建立索引
if (item.index && item.index.length !== 0){
for (var j = 0; j < item.index.length; j++){
var innerItem = item.index[j];
console.log(innerItem);
store.createIndex(innerItem.name, innerItem.key, innerItem.property);
}
}
}
}
} console.log('DB version changed to ' + version);
}
},
closeDB: function () {
if (this.db){
this.db.close();
}
},
deleteDB: function (){
if (this.dbName){
window.indexedDB.deleteDatabase(this.dbName);
}
else{
console.log("no such DB");
} },
//清除某个objectStore的数据
clearObjectStore: function(storeName) {
var transaction = this.db.transaction(storeName, 'readwrite');
var store = transaction.objectStore(storeName);
store.clear();
},
deleteObjectStore: function (storeName){
if (db.objectStoreNames.contains(storeName)) {
db.deleteObjectStore(storeName);
}
},
//以下方法为对数据的增删改查
addData: function (storeName, data) {
if (!Array.isArray(data)){
console.error("data must be array");
return;
}
//添加数据需要用到事务
var transaction = this.db.transaction(storeName, 'readwrite');
var store = transaction.objectStore(storeName);
for (var i = 0; i < data.length; i++) {
store.add(data[i]);
}
console.log("inserted!");
},
getDataByKey: function(storeName, key, callback) {
var transaction = this.db.transaction(storeName, 'readwrite');
var store = transaction.objectStore(storeName);
var request = store.get(key);
var _this = this;
request.onsuccess = function (e) {
var result = e.target.result;
if (typeof callback === "function"){
callback.call(_this, result);
}
};
},
updateDataByKey: function(storeName, key, data) {
var transaction = this.db.transaction(storeName, 'readwrite');
var store = transaction.objectStore(storeName);
var _this = this;
var request = store.get(key);
var _this = this;
request.onsuccess = function (e) {
var result = e.target.result;
result = Object.assign(result, data);
store.put(result);
}
console.log("updated!");
},
deleteDataByKey: function (storeName, key) {
var transaction = this.db.transaction(storeName, 'readwrite');
var store = transaction.objectStore(storeName);
store.delete(key);
},
//关于索引和游标的使用,需要在建表的时候建立索引
//下面利用index获取数据
//参数: objectStore indexName value(要查找的值) callback
getDataByIndex: function (storeName, indexName, value, callback) {
var transaction = this.db.transaction(storeName);
var store = transaction.objectStore(storeName);
var index = store.index(indexName);
var _this = this;
index.get(value).onsuccess = function (e) {
var result = e.target.result;
if (typeof callback === "function"){
callback.call(_this, result);
}
}
},
//利用游标遍历
getMultipleDataByIndex(storeName, indexName, value, callback) {
var transaction = this.db.transaction(storeName);
var store = transaction.objectStore(storeName);
var index = store.index(indexName);
var request = index.openCursor(IDBKeyRange.only(value))
var values = [], _this = this;
request.onsuccess = function (e) {
var cursor = e.target.result;
if (cursor) {
var value = cursor.value;
//这里是遍历体
values.push(value);
cursor.continue();
}
else{
if (typeof callback === "function") {
callback.call(_this, values);
}
}
}
}
} var btn = document.getElementById("btn");
indexDB.init("testDB", [
{
name: "students",
keyPath: "id",
//索引信息
index: [
{name: "nameIndex", key: "name", property: {unique: true}},
{ name: "ageIndex", key: "age", property: { unique: false}}
] },
{
name: "employees",
keyPath: "id",
} ]);//创建一个数据库和多张objectStore(表)。 //添加数据
btn.onclick = function (e) {
var students = [{
id: 1001,
name: "Byron",
age: 24
}, {
id: 1002,
name: "Frank",
age: 30
}, {
id: 1003,
name: "Aaron",
age: 26
}, {
id: 1004,
name: "Aaron2",
age: 26
}];
indexDB.addData("students", students); }
document.getElementById("get").onclick = function (e) {
indexDB.getDataByKey("students", 1001, function (result) {
// console.log(this.db); this指向indexDB
console.log(result);
}); //通过索引拿数据
//在 索引名为 nameIndex中寻找 "Frank"
//参数: objectStore indexName value(要查找的值) callback
indexDB.getDataByIndex("students", "nameIndex", "Frank", function (result) {
console.log(result);
}) //游标遍历索引
indexDB.getMultipleDataByIndex("students", "ageIndex", 26, function (result) {
//这里可以获取两条数据
console.log(result);
})
}
document.getElementById("update").onclick = function (e) {
indexDB.updateDataByKey("students", 1001, {age: 19});
indexDB.deleteDataByKey("students", 1003);
}
</script>
</body>
</html>

应用场景

前端处理大量结构化的数据

html5中的indexDB的更多相关文章

  1. HTML5中的Web Workers

    https://www.cnblogs.com/yanan-boke/p/6954390.html https://segmentfault.com/a/1190000014938305 HTML5 ...

  2. html5中canvas的使用 获取鼠标点击页面上某点的RGB

    1.html5中的canvas在IE9中可以跑起来.在IE8则跑不起来,这时候就需要一些东西了. 我推荐这种方法,这样显得代码不乱. <!--[if lt IE9]> <script ...

  3. html5中新增的form表单属性

    html5中新增两个表单属性,分别autocomplete和novalidate属性 1.autocomplete属性 该属性用于控制自动完成功能的开启和关闭.可以设置表单或者input元素,有两个属 ...

  4. HTML5 中的 canvas 画布(一)

    ---恢复内容开始--- 在HTML5中新添加的元素,canvas 现在支持 IE9+的版本 注意:HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript ...

  5. HTML5中引入的关键特性

    新特性 描述 accesskey 定义通过键盘访问元素的快捷键 contenteditable 该特性设置为true时,浏览器应该允许用户编辑元素的内容.不指定变化后的内容如何保存 contextme ...

  6. HTML5中与页面显示相关的API

    1.HTML5中与页面显示相关的API 在HTML5中,增加了几个与页面显示相关的API,其中一个是Page Visibility API Page Visibility API  是指当页面变为最小 ...

  7. HTML5 中的新属性autocomplete="off"失效的解决方法(兼容firefox,IE,360)

    因为业务需求,在写一个注册页面的时候,发现浏览器会自动填充此域名下已经保存的账号密码,给用户带来不便.加了HTML5 中的新属性autocomplete="off" ,但是并没有产 ...

  8. HTML5中新添加事件

    HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...

  9. HTML5中id可以用数字开头,但在css中不能正常使用

    昨晚在看<响应式Web设计:html5和css3实战>时,书中提到“HTML5中的ID指可以用数字开头”.这个还真不知道,于是测试了一下,发现了问题. 在H5描述中是这样说的: 在css样 ...

随机推荐

  1. vue.js中的全局组件和局部组件

    组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能. 组件的使用有三 ...

  2. AUTOSAR的前期开源实现Arctic Core

    AUTOSAR (AUTomotive Open System ARchitecture) is a worldwide development partnership of vehicle manu ...

  3. python爬虫入门(六) Scrapy框架之原理介绍

    Scrapy框架 Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬 ...

  4. js万年历,麻雀虽小五脏俱全,由原生js编写

    对于前端来说,我们可能见到最多的就是各种各样的框架,各种各样的插件了,有各种各样的功能,比如轮播啊,日历啊,给我们提供了很大的方便,但是呢?我们在用别人这些写好的插件,框架的时候,有没有试着问一问自己 ...

  5. AspectJ切入点语法详解

    在看这篇文章前,建议首先看下 spring aop与aspectj的区别 aop是对oop的补充. 参阅:https://blog.csdn.net/column/details/aspectj.ht ...

  6. 由于github仓库中提前建立readme文件,导致git push报错error: failed to push some refs to 'git@github.com:

    $ git push -u origin master To git@github.com:xxx/xxx.git ! [rejected] master -> master (fetch fi ...

  7. Spring Cloud分布式微服务系统中利用redssion实现分布式锁

    在非分布式系统中要实现锁的机制很简单,利用java.util.concurrent.locks包下的Lock和关键字synchronized都可以实现.但是在分布式系统中,如何实现各个单独的微服务需要 ...

  8. 搭建微信小程序服务

    准备域名和证书 任务时间:20min ~ 40min 小程序后台服务需要通过 HTTPS 访问,在实验开始之前,我们要准备域名和 SSL 证书. 域名注册 如果您还没有域名,可以在腾讯云上选购,过程可 ...

  9. TGI

    淘宝的很多分析会用到TGI这个指标,但是是如何计算的以及该如何理解和应用这个指标?TGI:即Target Group Index(目标群体指数)TGI指数= [目标群体中具有某一特征的群体所占比例/总 ...

  10. Javascript继承,再谈

    说到Javascript的继承,相信只要是前端开发者都有所了解或应用,因为这是太基础的知识了.但不知各位有没有深入去理解其中的玄机与奥秘.今本人不才,但也想用自己的理解来说一说这其中的玄机和奥秘. 一 ...