IndexedDB - 什么是Key,keyPath和indexName?

时间:2015-08-25 22:00:17

标签: javascript html5 indexeddb

我来自MySQL,我习惯了传统的数据库表方案。我无法理解IndexedDB及其一些术语。我在文档中查找了这些定义:

  

关键   用于在对象库中组织和检索存储值的数据值。

     

INDEXNAME   要创建的索引的名称。

     

的keyPath   索引使用的关键路径。

基本上,密钥就像是MySQL中的主键,对吗? indexName 与列相同吗?而且我不明白 keyPath 是什么。

有人可以帮我解释一下吗?再次感谢您的耐心等待:)。

3 个答案:

答案 0 :(得分:5)

索引是一种可以在indexeddb数据库中查询数据的方法。如您所知,对象存储在对象库中。这些对象库没有像普通SQL数据库中那样的模式。

索引存在于3个重要属性中:

indexName :indexname只是您为索引提供的名称。如果要使用索引查询数据,则需要此名称。

keyPath :这定义了要在索引中处理的对象的哪个属性。例如:你有一个对象

{ foo: "bar" } 

并且您想查询foo属性,“foo”将是您的keypath。密钥路径甚至可以更进一步。您可以访问嵌套属性

{ foo: { bar: "bla" } }

如果要查询bar属性,则keypath将为“foo.bar”

:键是键路径内的值。正如您所提到的,此键对于索引是唯一的,但这并不意味着此值必须对于对象库中的所有对象都是唯一的。

indexeddb中的索引的工作方式如下: 创建索引时,它会创建一个新的对象库,其中将存储该对象。不是将这些对象存储在主键上,而是根据键路径中存在的值存储它们。这意味着对于索引中的单个键,您可以拥有多个对象。因此,如果您开始查询索引,它将过滤键并返回这些键中存在的值。

希望这能让你清楚索引。

有关更多信息,我写了一些关于它的博文:info about using keysIndexeddb basics

答案 1 :(得分:2)

是的,key就像SQL中的主键。但是其他人似乎缺少解释您问题主要部分的示例,那就是indexNamekeyPath之间的区别。根据{{​​3}}上的Mozilla页面,

indexName 要创建的索引的名称。请注意,可以使用空名称创建索引。

keyPath 要使用的索引的关键路径。请注意,可以使用空的keyPath创建索引,也可以将序列(数组)作为keyPath传递。

indexName是您用来访问该索引的内容。索引用于在数据库中搜索该“列”。 keyPath是“列”的实际名称。有关keyPath可能采用的形式,请参见其他问题和解答。 请注意,“列”在技术上并不正确,但我正在使用它,因为那是您使用的。

例如,假设您的数据具有列hours,并且您希望能够在该列上搜索数据库。创建数据库时,您将为该列创建索引:

objectStore.createIndex(indexName, keyPath, { unique: false });

indexName可以是您想要的任何内容,例如 hoursColumn ,而keyPath可以是 hours

objectStore.createIndex("hoursColumn", "hours", { unique: false });

unique: false仅表示小时的其他数据行可能具有相同的值。

我可以按照以下步骤将数据写入objectStore

db.transaction(storeName, "readwrite").objectStore(storeName).add({hours: 20, minutes: 30});

因此要在小时列上搜索数据,您可以编写:

var data = db.transaction(storeName).objectStore(storeName).index("hoursColumn").get(20)

,结果将是第一行数据,其中小时 = 20,例如{hours: 20, minutes: 30}

总而言之, indexName 就是您要创建的要搜索的索引,而 keyPath 是您要在其上存储的数据的实际名称想搜索。

答案 2 :(得分:0)

我在这里重新阅读了键和索引的主题,从而更新了我的答案。来自MySQL背景,它们的确与IndexedDB混淆。

(请参阅https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Basic_Concepts_Behind_IndexedDB#gloss_outofline_key

索引

通常,这些发生在“行”内的元素上-例如,如果您有一行: {Hello:"World",Foo:"Bar}在数据库中,您可以为Hello设置索引(任何名称)。这就像您在MySQL中的索引。

因此,在索引可以有多个的地方,键(如前面的答案所述)必须像MySQL主键一样唯一。之所以令人困惑,是因为您还可以通过键和索引来过滤/搜索数据。 (请参见https://developer.mozilla.org/en-US/docs/Web/API/IDBKeyRange。区别在于,键搜索似乎是更多范围(如A-F或> 5 AND <10),而不是特定值。

关于键,这里有一个非常有趣的解释:

https://golb.hplar.ch/2017/09/A-closer-look-at-IndexedDB.html#primary-keys

基本上,它解释了IndexedDB中有4种键:

  1. out-of-line:您需要在每次插入时自己提供密钥
  2. out-of-line auto generated:自动生成的主键(即AutoIncrement)编号
  3. inline:字段的内容构成索引(这是典型的MySQL数据库,但必须必须是唯一的)
  4. inline auto generated:添加了隐藏字段(在控制台中可见),可通过代码访问,但与对象数据不直接相关。

2和4之间的区别是2没有获得定义的名称,而4(类似于MySQL中的主键)却得到了。然后,您可以更新(但不能插入)在4中命名的ID字段。

顺便说一句,我相信它称为键路径,因为您可以调用field.subproperty,这非常好。还请确保您的密钥拼写正确!明显的错误。