indexedDB 資料庫 索引

admin發表於2019-07-22

本文將通過程式碼例項詳細介紹一下indexedDB資料庫索引相關知識。

主鍵與索引具有一些相似之處,具體參閱indexedDB 資料庫主鍵一章節。

一.索引的必要性:

主鍵可以唯一標識物件倉庫中的資料(不同物件倉庫中的資料主鍵可以重複)。

既然通過主鍵可以唯一確定檢索一條資料,那建立索引的意義何在,下面舉一個簡單例子。

資料庫中儲存有如下類似關於班級學生的資料記錄:

[JavaScript] 純文字檢視 複製程式碼
{
  webName:"張三",
  age:15,
  email:"ant@163.com",
  sex:"男"
}

在儲存資料的時候,主鍵是自增長的,一共儲存了50個學生的資訊。

我們自然能夠通過主鍵獲取學生的資訊,但並不是在所有場景下都能表現完美。

比如需要按照學生的性別來檢索資訊,也就是利用資訊中的sex屬性進行檢索,此時索引的價值就會得到體現。

二.建立索引:

要使用索引,那麼就要首先要針對指定的屬性建立索引。

看一段程式碼例項:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script>
let students=[
  { 
    id:1001, 
    name:"張三", 
    age:21,
    sex:"男"
  },{ 
    id:1002, 
    name:"李四", 
    age:20,
    sex:"女"
  },{ 
    id:1003, 
    name:"王五", 
    age:19,
    sex:"女"
  }
];
let request = window.indexedDB.open("antzone", 1);
request.onupgradeneeded = (ev) => {
  let db = ev.target.result;
  if (!db.objectStoreNames.contains('website')) {
    let objectStore = db.createObjectStore('website',{autoIncrement:true});
    objectStore.createIndex("xingbie","sex",{ unique: false });
    objectStore.createIndex("xingming","name",{ unique: true });
  }
}
request.onsuccess = (ev) => {
  let db = ev.target.result;
  let transaction = db.transaction(['website'], 'readwrite');
  let objectStore = transaction.objectStore('website');
  for(let i=0;i<students.length;i++){
    objectStore.add(students[i]);
  }
}
</script>
</head>
<body>
  <p>為物件建立索引,並新增資料</p>
</body>
</html>

程式碼執行效果截圖如下:

aid[3414]

程式碼分析如下:

(1).通過IDBObjectStore.createIndex()方法建立物件索引。

(2).方法第一個引數是索引名稱,第二個引數是索引所對應屬性,第三個規定索引對應屬性值是否可以重複。

關於索引和其周邊知識本文不再介紹,更多內容參閱下面的幾個文章:

(1).建立索引可以參閱IDBObjectStore.createIndex() 方法一章節。

(2).關於事務可以參閱indexedDB transaction 事務一章節。

(3).索引的應用可以參閱indexedDB 通過索引查詢資料一章節。

相關文章