我目前正在开展一个需要进行数据库同步的项目。我们在服务器上有一个主数据库,在它上面有一个webapp来与数据交互。但由于这些数据是地理数据(复杂的多边形和某些点),因此在处理多边形(我们使用QGIS)时,用户拥有本地数据库更方便,更有效,然后在服务器中上传更改。但是当用户在本地工作时,可能在服务器中修改了一些点(它只能与服务器上的点交互)。这就是我需要同步数据库的原因。
拥有本地数据库上的点的INSERT,UPDATE和DELETE历史以及服务器数据库上相同的历史应该足以重建点的历史记录然后进行同步。
顺便说一句,我们将Spatialite用于本地数据库,将PostGIS用于服务器主数据库
我在数据库中使用触发器找到了一堆关于如何执行此操作的资源:
http://database-programmer.blogspot.com/2008/07/history-tables.html
...
但是我无法找到任何工具或库,无需手动编写触发器。根据我的需要,我绝对可以手动完成,但我觉得使用专用的命令行/ API工具也可以使用起来更轻松,更方便。该工具将为用户想要跟踪历史记录的表生成历史记录表和触发器,我们还可以设想不同的选项,例如:
因此,总而言之,我的问题是:
感谢您的回答,
点心'
答案 0 :(得分:1)
Chek out GeoGig。 GeoGig可以跟踪和同步各种来源的地理数据,即Postgis,Esri shapefile和spatialite。它实现了典型的Git工作流程,但实现了数据。您将在服务器上拥有一个数据存储库,可以从本地工作站克隆和提取数据存储库。
GeoGit是一个年轻的项目,仍处于测试阶段,但功能强大,功能丰富,能够合并不同的提交,创建差异,切换分支,跟踪历史记录和所有其他典型的Git任务。
典型的GeoGig工作流程示例:
Geogig有一个舒适的命令行界面:
# on http://server, initialize and start the remote repository on port 8182 (defaut)
geogig init
geogig serve
# on local, clone the remore repository to your machine
geogig clone http://server:8182 your_repository
cd your_repository/
# on local, import in geogig the data you are working on (Postgis)
geogig pg import --schema public --database your_database --user your_user --password your_pass --table your_table
# on local, add the local changes
geogig add
# on local, commit your changes
geogig commit -m "First commit"
# on local, push to the remote repository
geogig push
答案 1 :(得分:1)
你可以让bucardo在多主同步方面做繁重的工作。看看https://bucardo.org/wiki/Bucardo 他们承诺甚至可以在不同类型的数据库之间进行同步,例如。 postgresql< - > sqlite,http://blog.endpoint.com/2015/08/bucardo-postgres-replication-pgbench.html
我不确定特殊的地理空间功能(仅同步区域)。
Geogig绝对值得一试。您可以将Geogig存储库直接插入GeoServer以服务WMS并通过Web / WFS编辑功能。
答案 2 :(得分:0)
正如Wander暗示的那样,这并不像“拥有INSERT,UPDATE和DELETE的历史”那么简单并且保持它们同步。引擎盖下有很多东西。有许多用于复制/镜像的DBMS工具。以下是PostreSQL的一个示例:pgpool。
答案 3 :(得分:0)
感谢Wander Nauta和David G的答案,我完全同意这样一个事实,即执行同步一般并不是这么简单。我应该提供更多细节,但我的情况是我相信它可能就足够了,因为:
为了提供有关上下文的更多信息,每个用户从航拍图像本地数字化区域中的区域。为每个用户分配一个区域进行数字化,并且能够在服务器上上传他的工作。在服务器上,通过webapp,用户可以查阅每个人的工作,发布问题点并对其进行评论,主要是指出对数字化的疑问或遗漏。我想要的是用户能够下载他们正在处理的区域副本以及他们的同事添加的分数,在本地解决问题,删除分数,最终添加新的疑问并再次上传。
本地数据库和服务器之间实际上没有主/从关系,每个都有一个特定的角色。因此,我不确定复制/镜像是否满足我的需求,但也许我错了?此外,我想避免使用过于复杂的解决方案来满足需求,并避免添加太多新的依赖,因为需求不会发生很大变化。