За пределами пар ключ/значение: конкурентное видение

Автор: Евгений Рыжков и Татьяна Головко Дата публикации: 28.03.2011

Хотя история знала много различных способов реализовать локальное хранилище, с приходом HTML5 все более-менее устаканилось. Новый API стандартизировался и получил быструю поддержку в большинстве браузеров, платформ и устройств. Но как веб-разработчик ты можешь сказать: «это не совсем то, что нужно». И ты будешь прав, в реальной жизни 5Mb часто оказывается недостаточно. Будущее локального хранилища это… как бы так сказать… есть ряд вариантов развития.

Один вариант связан с аббревиатурой (скорей всего тебе знакомой) — SQL. В 2007 Google начал разработку Gears — кроссбраузерного плагина, который включал поддержку баз данных на основе SQLite. Этот стандарт способствовал созданию спецификации Web SQL Database. Базы данных Web SQL (WebDB) представляют собой надстройку над SQL, которая позволяет Javascript делать вот такие вещи:

openDatabase('documents', '1.0', 'Local document storage', 5*1024*1024,
function (db) {
	db.changeVersion('', '1.0', function (t) { t.executeSql('CREATE TABLE docids (id, name)');}, error);
});

Как видишь, большая часть действий содержится в строке метода executeSql(). Эта строка поддерживает любой синтаксис SQL, включая SELECT, UPDATE, INSERT и DELETE. Это тот же backend программинг, который теперь можно реализовывать на Javascript! Афигеть!

В таблице ниже приведен перечень браузеров, поддерживающих спецификацию Web SQL Database:

IE Firefox Safari Chrome Opera iPhone Android
- - 4.0+ 4.0+ 10.5+ 3.0+ -

Конечно, если ты сталкивался в своей жизни более, чем с одной базой данных, то ты в курсе, что "SQL" — это скорее маркетинговый термин, чем жесткий стандарт. Есть официальная спецификация — SQL-92. Но ни один сервер в мире не соответствует только ей. Существуют Oracle SQL, Microsoft SQL, MySQL SQL, PostgreSQL SQL и SQLite SQL. Каждый из этих продуктов с течением времени добавляет свои возможности в SQL. Поэтому, говоря "SQLite SQL" ты сообщаешь недостаточное количество информации: нужно знать также версию данного продукта.

Все это подводит нас к одной заметке, которая находится в начале спецификации Web SQL Database:

Спецификация зашла в тупик: все заинтересованные разработчики уже используют серверный SQL (SQLite), но нам нужно несколько независимых реализаций, чтобы двигаться по пути стандартизации. Пока другие разработчики заинтересованы в реализации этой спецификации, описание диалекта SQL было оставлено как обычная ссылка на Sqlite, который неприемлем для стандарта.

На этом фоне, я расскажу о конкурирующем видении реализации локального хранилища для веб-приложений: Indexed Database API (ранее известный как "WebSimpleDB"), а сейчас более известен как "IndexedDB".

Indexed Database API предоставляет то, что называется хранилище объектов. В данной реализации очень много схожих понятий с базами данных SQL. Есть «база данных», состоящая из «записей», а каждая запись может иметь несколько «полей». Каждое поле может иметь определенный тип данных, который определяется при создании базы данных. Можно выбрать часть записей, перечислив их с «курсором». Изменение в сохраненных данных происходит в рамках «транзакции».

Если сталкивался с программированием SQL баз данных, то тебе эти термины знакомы. Основное отличие в том, что хранилище объектов не имеет структурированного языка запросов. Ты не можешь сделать запрос подобный "SELECT * from USERS where ACTIVE = 'Y'". Вместо этого нужно использовать методы, предоставляемые хранилищем объектов, чтобы открыть базу данных USERS, перечислить записи, отобрать записи с активными пользователями и использовать методы доступа, чтобы получить значения каждого поля каждой записи. The early walk-through of IndexedDB — хороший учебник по IndexedDB, в котором так же есть сравнение с Web SQL Database.

На момент написания книги, ни один из популярных браузеров не поддерживал IndexedDB. Mozilla упоминала о поддержке IndexedDB в некоторых своих сборках, но не было даже намека на поддержку в Frefox 4. Для контраста, Mozilla заявили, что вообще не будут внедрять поддержку Web SQL Database. Google рассматривает как вариант поддержку IndexedDB. И даже Microsoft заявили, что IndexedDB — это отличное решение для Веб.

Так что же ты как разработчик можешь делать с IndexedDB сейчас? На данный момент — вообще ничего. Может быть через год? Возможно. Нужно «держать нос по ветру».

Куда дальше