IndexedDB 是一种不断发展的 Web 标准,用于在浏览器中存储大量结构化数据,并使用索引对这些数据进行高性能搜索。Mozilla 针对该规范提交了大量技术反馈,我们计划在 Firefox 4 中实现它。我们与著名的 Web 开发者进行了交谈,讨论了如何为 Web 开发一个优雅的结构化存储 API。虽然 Safari、Chrome 和 Opera 的版本支持一种名为Web SQL 数据库 的技术,它使用SQL 语句作为传递给 JavaScript API 的字符串参数,但我们认为开发者美学是一个重要的考虑因素,并且这是一个针对客户端 Web 应用程序特别不优雅的解决方案。我们把开发者反馈带给了IndexedDB 规范编辑,并且还与微软交谈,他们同意我们IndexedDB 是 Web 的一个不错的选择。随着 Chrome 团队正在进行的额外实现,我们认为解释我们的设计选择是值得的,以及为什么我们认为 IndexedDB 比 Web SQL 数据库更适合 Web。
Web 应用程序已经可以在 IE 8+、Safari 4+、Chrome 4+、Opera 10.5+ 和 Firefox 2+ 中利用localStorage
和 sessionStorage
来存储键值对,并使用简单的 JavaScript API。现在广泛实现的Web 存储标准(包含 localStorage
和 sessionStorage
)对于存储少量数据很有用,但对于存储大量的结构化数据就不那么有用。虽然许多服务器端数据库使用SQL 来以编程方式存储结构化数据并有意义地查询它,但在客户端,在 JavaScript API 中使用 SQL 一直存在争议。
SQL?哪种 SQL?
许多 Web 开发者肯定熟悉SQL,因为许多开发者接触的服务器端代码(例如 PHP 和数据库操作)与客户端代码(例如 JavaScript、CSS 和标记)一样多。但是,尽管 SQL 享有普遍性,但没有一个规范性的 SQL 标准来定义该技术。特别是,SQLite 支持大部分SQL-92,有一些明显的遗漏,并且 WebDatabase API 是基于它的。但 SQLite 本身并不是规范——它是一种发布就绪的技术!而关于 SQLite 使用的 SQL 支持子集的最佳定义是SQLite 手册。为了真正理解 Web SQL 数据库,我们首先要开始为 Web 应用程序定义一个有意义的 SQL 子集。为什么要定义另一种语言,而 JavaScript 本身存在更优雅的解决方案呢?
SQLite 的优点和缺陷
我们认为 SQLite 对于应用程序来说是一项非常有用的技术,并且将其提供给Firefox 扩展和受信任的代码。我们认为它不是向通用 Web 内容公开的 API 的合适基础,原因至少是,没有一个可信的、广泛接受的标准可以以有用的方式对 SQL 进行子集划分。此外,我们不希望 SQLite 的更改将来影响 Web,也不认为利用主要浏览器版本(和 Web 标准)来使用 SQLite 是谨慎的做法。IndexedDB 没有这个问题;即使我们对 IndexedDB 的底层实现可能是基于 SQLite 的,但我们通过公开一个不基于 SQLite 支持语法的 API 来让开发者免受 SQLite 更改的影响。
美学和 Web 开发者
去年,我们在 Mozilla 校园举办了一次峰会,讨论 Web 上的存储。我们邀请 Web 开发者与我们讨论 Web 上理想的结构化存储 API。许多人确实表示接受基于 SQLite 的 API,因为他们已经尝试了某些浏览器中 Web SQL 数据库的版本,并声称流通中的东西比一组想法更好。然而,所有人都对更好的设计选择表示热情,以及更简单的模型如何让他们生活更轻松。我们看到开发者在白板上画了一个简单的BTree API,该 API 满足了他们的应用程序存储需求,这激励我们考虑其他选择。我们决心,使用表示 SQL 命令的字符串缺乏“Web 原生”JavaScript API 的优雅,并开始寻找替代方案。与微软一起,我们发送了关于 IndexedDB 提案的反馈,并积极参与了标准化工作。
在另一篇文章中,我们比较了 IndexedDB 和 Web SQL 数据库,并注意到前者在语法上比后者简单得多。IndexedDB 为第三方 JavaScript 库留出了空间,以使用 BTree API 来跨越底层原语,我们期待看到像BrowserCouch 这样的项目在 IndexedDB 之上构建。勇敢的 Web 开发者甚至可以在 IndexedDB 之上构建 SQL API。我们特别欢迎在 IndexedDB之上实现 Web SQL 数据库 API,因为我们认为这是技术上可行的。从基于 SQL 的 API 开始用于浏览器原语并不是正确的第一步,但对于基于 SQL 的 API 来说,在 IndexedDB之上肯定有空间。
我们希望继续与 Web 开发者就 Web 上的存储进行讨论,因为这有助于我们构建关于产品功能和未来 Web 标准的想法。我们期待看到下一代 Web 应用程序支持对索引数据的进行高性能搜索,并看到 Web 应用程序在“飞行模式”下更加健壮地工作。
链接
- IndexedDB 和 Web SQL 数据库 API 的比较.
- Mozilla 工程师 Vladimir Vukicevic 早期对 Web SQL 数据库 API 的反对意见.
- IndexedDB 规范.
- MDC 关于 localStorage 的文档.
117 条评论