我确实希望在HTML5索引数据库中加入两个表。 我发现要添加,更新,删除和列出记录的批次样本,但无法找到任何样本加入多个表格。
答案 0 :(得分:6)
在一般地看待这些技术时,我们想知道同样的问题。没有检查你的特定示例,但这里是Mozilla的一个例子,说明如何在需要时进行连接:
https://hacks.mozilla.org/2010/06/comparing-indexeddb-and-webdatabase/
与SQL相比,这是相当多的代码,但我认为这个想法是稍后使用JavaScript来抽象这些代码非常容易。
答案 1 :(得分:3)
没有连接,但您可以在光标迭代期间打开多个对象存储并加入。
使用我自己的ydn-db库,您可以通过
查询SELECT * FROM Supplier, Part WHERE Supplier.CITY = Part.CITY
var iter_supplier = new ydn.db.IndexValueIterator('Supplier', 'CITY');
var iter_part = new ydn.db.IndexValueIterator('Part', 'CITY');
var req = db.scan(function(keys, values) {
var SID = keys[0];
var PID = keys[1];
console.log(SID, PID);
if (!SID || !PID) {
return []; // done
}
var cmp = ydn.db.cmp(SID, PID); // compare keys
if (cmp == 0) {
console.log(values[0], values[1]);
return [true, true]; // advance both
} else if (cmp == 1) {
return [undefined, SID]; // jump PID cursor to match SID
} else {
return [PID, undefined]; // jump SID cursor to match PID
}
}, [iter_supplier, iter_part]);
详情请见Join query article。
答案 2 :(得分:1)
据我所知,IndexedDB还没有用于执行JOIN的API。我采用的解决方案包括打开游标,循环结果并手动进行连接。这是可怕的RBAR方法,但我找不到更好的解决方案。
答案 3 :(得分:1)
IndexedDB实际上是一个对象存储,而且在对象存储中通常不需要连接,因为你可以只保存嵌套结构。
在您展示的情况下,来自代码表的数据与实际数据相结合。在没有连接的情况下解决这个问题的情况只是将代码表提取到内存中(通常这些数据永远不会改变)并在代码中进行连接。
答案 4 :(得分:1)
不要尝试加入,而是重新设计存储数据的方式,以便不需要加入。使用no-sql方法时,不需要遵循与SQL相同的规范化约束。 No-sql支持在适当的时候冗余地存储数据。