Мобильное приложение с использованием PouchDB-CouchDB и MySQL

Я разрабатываю мобильное приложение, завернутое в Cordova, которое работает вместе с нашим веб-приложением на основе PHP и MySQL. Мобильное приложение использует локальное хранилище и получает данные через уровень сервисов, которые были написаны для обмена данными между мобильным приложением и базой данных MySQL. Мобильное приложение использует только подмножество данных, хранящихся в основной базе данных MySQL.

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

Можно ли настроить базу данных CouchDB, которая работает в качестве посредника/ведомого устройства между основной базой данных MySQL и PouchDB мобильного приложения? Уровень мобильного сервиса будет использовать эту базу данных (а также основную базу данных MySQL, если это необходимо), а обновления данных между основной базой данных SQL и кушетки периодически передаются через cron. CouchDB будет хранить только подмножество данных из базы данных MySQL, которое имеет отношение к мобильному приложению.

Звучит ли это решение как излишество/хорошая идея? Есть ли лучший способ приблизиться к настройке, описанной выше? Мне нравится идея pouchdb-CouchDB... но я не хочу переписывать все свое веб-приложение для использования Couch-DB, в то время как дополнительный уровень абстракции, предоставляющий подмножество данных для мобильных устройств, кажется полезным.

Спасибо Трейс


person trace    schedule 04.06.2014    source источник


Ответы (3)


PouchDB, работающий на Node, может фактически использовать любой адаптер на основе LevelDOWN, и есть один для MySQL. Я не проверял это. Подробнее здесь: http://pouchdb.com/adapters.html#pouchdb_in_node_js.

Однако это, вероятно, не подходит для вашего варианта использования, потому что данные, которые PouchDB будет хранить в MySQL, будут полностью отличаться от данных, которые ваше приложение в настоящее время использует в MySQL. Чтобы поддерживать репликацию, PouchDB хранит историю изменений каждого сохраненного документа (например, git), что отличается от традиционной базы данных, такой как MySQL, которая просто хранит таблицы и строки, которые можно удалить/вставить/обновить. Такие базы данных, как CouchDB и PouchDB, были созданы с нуля для поддержки репликации, поэтому существует эта система управления версиями.

При этом, если вы напишете свой собственный уровень синхронизации между MySQL и CouchDB, теоретически он может работать, но, вероятно, это потребует такой большой работы, что вы потеряете преимущества встроенной репликации CouchDB и PouchDB.

person nlawson    schedule 04.06.2014
comment
Спасибо за ответ. Я думаю, что пока отложу переписывание клиента, так как он работает, и буду следить за решением в будущем. Я нашел кое-что интересное для чтения по вашей ссылке (1), так что спасибо за это. (1) Хорошая статья о хранилище мобильных приложений: html5rocks.com/en/tutorials/ оффлайн/квотное исследование - person trace; 05.06.2014

Я пытаюсь добиться той же схемы с нашей ERP (на основе SQL Server).

Теперь я просто пытаюсь выяснить, будет ли достаточно pouchdb на мобильном телефоне для требований, например:

  • Чтобы иметь возможность фильтровать заданный "прайс-лист" по "описанию товара". Подумайте LIKE в sql как на:

    SELECT * FROM Prices WHERE Описание LIKE '%text%'

  • Чтобы иметь возможность фильтровать данный «прайс-лист» по «категории продукта» ИЛИ по «поставщику продукта»

Кроме того, мобильному приложению потребуется только подмножество полной схемы/данных SQL. И моя идея заключалась в том, чтобы упростить часть репликации мобильного pouchdb ‹-> Couchdb, которая может быть сложной только с webSQL ‹-> SQL Server), а затем позже «реплицировать» добавленные данные на coouchdb на SQL Server с помощью процесса, подумайте о задаче cron.

До сих пор я нашел:

  • Построение представления pouchdb на стороне клиента может занять целую вечность, только для первой возможности выполнить операцию LIKE. Чтобы решить эту проблему, я создал вспомогательную базу данных websql, которая просто содержит (pouchdb_id, pouchdb_text), где я перестраиваю ее после репликации, вставляя ключи пакета и конкатенируя текстовые поля объекта. Затем, когда мне нужно LIKE, я делаю это на webSQL и извлекаю документы с помощью pouchdb, используя db.allDocs({keys: [массив возвращенных ключей sql]})

  • Второй пункт находится на моем анализе прямо сейчас...

Анализ в настоящее время продолжается, и любой идеей было бы неплохо поделиться.

person Javier Castro    schedule 05.06.2014
comment
Извините за медлительность построения представления. Мы знаем, что это проблема, и мы работаем над этим. - person nlawson; 05.06.2014
comment
Привет, Хавьер. Это звучит точно так же, как я пытаюсь сделать, и рад слышать, что есть другие, пытающиеся сделать то же самое. Существует так много крупных веб-приложений, основанных на реляционных базах данных, которым, вероятно, требуется мобильное приложение, что мотивирует потребность в интеграции sql-no-sql. Я был удивлен, что нашел так мало информации по теме. Пока это единственные 2 относительно интересные ссылки, которые я нашел по теме. Они оба используют слова «сумасшедшие»… (1)github.com/kesla/mysqldown ( 2)percona.com/live/mysql- конференция-2012/сессии/ - person trace; 06.06.2014

Вы можете использовать следующий пакет NodeJS: https://www.npmjs.com/package/couchdb-to-mysql.

Пакет прослушивает изменения CouchDB и отражает их в MySQL.

Пример

var converter = require('couchdb-to-mysql');
var cvr = converter();
cvr.connect();
cvr.on('created', function (change) {
    // replicate changes on mysql     
});

Методы

var converter = require('couchdb-to-mysql')
var cvr = converter(config={})
Optionaly pass in a config:

config.couch.host
config.couch.port
config.couch.database
config.mySQL.host
config.mySQL.port
config.mySQL.user
config.mySQL.password
config.mySQL.database
events
cvr.on('created', function (change) {})
Every time a document is created, a created event fires.

cvr.on('updated', function (change) {})
Every time a document is updated, a updated event fires.

cvr.on('deleted', function (change) {})
Every time a document is deleted, a deleted event fires.
person Ano Tisam    schedule 19.07.2016