我们有一个基于RoR的Web应用程序,它使用postgresql,现在我们必须将移动的应用程序与它集成,移动应用程序必须能够管理离线模式,因此我们需要在Web应用程序和移动应用程序之间同步信息。问题是,如果我将数据存储在postgresql上,并且需要使用couchdb和pouchdb进行脱机同步,我该怎么办?谢谢!
bvuwiixz1#
您是否可以确保只在CouchDb上写入数据,而PostgreSQL只用于阅读数据?在这种情况下,您可以使用CouchDb的_changes feed将所有数据复制回PostgreSQL数据库,以便进行只读访问。
ukqbszuj2#
使用:https://github.com/pramsey/pgsql-http,您可以在表上使用触发器来执行任何插入/更新/删除操作,并将它们转换为http post请求,以便对couch和postgres进行更新。
8iwquhpp3#
我还没有看到任何直接的解决方案,你的问题,但你可以得到一些想法,从这个技术,刚刚出炉。如果您想要移动的联机/脱机同步,可以使用GraphQL复制协议,而不是CouchDB复制协议。一个快速的技巧是在PostgreSQL的前端使用Hasura“即插即用”GraphQLReact式后端,使其具有离线/在线GraphQL同步特性。在前端,你将需要RxDB(它使用PouchDB作为存储引擎)或Apollo JS(它是一个GraphQL客户端)。这些都是javascript库,类似的东西可能存在于移动的世界。关于数据库体系结构,它可能不像想象的那样即插即用。你必须在你想要复制的表中做一些调整。根据CAP定理,PostgreSQL(作为一个SQL数据库)为你提供数据一致性和可用性(没有分区性)。然后CouchDB/PouchDB为你提供数据可用性和分区性(最终的一致性)。用于脱机优先应用程序的数据库必须最终保持一致,并且能够处理版本冲突,因为当文档/行在两个不同的位置同时更改时,可能会发生版本冲突。因此,需要在PostgreSQL上实现最终一致性特性。这可以通过在每个脱机优先就绪表中创建一个名为revision_id的列来实现,使其成为表主键的一部分,并在另一列中包含以前的revision_id列表。我从来没有试过,但这里是tutorial解释一切。
3条答案
按热度按时间bvuwiixz1#
您是否可以确保只在CouchDb上写入数据,而PostgreSQL只用于阅读数据?在这种情况下,您可以使用CouchDb的_changes feed将所有数据复制回PostgreSQL数据库,以便进行只读访问。
ukqbszuj2#
使用:https://github.com/pramsey/pgsql-http,您可以在表上使用触发器来执行任何插入/更新/删除操作,并将它们转换为http post请求,以便对couch和postgres进行更新。
8iwquhpp3#
我还没有看到任何直接的解决方案,你的问题,但你可以得到一些想法,从这个技术,刚刚出炉。
如果您想要移动的联机/脱机同步,可以使用GraphQL复制协议,而不是CouchDB复制协议。
一个快速的技巧是在PostgreSQL的前端使用Hasura“即插即用”GraphQLReact式后端,使其具有离线/在线GraphQL同步特性。在前端,你将需要RxDB(它使用PouchDB作为存储引擎)或Apollo JS(它是一个GraphQL客户端)。这些都是javascript库,类似的东西可能存在于移动的世界。
关于数据库体系结构,它可能不像想象的那样即插即用。你必须在你想要复制的表中做一些调整。根据CAP定理,PostgreSQL(作为一个SQL数据库)为你提供数据一致性和可用性(没有分区性)。然后CouchDB/PouchDB为你提供数据可用性和分区性(最终的一致性)。
用于脱机优先应用程序的数据库必须最终保持一致,并且能够处理版本冲突,因为当文档/行在两个不同的位置同时更改时,可能会发生版本冲突。
因此,需要在PostgreSQL上实现最终一致性特性。这可以通过在每个脱机优先就绪表中创建一个名为revision_id的列来实现,使其成为表主键的一部分,并在另一列中包含以前的revision_id列表。
我从来没有试过,但这里是tutorial解释一切。