19

我正在开发一个包含在 Cordova 中的移动应用程序,它与我们基于 PHP 和 MySQL 的基于 Web 的应用程序一起运行。移动应用程序使用本地存储并通过已编写的服务层获取数据,以在移动应用程序和 MySQL 数据库之间交换数据。移动应用程序仅使用存储在主 MySQL 数据库中的数据子集。

我正在寻找用 pouch DB 替换我的移动应用程序本地存储解决方案并看到它需要 CouchDB ...这让我想到了一个潜在的配置/解决方案,我想知道它是否是可取和可行的.. .

在主 MySQL 数据库和移动应用程序的 PouchDB 之间建立一个作为中介/从属运行的 CouchDB 数据库是否可行?移动服务层将使用这个数据库(以及必要时的主 MySQL 数据库),主 SQL 和沙发数据库之间的数据更新通过 cron 定期推送。CouchDB 只会存储 MySQL DB 中与移动应用程序相关的数据子集。

这个解决方案听起来像是矫枉过正/一个好主意吗?有没有更好的方法来处理上述设置?我确实喜欢 pouchdb-CouchDB 的想法……但不想重写我的整个 web 应用程序以使用 couch-DB,而提供移动特定数据子集的额外抽象级别似乎很有用。

谢谢追踪

4

3 回答 3

10

运行在 Node 上的 PouchDB 实际上可以使用任何基于 LevelDOWN 的适配器,并且有一个用于 MySQL。我没有测试过。更多信息在这里: http: //pouchdb.com/adapters.html#pouchdb_in_node_js

但是,这可能不太适合您的用例,因为 PouchDB 将存储在 MySQL 中的数据将与您的应用程序当前在 MySQL 中使用的数据完全不同。为了支持复制,PouchDB 保存了每个文档的修订历史(想想 git),这与 MySQL 等传统数据库不同,后者只存储可以删除/插入/更新的表和行。像 CouchDB 和 PouchDB 这样的数据库是从头开始构建的,以支持复制,这就是存在这个版本控制系统的原因。

话虽如此,如果您在 MySQL 和 CouchDB 之间编写自己的同步层,理论上它可以工作,但可能会因为工作量太大而失去 CouchDB 和 PouchDB 内置复制的好处。

于 2014-06-04T16:05:49.870 回答
1

我正在尝试使用我们的 ERP(基于 SQL Server)实现相同的架构。

现在我只是想弄清楚移动设备上的 pouchdb 是否足以满足要求,例如:

  • 能够通过“产品描述”过滤给定的“价目表”。将 sql 中的 LIKE 视为 on:

    SELECT * FROM 价格 WHERE 描述 LIKE '%text%'

  • 能够按“产品类别”或“产品供应商”过滤给定的“价目表”

此外,移动应用程序只需要完整 SQL 模式/数据的子集。我的想法是简化移动 pouchdb <-> coouchdb 复制部分,这可能只是使用 webSQL <-> SQL Server 具有挑战性),然后稍后通过一个过程将 coouchdb 上添加的数据“复制”到 SQL Server,想想一个cron任务。

到目前为止,我发现:

  • 在客户端构建 pouchdb 视图可能需要很长时间才能构建,这只是为了能够执行 LIKE 操作的第一点。为了解决这个问题,我构建了一个辅助 websql db,它只包含 (pouchdb_id, pouchdb_text),我在复制后重建它,插入 pouch 键和连接的对象文本字段。然后,当我需要 LIKE 时,我在 webSQL 上进行操作,并使用 db.allDocs({ keys: [sql returned keys array] }) 使用 pouchdb 获取文档

  • 第二点是我现在的分析...

分析目前正在进行中,任何想法都会很高兴分享。

于 2014-06-05T16:47:34.290 回答
1

您可以使用以下 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.
于 2016-07-19T01:28:22.680 回答