Преобразование из WebSQL в IndexedDB

В настоящее время я работаю над мобильным приложением для отправки карт учета рабочего времени, которое работает с уже существующим бухгалтерским приложением. Излишне говорить, что это приложение в значительной степени зависит от реляционных баз данных, и эта конкретная зависимость переносится на мобильное приложение.

В текущем состоянии мобильное приложение использует WebSQL для автономного доступа к таблицам, загружаемым на устройство, когда у пользователя есть доступ в Интернет. Карты учета рабочего времени создаются в локальной базе данных, а затем загружаются, когда пользователь снова получает доступ в Интернет. Эта функция является ядром приложения.

Мой вопрос заключается в том, является ли переход на IndexedDB A.) Выполнимым и B.) Разумным шагом. Если бы WebSQL удалось избежать устаревания, это не было бы проблемой. Я начинаю лучше понимать IndexedDB и то, как JSON может сделать его полезным для относительно сложного хранилища данных, но я не могу понять, может ли он на самом деле воспроизвести функциональность реляционной базы данных.

Исходя из требований приложения, кажется, что IndexedDB не является альтернативой, но я все еще новичок в этой концепции и открыт для просветления.

Так может ли IndexedDB потенциально стать альтернативой? Можно ли использовать IndexedDB для репликации функциональности базы данных с несколькими связанными таблицами с большими объемами данных. Если да, то где я могу найти информацию о том, как это сделать. Если нет, есть ли у меня альтернатива этим двум? (Предполагая, что WebSQL действительно теряет поддержку, а IndexedDB нежизнеспособен).

Кстати, ускорит ли IndexedDB заполнение локальной базы данных? В настоящее время PHP используется для заполнения базы данных, когда пользователь находится в сети, и для заполнения таблицы сотней или около того вариантов требуется приличное количество времени. Когда число приближается к тысяче, приложение просто выходит из строя (это редкое явление, и клиентам настоятельно не рекомендуется использовать такой объем данных).

Любая помощь в этом была бы отличной, я очень новичок в программировании в целом и ОЧЕНЬ новичок в веб-разработке.


person Will    schedule 05.04.2012    source источник


Ответы (3)


Согласно 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 со свободной типизацией ад).

person DCoder    schedule 05.04.2012
comment
На самом деле я выполняю каждый запрос как отдельную транзакцию (я не писал код для этой части). Не могли бы вы потенциально указать мне правильное направление, как превратить мои сотни SQL-запросов в разумное количество? - person Will; 05.04.2012
comment
Сравнение производительности, проведенное Скоттом, не соответствует WebSQL. См. мой ответ здесь. - person Marcelo Cantos; 26.11.2012
comment
WebSQL обесценивается на большинстве платформ. Пожалуйста, обновите свой ответ соответственно. - person Braiam; 11.07.2013
comment
@Braiam: Все утверждают это, но реальность такова, что WebSQL имеет более широкую поддержку, чем IndexDB, поэтому он по-прежнему остается единственным реальным вариантом до тех пор, пока IndexDB не будет поддерживаться повсеместно (что на данный момент не так). - person Chepech; 13.09.2013
comment
Просто замечание по поводу поддержки. В настоящее время в iOS7 (это бета-версия для разработчиков) есть ошибка, из-за которой возникает исключение безопасности, когда размер БД превышает 5 МБ (обычно это вызывало всплывающее окно с просьбой принять или не принять увеличение размера БД на предыдущие версии). Это влияет только на веб-приложения, работающие в сафари. Если одно и то же веб-приложение запущено в полноэкранном режиме (веб-приложение добавлено на главный экран и открыто), оно работает должным образом. - person Chepech; 13.09.2013

Я опоздал на пару лет, но решил, что зайду и отвечу на вопросы ОП (как для его пользы (возможно), так и для всех, кто окажется здесь с такими же вопросами), на которые еще не ответили напрямую, а также предложить некоторые предложения!

у меня есть альтернатива двум? (Предполагая, что 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 поддерживается вот этим парнем :) .

person Kevin    schedule 11.07.2016

Обычно разработчики, работающие с SQL, испытывают трудности с использованием indexeddb из-за его сложного API.

Решение состоит в том, чтобы использовать любую библиотеку 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)
})
person Ujjwal Kumar Gupta    schedule 29.12.2017