html5 indexeddb 排序,HTML5 IndexedDB,Web SQL数据库和浏览器大战

根据您在iOS上对Safari的要求,除了WebSQL之外别无选择 . 其他移动浏览器(如Opera和Opera)支持WebSQL黑莓 . 即使他们有IndexedDB,我也不认为他们会删除WebSQL支持 . 不知何故,他们是互补的 .

另一方面,在浏览器存储战争中,IndexedDB获胜 . IE和FF只有IndexedDB . 讽刺的是,FF在Sqlite之上实现了IndexedDB .

我想说的是IndexedDB不仅仅是关键值存储 . 它有索引和交易 . 这些只有两个几乎构成SQL查询的所有功能,包括连接,条件和排序 . 起初并不明显,因为它的异步API .

IndexedDB的性能优于WebSQL . 它更安全 . 它对javascript用例更灵活 . 最后它更容易使用 .

为了说明这种情况,我将使用my library中的sudo代码,但您可以直接使用IndexedDB API:

'people'商店有索引字段'name'和list indexed字段'hobby' . 在JSON中,

people = {

name: 'Foo Bar',

email: 'foo@bar.com'

hobby: ['camping', 'swimming']};

从“爱好者”露营的“人”中检索姓名 .

var req = db.keys('people', 'hobby', IDBKeyRange.only('camping'));

req.done(function(campers) {

db.keys('people', campers, 'name').done(function(names) {

console.log(names);

});

});

关于这段代码的有趣之处在于没有涉及序列化 . 因此它非常快 .

以下示例说明了友谊图查询 . friendship 对象库只有一个列出的索引字段 friend_list . 它使用人物对象存储键作为外线主键 . people 对象库有很多属性,其中有 location 字段 . 该查询是查找知道 me 和 other_guy 且位于'Singapore'的朋友列表 .

var q1 = new ydn.db.Iterator('friendship', 'friend_list', IDBKeyRange.only(me));

var q2 = new dn.db.Iterator('friendship', 'friend_list', IDBKeyRange.only(other_guy));

// if location is not indexed, a filtered value query is used.

var q3 = new ydn.db.Iterator('people', new ydn.db.Expression(['"location"', "'Singapore'", '=']));

// if location is indexed, an index query is used.

// var q3 = new ydn.db.Iterator('people', 'location', IDBKeyRange.only('Singapore'));

var current_loop = 2; // start from inner loop

var join_algo = function(keys, index_keys) {

var advancement = [];

advancement[keys.length - 1] = null;

var has_adv = false;

for (var i = 0; i < keys.length; i++) {

if (!goog.isDef(keys[i])) {

// completed iterator

if (i != 0) {

advancement[i] = false; // request to restart the iteration

advancement[i - 1] = true; // advance outer iterator

current_loop = i - 1;

} // i == 0 means we are done.

has_adv = true;

break;

}

}

if (!has_adv) {

// continue looping current

advancement[current_loop] = true;

}

return advancement;

}

var result = db.scan([q3, q1, q2], join_algo);

result.done(function(keys, index_keys, values) {

console.log(values); // should get desire list of friends

});

此连接查询再次只是键扫描,因此非常快 . 默认情况下 scan 使用sorted-merge算法来查找匹配的键,但这里显示了朴素的嵌套循环连接算法 . 因此表连接是可能的,但您必须编写连接算法 . 但是像Zigzag merge这样的新算法比使用Sqlite更快,因为所有输入都是排序的,游标可以很好地进步,更重要的是加入过程可以利用不在数据库中的外部知识 . 使用SQL,连接操作是不透明的 .

除了IndexedDB之外,还可以使用流式传输和map / reduce处理等技术 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值