indexedDB 索引與primarykey主鍵區別

admin發表於2019-07-23

關於索引與主鍵的用法本文不再介紹,具體參閱如下兩篇文章:

(1).主鍵可以參閱indexedDB 資料庫主鍵一章節。

(2).索引可以參閱indexedDB 資料庫 索引一章節。

為了便於掌握與理解,本文再來總結一下兩個概念的主要區別。

一.是否是必須的:

假設將如下資料存入物件倉庫,以id作為主鍵:

[JavaScript] 純文字檢視 複製程式碼
let students=[
  { 
    id:1001, 
    name:"張三", 
    age:21,
    sex:"男"
  },{ 
    id:1002, 
    name:"李四", 
    age:20,
    sex:"女"
  },{ 
    id:1003, 
    name:"王五", 
    age:19,
    sex:"女"
  }
];

主鍵是物件倉庫中資料的唯一標識,就如同身份證號碼,是必須的。

通過上面的id可以唯一標識每一個學生,但是索引的目的是為了檢索方便。

比如我們想通過性別對學生進行檢索,那麼建立一個與sex屬性關聯的索引即可。

更多內容可以參閱indexedDB 通過索引檢索資料一章節。

二.是否唯一:

索引是為了便於檢索資料,可以通過objectStore.createIndex()方法的第三個引數規定索引是否唯一。

也就是說索引值不一定是唯一的,比如同學中女生不止一個,相同年齡的也可能不止一個。

前面提到過主鍵用於唯一標識物件倉庫中的資料,但是在物件倉庫中主鍵值可能是重複的,當然都是對應同一個值。

程式碼例項如下:

[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:"男",
    tags:["A","B","C"]
  },{ 
    id:1002, 
    name:"李四", 
    age:20,
    sex:"女",
    tags:["B"]
  },{ 
    id:1003, 
    name:"王五", 
    age:19,
    sex:"女",
    tags:["D","M"]
  }
];
let request = window.indexedDB.open("antzone", 1);
let indexOBJ;
request.onupgradeneeded = (ev) => {
  let db = ev.target.result;
  if (!db.objectStoreNames.contains('website')) {
    let objectStore = db.createObjectStore('website',{autoIncrement:true});
    objectStore.createIndex('tagsIndex','tags',{multiEntry: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[3420]

多行的主鍵值是相同的,但是並不妨礙它唯一標識一條資料,因為它們對應的value是相同的。

三.主鍵與索引路徑:

主鍵可以通過如下兩種方式建立:

(1).通過keyPath屬性規定的儲存資料的某個屬性。

(2).自增長方式的數字。

索引只能是儲存資料的指定屬性。

相關文章