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

根据您在iOS上对Safari的特定要求,除了WebSQL,别无选择。 其他移动浏览器(例如Opera和Blackberry)也支持WebSQL。 我认为即使拥有IndexedDB,他们也不会删除WebSQL支持。 它们在某种程度上是互补的。

另一方面,在浏览器存储大战中,IndexedDB赢得了胜利。 IE和FF仅具有IndexedDB。 具有讽刺意味的是,FF在Sqlite之上实现了IndexedDB。

我想说的是,IndexedDB不仅仅是键值存储。 它具有索引和事务。 这两个功能几乎构成了SQL查询的所有功能,包括连接,条件和排序。 一开始它并不明显,因为它具有异步API。

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

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

“人”存储区具有索引字段“名称”和列表索引字段“ 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对象存储只有一个列出的索引字段scan。它使用人员对象存储键作为离线主键。 people对象存储具有许多属性,其中有location字段。 该查询用于查找认识me和other_guy并位于'新加坡'的朋友列表。

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使用排序合并算法来找到匹配的键,但是这里显示了朴素的嵌套循环联接算法。 因此可以进行表联接,但是必须对联接算法进行编码。 但是像之字形合并这样的新算法比Sqlite更快,因为所有输入都已排序,游标可以很好地前进,更重要的是,连接过程可以利用数据库中没有的外部知识。 使用SQL,联接操作是不透明的。

除了那个IndexedDB之外,还可以使用流式传输和映射/减少处理等技术。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值