【问题标题】:Conversion from WebSQL to IndexedDB从 WebSQL 到 IndexedDB 的转换
【发布时间】:2012-04-19 05:54:33
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: javascript html web-sql indexeddb offlineapps


    【解决方案1】:

    根据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 看起来很有希望。但是,请参阅 this answer 并对这个基准持保留态度。

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

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

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

    【讨论】:

    • 事实上,我将每个查询作为一个单独的事务进行(我没有为那部分编写代码)。您能否为我指明正确的方向,如何将我的数百个 SQL 查询变成一个合理的数量?
    • Scott 的性能比较不符合 WebSQL 的要求。请参阅我的回复here
    • WebSQL 在大多数平台上都在贬值。请相应地更新您的答案。
    • @Braiam:每个人都在声称,但事实是 WebSQL 比 IndexDB 有更广泛的支持,因此在 IndexDB 得到普遍支持之前仍然是唯一真正的选择(目前还不是这样)。
    • 只是关于支持的说明。目前iOS7(这是开发测试版)有一个错误,当数据库大小大于5MB时会引发安全异常(这通常会导致弹出窗口询问用户是否接受数据库大小增加之前的版本)。这只会影响在 safari 上运行的网络应用程序,如果相同的网络应用程序在全屏模式下运行(网络应用程序添加到主屏幕并打开)它会按预期工作。
    【解决方案2】:

    我迟到了几年,但我想我会来回答 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 由这个人在这里维护 :)。

    【讨论】:

      【解决方案3】:

      通常使用 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)
      })
      

      【讨论】:

        猜你喜欢
        • 2011-03-10
        • 2011-09-01
        • 2017-05-21
        • 1970-01-01
        • 2014-09-10
        • 2014-03-15
        • 1970-01-01
        • 2021-10-13
        • 2018-03-07
        相关资源
        最近更新 更多