在 IndexedDB 中的对象中索引数组值

Indexing array values in an object in an IndexedDB

对于将数据存储在 IndexedDB 中的 Chrome 应用程序,我有一个这样的对象:

var simplifiedOrderObject = {
    "ordernumber": "123-12345-234",
    "name": "Mr. Sample",
    "address": "Foostreet 12, 12345 Bar York",
    "orderitems": [
        {
            "item": "brush",
            "price": "2.00"
        },
        {
            "item": "phone",
            "price": "30.90"
        }
    ],
    "parcels": [
        {
            "service": "DHL",
            "track": "12345"
        },
        {
            "service": "UPS",
            "track": "3254231514"
        }
    ]
}

如果我将 hole 对象存储在 objectStore 中,我可以为 "track" 使用索引吗,它可以在每个订单对象中多次包含?

或者是否需要或可能 better/faster 将每个对象拆分为多个对象存储,就像从关系数据库中知道的那样:

该解决方案还应该可以快速处理 100.000 个或更多存储的对象。

回答我自己的问题:我现在已经做了一些测试。看起来不可能只在 1 个 objectStore 中使用该对象执行此操作。

另一个可行的示例对象:

var myObject = {
    "ordernumber": "123-12345-234",
    "name": "Mr. Sample",
    "shipping": {"method": "letter",
                 "company": "Deutsche Post AG" }
}

Creating an index 将由以下人员完成:

objectStore.createIndex(objectIndexName, objectKeypath, optionalObjectParameters);

通过设置 objectKeypath 可以在主对象中寻址一个值,例如 "name":

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

也可以从对象的子对象中寻址值,例如 "shipping.method":

objectStore.createIndex("shipping", "shipping.method", {unique: false});

但是无法寻址像 "track" 那样的值,这些值包含在对象中,存储在数组中。即使像 "parcels[0].track" 这样的东西作为索引获取第一个值也不起作用。

无论如何,可以索引数组的所有简单元素(但不是对象)。

因此,以下更简单的结构将允许为数组中的每个 parcelnumber 创建一个索引条目 "trackingNumbers":

var simplifiedOrderObject = {
    "ordernumber": "123-12345-234",
    "name": "Mr. Sample",
    "address": "Foostreet 12, 12345 Bar York",
    "orderitems": [
        {
            "item": "brush",
            "price": "2.00"
        },
        {
            "item": "phone",
            "price": "30.90"
        }
    ],
    "trackingNumbers": ["12345", "3254231514"]
} 

创建索引时 multiEntry 设置为 true:

objectStore.createIndex("tracking", "trackingNumbers", {unique: false, multiEntry: true});

无论如何,缺少在数组中索引对象值的可能性,使得使用 indexedDB 变得非常复杂。这是设计上的失败。这迫使开发人员像在关系数据库中那样做事情,同时缺乏 SQL 的所有可能性。真的很糟糕:(