在 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 的所有可能性。真的很糟糕:(
对于将数据存储在 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 的所有可能性。真的很糟糕:(