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、基本使用

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <style>
  9. *{
  10. margin: 0;
  11. padding: 0;
  12. }
  13. #btn,#update,#get{
  14. line-height: 30px;
  15. font-size: 16px;
  16. color: #fff;
  17. background-color: blue;
  18. padding: 0 30px;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <button id="btn">添加数据</button>
  24. <button id="update">更新数据</button>
  25. <button id="get">获取数据</button>
  26. <script>
  27. //异步的处理方式是回调,可以用promise改写,也可以写一个发布订阅模式
  28. var indexDB = {
  29. db: null,
  30. dbName: "",
  31. objectStoreList: [],
  32. init: function (dbName, objectStoreList) {
  33. this.dbName = dbName;
  34. this.objectStoreList = objectStoreList.slice(0);
  35. this.openDB(dbName);
  36. },
  37. openDB: function (name, version) {
  38. var _this = this;
  39. version = version ? version : 1;//version不能为0
  40. var request = window.indexedDB.open(name, version);
  41. request.onerror = function (e) {
  42. console.log(e.currentTarget.error.message);
  43. }
  44. request.onsuccess = function (e) {
  45. _this.db = e.target.result;
  46. console.log("DB " + name + " created");
  47. }
  48. request.onupgradeneeded = function (e) {
  49. //创建objectStore(也就是表)
  50. var db = e.target.result;
  51. if (_this.objectStoreList.length != 0){
  52. for(var i = 0; i < _this.objectStoreList.length; i++){
  53. var item = _this.objectStoreList[i];
  54. if (!db.objectStoreNames.contains(item.name)) {
  55. //keyPath 键值 (也就是用哪一个字段做键)
  56. var store = db.createObjectStore(item.name, { keyPath: item.keyPath });
  57. //建立索引
  58. if (item.index && item.index.length !== 0){
  59. for (var j = 0; j < item.index.length; j++){
  60. var innerItem = item.index[j];
  61. console.log(innerItem);
  62. store.createIndex(innerItem.name, innerItem.key, innerItem.property);
  63. }
  64. }
  65. }
  66. }
  67. }
  68. console.log('DB version changed to ' + version);
  69. }
  70. },
  71. closeDB: function () {
  72. if (this.db){
  73. this.db.close();
  74. }
  75. },
  76. deleteDB: function (){
  77. if (this.dbName){
  78. window.indexedDB.deleteDatabase(this.dbName);
  79. }
  80. else{
  81. console.log("no such DB");
  82. }
  83. },
  84. //清除某个objectStore的数据
  85. clearObjectStore: function(storeName) {
  86. var transaction = this.db.transaction(storeName, 'readwrite');
  87. var store = transaction.objectStore(storeName);
  88. store.clear();
  89. },
  90. deleteObjectStore: function (storeName){
  91. if (db.objectStoreNames.contains(storeName)) {
  92. db.deleteObjectStore(storeName);
  93. }
  94. },
  95. //以下方法为对数据的增删改查
  96. addData: function (storeName, data) {
  97. if (!Array.isArray(data)){
  98. console.error("data must be array");
  99. return;
  100. }
  101. //添加数据需要用到事务
  102. var transaction = this.db.transaction(storeName, 'readwrite');
  103. var store = transaction.objectStore(storeName);
  104. for (var i = 0; i < data.length; i++) {
  105. store.add(data[i]);
  106. }
  107. console.log("inserted!");
  108. },
  109. getDataByKey: function(storeName, key, callback) {
  110. var transaction = this.db.transaction(storeName, 'readwrite');
  111. var store = transaction.objectStore(storeName);
  112. var request = store.get(key);
  113. var _this = this;
  114. request.onsuccess = function (e) {
  115. var result = e.target.result;
  116. if (typeof callback === "function"){
  117. callback.call(_this, result);
  118. }
  119. };
  120. },
  121. updateDataByKey: function(storeName, key, data) {
  122. var transaction = this.db.transaction(storeName, 'readwrite');
  123. var store = transaction.objectStore(storeName);
  124. var _this = this;
  125. var request = store.get(key);
  126. var _this = this;
  127. request.onsuccess = function (e) {
  128. var result = e.target.result;
  129. result = Object.assign(result, data);
  130. store.put(result);
  131. }
  132. console.log("updated!");
  133. },
  134. deleteDataByKey: function (storeName, key) {
  135. var transaction = this.db.transaction(storeName, 'readwrite');
  136. var store = transaction.objectStore(storeName);
  137. store.delete(key);
  138. },
  139. //关于索引和游标的使用,需要在建表的时候建立索引
  140. //下面利用index获取数据
  141. //参数: objectStore indexName value(要查找的值) callback
  142. getDataByIndex: function (storeName, indexName, value, callback) {
  143. var transaction = this.db.transaction(storeName);
  144. var store = transaction.objectStore(storeName);
  145. var index = store.index(indexName);
  146. var _this = this;
  147. index.get(value).onsuccess = function (e) {
  148. var result = e.target.result;
  149. if (typeof callback === "function"){
  150. callback.call(_this, result);
  151. }
  152. }
  153. },
  154. //利用游标遍历
  155. getMultipleDataByIndex(storeName, indexName, value, callback) {
  156. var transaction = this.db.transaction(storeName);
  157. var store = transaction.objectStore(storeName);
  158. var index = store.index(indexName);
  159. var request = index.openCursor(IDBKeyRange.only(value))
  160. var values = [], _this = this;
  161. request.onsuccess = function (e) {
  162. var cursor = e.target.result;
  163. if (cursor) {
  164. var value = cursor.value;
  165. //这里是遍历体
  166. values.push(value);
  167. cursor.continue();
  168. }
  169. else{
  170. if (typeof callback === "function") {
  171. callback.call(_this, values);
  172. }
  173. }
  174. }
  175. }
  176. }
  177. var btn = document.getElementById("btn");
  178. indexDB.init("testDB", [
  179. {
  180. name: "students",
  181. keyPath: "id",
  182. //索引信息
  183. index: [
  184. {name: "nameIndex", key: "name", property: {unique: true}},
  185. { name: "ageIndex", key: "age", property: { unique: false}}
  186. ]
  187. },
  188. {
  189. name: "employees",
  190. keyPath: "id",
  191. }
  192. ]);//创建一个数据库和多张objectStore(表)。
  193. //添加数据
  194. btn.onclick = function (e) {
  195. var students = [{
  196. id: 1001,
  197. name: "Byron",
  198. age: 24
  199. }, {
  200. id: 1002,
  201. name: "Frank",
  202. age: 30
  203. }, {
  204. id: 1003,
  205. name: "Aaron",
  206. age: 26
  207. }, {
  208. id: 1004,
  209. name: "Aaron2",
  210. age: 26
  211. }];
  212. indexDB.addData("students", students);
  213. }
  214. document.getElementById("get").onclick = function (e) {
  215. indexDB.getDataByKey("students", 1001, function (result) {
  216. // console.log(this.db); this指向indexDB
  217. console.log(result);
  218. });
  219. //通过索引拿数据
  220. //在 索引名为 nameIndex中寻找 "Frank"
  221. //参数: objectStore indexName value(要查找的值) callback
  222. indexDB.getDataByIndex("students", "nameIndex", "Frank", function (result) {
  223. console.log(result);
  224. })
  225. //游标遍历索引
  226. indexDB.getMultipleDataByIndex("students", "ageIndex", 26, function (result) {
  227. //这里可以获取两条数据
  228. console.log(result);
  229. })
  230. }
  231. document.getElementById("update").onclick = function (e) {
  232. indexDB.updateDataByKey("students", 1001, {age: 19});
  233. indexDB.deleteDataByKey("students", 1003);
  234. }
  235. </script>
  236. </body>
  237. </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. 原生aspx页面如何引用公共js和css

    项目过程中遇到一个问题,每个页面需要引用很多的js和css文件,其中很多都是控件,而且大部分都是一样的,造成很多重复引用. 针对这种情况,参考了mvc的BundleConfig,思路是建立一个公用的用 ...

  2. python 匿名函数与三元运算

    匿名函数 匿名函数就是不需要显示式的指定函数名 首先看一行代码: def calc(x,y): return x*y print(calc(2,3)) # 换成匿名函数 calc = lambda x ...

  3. Zookeeper学习

    http://www.cnblogs.com/caosiyang/archive/2012/11/09/2763190.html   http://www.cnblogs.com/haippy/tag ...

  4. linux 用户空间与内核空间——高端内存详解

    摘要:Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对 ...

  5. Spring加载xml配置文件的方式 ApplicationContext

    大家都知道Java读普通文件是通过Basic I/O 中的InputStream.OutStream.Reader.Writer 等实现的.在spring 框架中,它是怎样识别xml这个配置文件的呢? ...

  6. selenium中浏览器及对应的驱动(可下载)

    https://blog.csdn.net/huilan_same/article/details/52615123,灰蓝大神的总结,可直接下载 下载chrome浏览器,查看版本 http://blo ...

  7. 系列博文-Three.js入门指南(张雯莉)-网格 setInterval方法 requestAnimationFrame方法 使用stat.js记录FPS

    第6章 动画 在本章之前,所有画面都是静止的,本章将介绍如果使用Three.js进行动态画面的渲染.此外,将会介绍一个Three.js作者写的另外一个库,用来观测每秒帧数(FPS). CSS3动画那么 ...

  8. JS 总结----基础部分

    javascript基础:1.每个属性都可以加ID2.写函数的时候注意 == 和 = 不要写错了3.html里面怎么写js里面就怎么写,但是有一例外 className 比如oDiv.class = ...

  9. app后端设计(11)-- 系统架构(2014.12.05更新)

    个人认为,在小型的创业团队中,特别是以应用产品为主,在架构后台的时候,需要集中精力解决自身业务上的问题,不是花时间解决第三方已经解决的问题,简单点来说,就是能用第三方服务就使用第三方的服务.基于这个原 ...

  10. [python]多线程模块thread与threading

    Python通过两个标准库(thread, threading)提供了对多线程的支持 thread模块 import time import thread def runner(arg): for i ...