【问题标题】:IndexedDB - boolean indexIndexedDB - 布尔索引
【发布时间】:2012-11-20 07:23:48
【问题描述】:

是否可以在 Boolean 类型的字段上创建索引?

假设我要存储的记录的架构是:

{
  id:1,
  name:"Kris",
  _dirty:true
}

我创建了正常的非唯一索引(onupgradeneeded):

...
store.createIndex("dirty","_dirty",{ unique: false })
...

索引已创建,但它是空的! - 在索引 IndexedDB 浏览器中没有具有 Boolean 值的记录 - 只有 StringsNumbersDates 甚至数组

我正在使用 Chrome 25 金丝雀

我想查找所有将 _dirty 属性设置为 true 的记录 - 是否必须将 _dirty 修改为 string 或 int?

【问题讨论】:

    标签: google-chrome indexing boolean indexeddb


    【解决方案1】:

    我使用了01 而不是布尔类型。

    【讨论】:

      【解决方案2】:

      标记为已检查的答案并不完全正确。

      您不能对包含 Boolean JavaScript 类型值的属性创建索引。另一个答案的那部分是正确的。如果你有像var obj = {isActive: true}; 这样的对象,尝试在obj.isActive 上创建索引将不起作用,浏览器会报告错误消息。

      但是,您可以轻松模拟所需的结果。 indexedDB 不会将对象中不存在的属性插入索引。因此,您可以定义一个属性来表示真,而不是定义一个属性来表示假。当属性存在时,对象将出现在索引中。当属性不存在时,对象不会出现在索引中。

      示例

      例如,假设您有一个“obj”对象的对象存储。假设您要在这些对象的 isActive 属性上创建一个类似布尔值的索引。

      首先在 isActive 属性上创建一个索引。在onupgradeneeded回调函数中,使用store.createIndex('isActive','isActive');

      要表示对象的“真”,只需使用obj.isActive = 1;。然后将对象添加或放入对象存储中。当您要查询所有设置了isActive 的对象时,只需使用db.transaction('store').index('isActive').openCursor();

      要表示假,只需使用delete obj.isActive;,然后将对象添加或放入对象存储中即可。

      当您查询设置了isActive 的所有对象时,这些缺少isActive 属性(因为它已被删除或从未设置)的对象在使用光标迭代时不会出现。

      瞧,一个布尔索引。

      性能说明

      像在此处使用的示例中所做的那样在索引上打开游标将提供良好的性能。小数据时性能差异并不明显,但在存储大量对象时非常明显。无需采用一些第三方库来完成“布尔索引”。这是您可以自己完成的平凡而简单的功能。您应该尽量使用原生功能。

      【讨论】:

        【解决方案3】:

        布尔属性描述独占状态(活动/非活动)、“开/关”、“启用/禁用”、“是/否”。您可以在 JS 数据模型中使用这些值对而不是布尔值以提高可读性。此策略还允许添加其他状态('NotSet',如果对象中未配置某些内容等情况)...

        【讨论】:

          【解决方案4】:

          是的,boolean is not a valid key

          如果必须,当然可以解析为 1 和 0。

          但这是有充分理由的。索引布尔值不提供信息。在上述情况下,您可以即时进行表扫描和过滤,而不是索引查询。

          【讨论】:

          • 正确答案,但我不同意它的推理。在处理大量记录时,对布尔值进行索引会提供有用的信息。动态过滤完全是浪费处理。并且存储一个值为 0 的键而不是根本不存储键是浪费空间。
          • 索引只有在 O(log n) 查找时间内可以检索到请求键时才有用。在布尔索引的情况下,无论是否被索引,查找时间都是相同的。
          • 我想我必须再次恭敬地不同意。 store.openCursor(...).onsuccess = function() { if(this.result.value.someBoolean) { ... }} 和 store.index(...) 的代码之间存在显着的性能差异.openCursor(...).onsuccess = function() {}
          • 尊敬的,我必须再次争论。你是对的,index.openCursor 上的查询比store.openCursor 快,但对于布尔索引值只有 50%。在渐近情况下不显着。
          • 这种推理需要假设 50% 的对象为真,50% 为假。在现实世界中,您可能有 100,000 个值为假,而只有少数值为真。在这种情况下,索引一个布尔值真的很有意义。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-08
          • 2010-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-17
          • 2014-12-14
          相关资源
          最近更新 更多