从WebSQL转换为IndexedDB

时间:2012-04-05 13:26:29

标签: javascript html5 web-sql indexeddb offlineapps

我目前正致力于提供时间卡提交的移动应用程序,该应用程序适用于现有的会计应用程序。毋庸置疑,此应用程序在很大程度上依赖于关系数据库,而且特定的依赖性转换为移动应用程序。

在当前状态下,移动应用程序使用WebSQL离线访问在用户可以访问Internet时加载到设备上的表。时间卡在本地数据库上创建,然后在用户重新访问Internet时上载。此功能是应用程序的核心。

我的问题是转向IndexedDB是否是A.)可行和B.)聪明的举动。如果WebSQL避免弃用,这不会是一个问题。我开始更好地理解IndexedDB以及JSON如何使它对相对复杂的数据存储有用,但我无法真正理解它是否能够实际复制关系数据库的功能。

根据应用程序的要求,看起来IndexedDB不是一个替代方案,但我对这个概念仍然很陌生并且愿意接受启发。

IndexedDB可能是另一种选择吗?可以使用IndexedDB来复制具有多个具有大量数据的相关表的数据库的功能。如果是这样,我在哪里可以找到有关如何操作的信息。如果没有,我可以替代这两个吗? (假设WebSQL确实失去了支持,而且IndexedDB不可行)。

在相关的说明中,IndexedDB会加快本地数据库的数量吗? PHP目前用于在用户在线时填充数据库,并且确实需要花费相当多的时间来填充具有大约一百个选项的表。当它接近一千时,应用程序刚刚崩溃(这是一种不常见的情况,并且强烈建议客户不要使用那么多数据)。

对此的任何帮助都会很棒,我对编程很新,对Web开发也很陌生。

3 个答案:

答案 0 :(得分:2)

根据http://www.caniuse.com/indexeddb,对indexedDB的支持相当有限,所以我暂时不会跳转到它。但是,当实施成熟时,这很可能在未来发生变化。

就个人而言,IndexedDB看起来很奇怪和复杂,特别是当你超越简单的单表操作时。我没有对它进行任何实际测试,但由于你必须手动做一些事情(比如连接记录),你最终会得到更多的JS代码,这意味着更多的区域可以隐藏bug。

  

IndexedDB可能是另一种选择吗?可以使用IndexedDB   复制具有多个相关的数据库的功能   包含大量数据的表。如果是这样,我在哪里可以找到信息   如何做到这一点。如果没有,我可以替代这两个吗?   (假设WebSQL确实失去了支持,而IndexedDB则没有   可行的)。

快速搜索会显示http://blog.oharagroup.net/post/16394604653/a-performance-comparison-websql-vs-indexeddb,其中显示了IndexedDB多表使用的一些模式。它还显示了一些性能比较,看起来很有希望用于IndexedDB。但是,请参阅this answer,并将此基准用于一粒盐。

  

在相关的说明中,IndexedDB会加速人口增长   本地数据库? PHP目前用于填充数据库   用户在线,并且确实需要花费相当多的时间来填写   表有一百个左右的选项。当它接近一千时,   应用程序刚刚爆发(这是一个不常见的事件   强烈建议客户不要使用那么多数据。)

我是一个针对不同行业的类似应用程序的开发人员,我的经验非常不同:即使在较旧的iPhone 3GS上,WebSQL解决方案运行得很充分 - 我们已经测试了每个表有几千条记录的模式,没有明显的减速。您是否可以在单独的交易中插入每一行?

我们的大多数客户对该应用感到满意,因为它可以在iPad,iPhone,Android平板电脑和谷歌浏览器上运行。但是一个客户端的安全要求只允许使用Windows和IE,没有其他浏览器或非Windows移动设备。这是我们看到WebSQL没有削减它的唯一场景。我们研究了IndexedDB和本机应用程序,到目前为止,我们认为原生应用程序是更好的选择(C#基础库可以在Xamarin和Windows Phone应用程序之间共享,更不用说C#比松散类型的JS回调更令人愉快。地狱)。

答案 1 :(得分:0)

我已经迟了好几年了,但我认为我会接受OP的问题(为了他的利益(可能)以及任何发现自己有同样问题的人的利益)没有直接回答,并提供一些建议!

  我能替代这两种吗? (假设WebSQL确实失败了   支持和IndexedDB是不可行的。

此时,IndexedDB是唯一保留在W3C标准轨道上的数据库,因此,就本机客户端数据库而言,它几乎是唯一的选择。

  

IndexedDB可能是另一种选择吗?可以使用IndexedDB   使用多个相关表复制数据库的功能   大量数据。

嗯...

IndexedDB是非关系型 文档存储

  • 非关系型:不允许定义其对象库(表)中存在的条目之间的任何关系。所有这些关系必须由应用程序定义和维护。

  • 文档存储:文档存储库,是任意结构化的数据项。

另一方面,关系数据库支持表条目之间关系的定义和维护。这些数据库中的大多数也是行存储,(正如您可能知道的那样)是包含在表中的元组的存储库,这些元组定义了它们各自的结构。

因此,回答您的问题,是的,您可以在IndexedDB中复制关系数据库提供给您的功能。如果商店中的任何数据项以任何方式彼此相关,则您在某种程度上必须这样做。

但是考虑到客户端数据库只是数据的暂时中断,明智的做法是只复制最低限度以保持数据的完整性,并利用其余的此类功能,一旦数据传输,它就存在于服务器端的关系数据库中。

如果转换的想法看起来仍然可口,那就去吧!

但在此之前,您应该了解一些关于IndexedDB的事情。鉴于数据库的类型,第一个应该是明显的:它本身不支持SQL。第二个是它的API ......至少可以说是笨拙的。

鉴于这些事情,我建议您查看BakedGoods。有了它,例如,将一个或多个数据项放在IndexedDB数据库中就像这样简单:

bakedGoods.set({
    data: [{key: "key1", value: "value1"}, {key: "key2", value: "value2"}],
    storageTypes: ["indexedDB"],
    function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

由于复制某些关系数据库功能可能需要复杂的CRUD操作,您可能希望利用BakedGood对user-defined storage operation functions的支持。

只是为了完全透明,BakedGoods就是由这个人在这里维护:)。

答案 2 :(得分:0)

通常,使用SQL的开发人员由于其复杂的apis而难以使用indexeddb。

解决方案是使用任何indexedb库,使indexedb超级简单,但为了使用库,我需要知道indexeddb的几个概念。

JsStore是一个indexeddb库,它删除了indexeddb的复杂性,并使indexeddb的使用变得非常容易。它提供了像api这样的Sql,使其易于学习。

让我们说 - 你有SQL查询:select * from table_name where id=1 and name='abc'

在JsStore中 - 查询将是:

var con = new JsStore.Instance(db_name);
con.select({
     From:table_name,
     Where: {
         Id: 1,
         Name:'abc'
     }
}).then(function(result){
   console.log(result)
})
相关问题