3

我目前正在开发一个用于提交考勤卡的移动应用程序,该应用程序与现有的会计应用程序一起使用。不用说,这个应用程序严重依赖关系数据库,这种特殊的依赖会转化为移动应用程序。

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

我的问题是向 IndexedDB 的过渡是否是 A.) 可行和 B.) 明智之举。如果 WebSQL 避免被弃用,这将不是问题。我开始更好地理解 IndexedDB 以及 JSON 如何使其对相对复杂的数据存储有用,但我无法真正理解它是否真的可以复制关系数据库的功能。

根据应用程序的要求,IndexedDB 似乎不是一个替代方案,但我对这个概念仍然很陌生并且对启蒙持开放态度。

那么 IndexedDB 有可能成为替代方案吗?IndexedDB 能否用于复制具有多个相关表和大量数据的数据库的功能。如果是这样,我在哪里可以找到有关如何执行此操作的信息。如果没有,我有两个替代方案吗?(假设 WebSQL 实际上确实失去了支持并且 IndexedDB 不可行)。

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

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

4

3 回答 3

2

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

就个人而言,IndexedDB 看起来既奇怪又复杂,尤其是当您超越简单的单表操作时。我没有对其进行任何实际测试,但是由于您必须手动执行某些操作(例如连接记录),因此您最终会得到更多的 JS 代码,这意味着更多的区域可以隐藏错误。

那么 IndexedDB 有可能成为替代方案吗?IndexedDB 能否用于复制具有多个相关表和大量数据的数据库的功能。如果是这样,我在哪里可以找到有关如何执行此操作的信息。如果没有,我有两个替代方案吗?(假设 WebSQL 实际上确实失去了支持并且 IndexedDB 不可行)。

快速搜索会出现http://blog.oharagroup.net/post/16394604653/a-performance-comparison-websql-vs-indexeddb,其中显示了 IndexedDB 多表使用的一些模式。它还显示了一些性能比较,这对于 IndexedDB 看起来很有希望。但是,请参阅此答案并对这个基准持保留态度。

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

我是不同行业的类似应用程序的开发人员,我的经验完全不同:即使在较旧的 iPhone 3GS 上,WebSQL 解决方案也能正常运行——我们已经测试了每个表有数千条记录的模式,没有明显的减速。您是否可能在单独的事务中插入每一行?

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

于 2012-04-05T14:32:17.283 回答
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 对用户定义的存储操作功能的支持。

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

于 2016-07-11T01:51:49.133 回答
0

通常使用 SQL 的开发人员由于其复杂的 api,在使用 indexeddb 时会遇到困难。

解决方案是使用任何让 indexedb 超级简单的 indexedb 库,但为了使用该库,我需要了解 indexeddb 的一些概念。

JsStore是一个 indexeddb 库,它消除了 indexeddb 的复杂性,使 indexeddb 的使用变得超级简单。它提供了类似 Sql 的 api,使其易于学习。

可以说 - 你有 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)
})
于 2017-12-29T02:55:43.890 回答