IndexedDB -什么是关键字、关键路径和索引名称?

wz3gfoph  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(5)|浏览(240)

我来自MySQL,习惯了传统的数据库表模式。我在理解IndexedDB和它的一些术语时遇到了困难。我在文档中查找了以下定义:

Key一个数据值,在对象存储中组织与检索存储值时使用该值。
indexName要创建的索引的名称。
keyPath要使用的索引键路径。

基本上,Key就像MySQL中的 Primary Key,对吗?indexName和列是一回事吗?我不明白keyPath是什么。
有人能为我解释一下这些吗?再次感谢你的耐心:)。

fwzugrvs

fwzugrvs1#

是的,key就像SQL中的主键。但是其他人似乎缺少一个解释你的问题的主要部分的例子,那就是indexNamekeyPath之间的区别。根据creating an index上的Mozilla页面,

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

indexName是用来访问该索引的。索引用于在数据库中搜索该“列”。keyPath是“列”的实际名称。请参阅其他问题和答案,了解keyPath可能采用的形式。* 请注意,“列”在技术上是不正确的,但我之所以使用它,是因为您使用了它。*
例如,假设您的数据有数据行hours,而您希望能够在数据库中搜寻该数据行。建立数据库时,您会为该数据行建立索引:

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

其中indexName可以是您想要的任何值,比如说hoursColumnkeyPath将是hours

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

unique: false仅表示其他数据行可能具有小时的相同值。
我可以将数据写入objectStore,如下所示:

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

因此,要搜索列hours上的数据,可以编写:

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

并且结果将是第一数据行,其中小时= 20,例如{hours: 20, minutes: 30}
总而言之,indexName就是您创建的要搜索的索引,而keyPath是要搜索的存储数据的实际名称。

yqhsw0fo

yqhsw0fo2#

索引是一种在indexeddb数据库中查询数据的方法。正如你所知道的,对象被存储在对象存储中。这些对象存储不像你在普通的SQL数据库中那样有一个模式。
索引由3个重要属性组成:

索引名称:indexname只是您提供给索引的名称。如果您要使用索引来查询数据,就需要这个名称。
密钥路径:这会定义您要在索引中行程的对象属性。例如:你有一个对象

{ foo: "bar" }

并且您希望查询foo属性,“foo”将是您的keypath。

{ foo: { bar: "bla" } }

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

key:键是keypath中的值,正如你提到的,这个键对于索引是唯一的,但这并不意味着这个值对于对象存储库中的所有对象都是唯一的。

indexeddb中的索引工作方式如下:当你创建一个索引时,它会创建一个新的对象存储库来存储对象。这些对象不是基于主键来存储的,而是基于keypath中的值来存储的。这意味着对于索引中的一个键,你可以有多个对象。所以如果你开始查询一个索引,它会过滤这些键,并返回这些键中的值。
希望这能让你更清楚地了解索引。

nhjlsmyf

nhjlsmyf3#

我在重新阅读了键和索引的主题后,在这里更新了我的答案。来自MySQL的背景,它们确实与IndexedDB混淆。
(请参见以下网址:http://developer.mozilla.org/en-US/docs/Web/API/ IndexedDB API/基本概念背后的 IndexedDB #光泽_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没有定义的Name,而4(就像MySQL中的主键)有。然后你可以更新(但不是插入)你在4中命名的ID字段。
    顺便说一句,我相信它被称为键盘路径,因为你可以调用field.subproperty,这是相当不错的。还请确保你的键拼写正确!明显的错误。
svdrlsy4

svdrlsy44#

我也很难理解其中的区别,但最后我发现了为什么大多数时候我们都把它们设置为相同的名称。简而言之,indexName是我们想要的“字段”或“列”的方式(索引)将命名在我们的“表”中(对象存储)和keyPath是包含字段值的存储对象的属性。因此,它们具有相同的名称是合乎逻辑的。
例如,您有一个包含以下字段的表:

  • 姓名
  • 年龄

它们都是每个字段的indexName,但是您必须告诉IndexedDB哪个属性(keyPath)包含每个字段的值。

objectStore.createIndex("name", "name", { unique: false });
objectStore.createIndex("age", "age", { unique: false });
nhn9ugyo

nhn9ugyo5#

Key       = Row Item
indexName = Column name
keyPath   = Column name

相关问题