如何在带有 PostgreSQL 数据库的 Web 应用程序中拥有完整的离线功能?

Posted

技术标签:

【中文标题】如何在带有 PostgreSQL 数据库的 Web 应用程序中拥有完整的离线功能?【英文标题】:How to have complete offline functionality in a web app with PostgreSQL database? 【发布时间】:2013-11-26 00:33:33 【问题描述】:

我想为一个带有 PostgreSQL 数据库的网络应用程序提供 100% 离线功能。在理想情况下,数据库应该在每个用户的浏览器中完全复制,并在联机时同步。因此,可以使用相同的代码与离线和在线数据库进行通信。我知道 PouchDB 和 CouchDB 可以做到这一点,但还没有找到适用于 PostgreSQL 的解决方案。这有可能吗?

【问题讨论】:

Web 应用程序真的是满足这些需求的正确选择吗? 【参考方案1】:

没有在客户端安装 PostgreSQL?不。显然你可以缓存数据以供离线使用,但是整个 RDBMS+javascript 中的过程语言,不。

【讨论】:

【参考方案2】:

简短回答:我不知道目前存在这样的事情。

但是,理论上,这可以工作......(长答案:)

    为levelup 编写一个PostgreSQL 后端(mysql 存在一个后端:https://github.com/kesla/mysqldown) 连接pouch-server 以使用 pouchdb 现有的 leveldb 适配器从您的 PostgreSQL 数据库读取/写入(反过来,必须将其配置为使用您的 postgres 后端)。恭喜,您现在可以使用 PouchDB 同步数据了!

这样的方法对于您的应用程序在现实中是否实用是您必须回答的另一个问题。

您可能想知道,例如,“我能否使用这种方法将包含多个表的现有复杂架构同步到客户端?”答案可能不是——leveldown 的 mysqldown 实现使用具有三个字段的单个 MySQL 表:idkeyvalue (source),我想任何通用 PostgreSQL 适配器都会类似(但没有人说你不能只为你的应用做一个特殊用途的适配器!)。

另一方面,如果您要在现有数据库架构上实现与 couchdb 兼容的 API(或子集 - 例如,您可能不需要附件),那么没有什么能阻止您在客户端上使用 PouchDB 进行对话直接就好像它是一个实际的 CouchDB 一样 - 只需弹出 URL 并调用replicate()!实现复制协议可能是一项相当大的工作,因为您需要在某处跟踪修订等 - 但同样,技术上并非不可能!

还有一些专为浏览器设计的 levelup 后端存储实现。请参阅level.js,这可能是服务器端 Postgres 升级后端和浏览器之间同步的另一种方式。


TL;DR:目前围绕 Javascript 数据库进行了大量工作。与 Postgres 同步是不可能的吗?可能不是。工作量会很大吗?确实。值得?谁知道呢,但这会很酷。

【讨论】:

以上是关于如何在带有 PostgreSQL 数据库的 Web 应用程序中拥有完整的离线功能?的主要内容,如果未能解决你的问题,请参考以下文章

如何备份一些带有数据的表和一些表只有模式 PostgreSQL

在 Postgresql 中选择带有计数的数据

如何将带有数组的普通值转换为 PostgreSQL 中的数据结构?

如何在 Postgresql 上将表格导出为带有标题的 CSV?

带有 Postgresql 的 Grails:无法在适当的模式中创建表

如何在 postgresql 中使用带有数组列的 GIN 索引?