【发布时间】:2011-12-05 18:28:20
【问题描述】:
问题:
我需要一个与设备无关(例如 HTML5)的解决方案,用于在手机或平板电脑类型的设备(例如 iOS/Android)上离线存储和查询 250,000 多行数据。我的想法是让人们在没有任何蜂窝数据连接的偏远地区工作,他们需要对这些数据运行查询并在离线时对其进行编辑。部分它将基于地理位置,因此如果他们所在的区域有资产(使用 GPS),那么它将显示这些资产并让它们进行编辑。当他们返回办公室时,他们可以将数据同步回办公室服务器。
我从 web 标准的角度来处理这个问题的原因基本上是通过在 HTML5 中编写一次然后跨多个平台而不是在 Objective C 和 Java 中编写两次来节省金钱和时间。此外,如果您编写的东西与平台无关,那么您就不会被锁定,也不会在每个人都转移到新的船时随船沉没。我们为 Windows Mobile 5 编写了一个类似的应用程序,现在它已经没用了,因为那个平台已经死了。
设备上的离线数据库需要是:
- 快速(响应时间不到 2 秒)
- 可能执行连接并与能够查询数据库的其他表建立关系
- 选择特定范围或标准内的数据,例如通过基于 GPS 读数的 x 和 y 坐标。
选项:
HTML5 本地存储:
适用于
缺点:
- 对于超过 10,000 行,即使在高端机器上,浏览器也会 慢到爬行。
- 无法对数据进行复杂查询以提取所需数据,因为您必须遍历整个存储并手动搜索。
- 可存储的存储量限制
Web SQL 数据库:
- 符合要求。
- 在 250,000 行(1-2 秒)上快速运行查询
- 可以创建复杂的查询、连接等
- 受 Safari、Android 和 Opera 支持,因此可在 iOS 和 Android 设备上运行
缺点:
- 自 2010 年 11 月起已弃用
- 跨目录攻击的安全漏洞。不是真正的问题,因为我们不会使用共享主机
索引数据库:
键/值对象存储类似于本地存储,除了索引。
缺点:
- 在 200,000 行上运行查询很慢(15-18 秒)
- 无法运行复杂查询
- 无法与其他表进行联接
- 主要手机或平板设备不支持,例如iPad/安卓
- 标准不完整
这留下了实施已弃用的 Web SQL 方法的唯一选择,该方法可能只能再工作一年左右。 IndexedDB 和本地存储目前无法使用。
我不确定 Mozilla 和 Microsoft 是如何弃用 Web SQL 数据库标准的,以及为什么 W3C 允许它发生。据说他们之间拥有 77% 的桌面浏览器市场。在高级移动设备上,Mozilla 和 Microsoft 对Safari, Opera and Android have over 90% of the market share 的影响几乎为零。 Mozilla 和 Microsoft 如何规定在最有可能使用离线存储的移动市场中应该使用哪种标准没有任何意义。
comments from Mozilla 关于他们为什么要使用 IndexedDB 的原因主要是关于“开发人员美学”,他们不喜欢在 JavaScript 中运行 SQL 的想法。我不买。
目前提议的标准是劣质的,并且是一个非常基本的 NoSQL 实现,速度很慢,甚至不支持人们在数据库中需要的高级功能。有很多样板代码来建立数据库并获取数据,但他们声称人们会在其之上编写一些不错的抽象库,以提供更高级的功能。截至 2011 年 10 月,它们已无处可见。
他们已经弃用了现有的 Web SQL 标准,该标准实际上可以在主要的移动/平板浏览器中运行并实现。而他们的“新”和“更好”标准在主要的移动浏览器中不可用。
作为开发人员,我们应该在接下来的 3-5 年内使用什么,届时 IndexedDB 规范可能会逐渐标准化,拥有更多功能,在主要的移动/平板电脑浏览器中实现,并且有一些不错的图书馆让事情变得更容易?
W3C 应该让 Web SQL 数据库标准保持并行运行并解决问题。它已经支持主要的移动平台,并且运行良好。 Mozilla 和微软作为拥有最多桌面浏览器份额的两个玩家能够让这个标准废弃这一事实是相当可疑的,并且可以被视为试图阻碍移动网络平台的进展,直到他们能够赶上并提供与 iOS/Safari 和 Android 竞争的解决方案。
总之,是否有人为我的问题提供了适用于 iOS/Android 的手机/平板设备的解决方案。也许是一个很好的包装 API,它可以在后台使用多个数据库实现并具有查询功能,它允许您选择哪个数据库具有优先级。我见过像lawnchair 这样的东西,但我很确定它只允许您默认使用本地存储并回退到其他存储。我想我宁愿它使用 Web SQL(默认情况下)而不是较慢的选项。
非常感谢您对解决方案的任何帮助,谢谢!
【问题讨论】:
-
文章写得好!这是本机应用程序赢得本机与 Web 应用程序争论的情况之一 - 但我知道您不想听到这种情况。在这种情况下,据我所知,Web SQL 是最好的选择——我还会强制用户下载与他们要去的位置相关的行,而不是整个数据库——如果你认为他们可能需要在某个地方更新一个可怕的连接,更不用说通过 1/5 大小的数据库搜索的速度提高了(不确定数据库的规模)
-
他们不能“只解决问题”与 WebSQL,因为标准推进到 W3C 推荐状态的要求之一是有“独立和可互操作的实现”。由于规范基本上是“做 SQLite 做的事情”,这永远不会发生。
-
嘿,你刚刚描述了我的期末考试项目 :) 在我看来,如果你需要离线和下降性能,有 2 个选项; 1.使用本地存储并将数据剥离到绝对基础。或 2. 构建一个原生应用程序(具有可扩展的 UI?),然后将其克隆到另一个平台(您已经在第一个平台上设置了规格,因此为其他平台再次开发它会更快。缺点是你必须保持不止一个)
-
因为在他们要求我们拥有的是 W3C 建议之前,没有浏览器实际实现。这三个浏览器都在使用 SQLite。没有 SQLite 规范,这就是为什么它不是标准的良好基础的原因之一。
-
@robertc 你是什么意思没有规范?它基于带有few minor omissions 的SQL92 标准。我找到了this page,这似乎是一个规范。此外,SQLite 网站上的all the other documentation 怎么样,这实际上是规范的一部分,不是吗?它还需要什么有效?
标签: javascript html web-sql indexeddb jaydata