out-of-line auto generated:自动生成的主键(即AutoIncrement)编号
inline:字段的内容形成索引(这是典型的MySQL数据库,但 * 必须 * 唯一)
inline auto generated:添加了隐藏字段(在控制台中可见),可通过代码访问,但与对象数据不直接相关。 2和4之间的区别在于2没有定义的Name,而4(就像MySQL中的主键)有。然后你可以更新(但不是插入)你在4中命名的ID字段。 顺便说一句,我相信它被称为键盘路径,因为你可以调用field.subproperty,这是相当不错的。还请确保你的键拼写正确!明显的错误。
5条答案
按热度按时间fwzugrvs1#
是的,
key
就像SQL中的主键。但是其他人似乎缺少一个解释你的问题的主要部分的例子,那就是indexName
和keyPath
之间的区别。根据creating an index上的Mozilla页面,indexName要创建的索引的名称。请注意,可以使用空名称创建索引。
keyPath要使用的索引键路径。请注意,可以使用空keyPath创建索引,也可以将序列(数组)作为keyPath传入。
indexName
是用来访问该索引的。索引用于在数据库中搜索该“列”。keyPath
是“列”的实际名称。请参阅其他问题和答案,了解keyPath
可能采用的形式。* 请注意,“列”在技术上是不正确的,但我之所以使用它,是因为您使用了它。*例如,假设您的数据有数据行
hours
,而您希望能够在数据库中搜寻该数据行。建立数据库时,您会为该数据行建立索引:其中
indexName
可以是您想要的任何值,比如说hoursColumn,keyPath
将是hours。unique: false
仅表示其他数据行可能具有小时的相同值。我可以将数据写入
objectStore
,如下所示:因此,要搜索列hours上的数据,可以编写:
并且结果将是第一数据行,其中小时= 20,例如
{hours: 20, minutes: 30}
总而言之,indexName就是您创建的要搜索的索引,而keyPath是要搜索的存储数据的实际名称。
yqhsw0fo2#
索引是一种在indexeddb数据库中查询数据的方法。正如你所知道的,对象被存储在对象存储中。这些对象存储不像你在普通的SQL数据库中那样有一个模式。
索引由3个重要属性组成:
索引名称:indexname只是您提供给索引的名称。如果您要使用索引来查询数据,就需要这个名称。
密钥路径:这会定义您要在索引中行程的对象属性。例如:你有一个对象
并且您希望查询foo属性,“foo”将是您的keypath。
如果要查询bar属性,则keypath将为“foo.bar“
key:键是keypath中的值,正如你提到的,这个键对于索引是唯一的,但这并不意味着这个值对于对象存储库中的所有对象都是唯一的。
indexeddb中的索引工作方式如下:当你创建一个索引时,它会创建一个新的对象存储库来存储对象。这些对象不是基于主键来存储的,而是基于keypath中的值来存储的。这意味着对于索引中的一个键,你可以有多个对象。所以如果你开始查询一个索引,它会过滤这些键,并返回这些键中的值。
希望这能让你更清楚地了解索引。
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种类型的键:
out-of-line
:您自己在每个插入上提供密钥out-of-line auto generated
:自动生成的主键(即AutoIncrement)编号inline
:字段的内容形成索引(这是典型的MySQL数据库,但 * 必须 * 唯一)inline auto generated
:添加了隐藏字段(在控制台中可见),可通过代码访问,但与对象数据不直接相关。2和4之间的区别在于2没有定义的Name,而4(就像MySQL中的主键)有。然后你可以更新(但不是插入)你在4中命名的ID字段。
顺便说一句,我相信它被称为键盘路径,因为你可以调用
field.subproperty
,这是相当不错的。还请确保你的键拼写正确!明显的错误。svdrlsy44#
我也很难理解其中的区别,但最后我发现了为什么大多数时候我们都把它们设置为相同的名称。简而言之,
indexName
是我们想要的“字段”或“列”的方式(索引)将命名在我们的“表”中(对象存储)和keyPath
是包含字段值的存储对象的属性。因此,它们具有相同的名称是合乎逻辑的。例如,您有一个包含以下字段的表:
它们都是每个字段的
indexName
,但是您必须告诉IndexedDB哪个属性(keyPath
)包含每个字段的值。nhn9ugyo5#