使用PouchDB-CouchDB和MySQL的移动应用程序

20
我正在开发一个基于PHP和MySQL的Web应用程序,使用Cordova包装的移动应用程序并行运行。移动应用程序使用本地存储,并通过一层服务获取数据,这些服务是为了在移动应用程序与MySQL数据库之间交换数据而编写的。移动应用程序仅使用存储在主MySQL数据库中的数据子集。
我希望用PouchDB替换我的移动应用程序本地存储解决方案,发现它需要CouchDB...这让我想到了一个可能的配置/解决方案,我想了解是否可行和可行性...
是否可以设置一个CouchDB数据库,作为主MySQL数据库和移动应用程序的PouchDB之间的中介/从属关系?移动服务层将使用此数据库(如果必要还会使用主MySQL数据库),并且主SQL和couch-DB之间的数据更新定期通过cron进行推送。CouchDB仅存储与移动应用程序相关的MySQL DB子集数据。
这个解决方案听起来是否过度复杂/好主意?有没有更好的方法来处理上述设置?我喜欢pouchdb-CouchDB的想法...但不想重写整个Web应用程序以使用couch-DB,同时提供移动特定数据子集的附加抽象级别似乎很有用。
谢谢 Trace
3个回答

11

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内置复制功能的好处。


1
感谢您的回复。我认为我现在会暂时不进行客户端重写,因为它正在工作,并在未来寻找解决方案。我从您提供的链接(1)中发现了一些有趣的阅读材料,所以非常感谢。(1)关于移动应用存储的好文章:http://www.html5rocks.com/en/tutorials/offline/quota-research - trace

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.

1

我希望使用我们的基于SQL Server的ERP实现相同的模式。

现在我只是试图弄清楚移动端上的PouchDB是否足以满足要求,例如:

  • 能够通过“产品描述”筛选给定的“价格表”。类似于sql中的LIKE:

    SELECT * FROM Prices WHERE Description LIKE '%text%'

  • 能够通过“产品分类”或“产品供应商”筛选给定的“价格表”

此外,移动应用程序只需要部分SQL架构/数据。我的想法是使移动PouchDB <-> CouchDB复制部分变得容易,这可能仅使用WebSQL <-> SQL Server就很具有挑战性。然后稍后将添加的数据从CouchDB“复制”到SQL Server。

到目前为止,我已经找到了:

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

  • 第二个点是我目前正在分析的...

目前正在进行分析,任何想法都可以分享。


对于视图构建速度慢的问题,我们深表歉意。我们知道这是一个问题,并正在努力解决它。 - nlawson
你好Javier, 这正是我想做的事情,很高兴听到还有其他人在尝试同样的事情。有许多基于关系型数据库的大型Web应用程序可能需要移动应用程序,从而促使需要SQL - NoSQL集成的要求。我很惊讶在这个主题上找到如此少的信息。到目前为止,这些是我在该主题上发现的唯一两个稍微有趣的链接。它们都使用了“疯狂”的词语...(1)https://github.com/kesla/mysqldown (2)http://www.percona.com/live/mysql-conference-2012/sessions/crazy-mysql-integration-nosql - trace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接