例如,我有一个对象数组:
const arrayOfPersons = [
{ name: 'Alex', ssn: 123, children: [
{ name: 'Tom', yearOfBirth: '2023', isHappy: true },
{ name: 'Emma', yearOfBirth: '2012', isHappy: true }
]},
{ name: 'John', ssn: 234, children: [
{ name: 'Harry', yearOfBirth: '2003', isHappy: true },
{ name: 'Eva', yearOfBirth: '2020', isHappy: true },
{ name: 'Henry', yearOfBirth: '1999', isHappy: true }
]}
];
使用以下代码创建数据库:
const request = indexedDB.open(nameOfDB, 1);
request.onerror = (event) => {
console.error(`Database error: ${event.target.errorCode}`);
};
request.onupgradeneeded = (event) => {
const db = event.target.result;
const objectStore = db.createObjectStore(nameOfObjectStore, { keyPath: "ssn" });
};
我需要升级某个孩子的“isHappy”属性。最好的方法是什么?
在这里,我通过get()方法获取一个人,然后迭代他的所有孩子。
const request = indexedDB.open(nameOfDB, 1);
request.onerror = (event) => {
console.error(`Database error: ${event.target.errorCode}`);
};
request.onsuccess = (event) => {
const db = event.target.result;
const personObjectStore = db
.transaction(nameOfObjectStore, "readwrite")
.objectStore(nameOfObjectStore);
const getPersonRequest = personObjectStore.get(123);
getPersonRequest.onsuccess = (event) => {
const person = event.target.result;
person.children.forEach( (child) => {
if (child.name == 'Emma') {
child.isHappy = false;
}
});
personObjectStore.put(person).onsuccess = (event) => {
console.log('successfully updated');
};
}
};
它工作,但它看起来不是很有效。
我还有一个问题。put()方法是重写所有对象还是只更新修改过的条目?我将要处理的实际数据库包含许多巨大的数组,这些数组包含大量数据。
1条答案
按热度按时间4dc9hkyq1#
它工作,但它看起来不是很有效。
考虑到您存储数据的方式,这可能是您所能获得的最高效率。数据库Maven可能会说,您应该将数据扁平化,以便孩子在自己的存储中,使用类似[parent_ssn,name]的复合索引,然后您可以直接查找该记录。
put()方法是重写所有对象还是只更新修改过的条目?
它将取代整个记录。这是考虑以分解形式存储数据的另一个原因。但是...请记住,现代计算机和存储速度非常快,所以不要过早优化。小于几百KB的值可能可以自动更新,但您应该在代表性硬件上进行性能测试或从野外收集指标以通知这些决策。