问题是,如果我已经将数据存储在PostgreSQL中,而我需要使用CouchDB和PouchDB进行离线同步,我该怎么办?
谢谢!
请确保只写在CouchDb上,PostgreSQL仅用于读取数据。在这种情况下,您可以使用CouchDb的_changes订阅来将所有数据复制回您的PostgreSQL数据库以进行只读访问。
使用:https://github.com/pramsey/pgsql-http 您可以在表上使用触发器,将任何插入/更新/删除转换为 HTTP POST 请求发送到 CouchDB,并更新 PostgreSQL。请参阅 https://github.com/sysadminmike/couch-to-postgres 的中间部分。
我还没有看到针对你的问题的直接解决方案,但是你可以从这个新技术中获取一些想法。
如果您想要移动在线/离线同步,可以使用GraphQL复制协议而不是CouchDB复制协议。
一个快速的技巧是在PostgreSQL前使用Hasura “即插即用”GraphQL反应式后端,为其提供离线/在线GraphQL同步功能。在前端,您需要RxDB(它使用PouchDB作为存储引擎)或Apollo JS(它是GraphQL客户端)。这些是Javascript库,类似的东西可能存在于移动世界中。
关于数据库架构,它可能不像你想象的那么即插即用。您必须对要复制的表进行一些调整。根据CAP定理,PostgreSQL(作为SQL数据库)为您提供数据一致性和可用性(无分区能力)。然后,CouchDB / PouchDB为您提供数据可用性和可分区性(最终一致性)。
离线优先应用程序的数据库必须是最终一致的,并且能够处理版本冲突,因为当文档/行在两个不同的地方同时更改时,可能会发生这种情况。
所需求的是在PostgreSQL上实现最终一致性特性。这可以通过在每个离线优先准备好的表中创建一个名为revision_id的列并将其作为表的主键的一部分以及另一个具有先前revision_ids列表的列来完成。
我自己从未尝试过,但这里有一个tutorial解释了所有内容。