Sql 只读数据库+;局部变化

Sql 只读数据库+;局部变化,sql,postgresql,Sql,Postgresql,我有一个位于远程服务器上的数据库,每隔一段时间我会将其转储到本地服务器上。在工作期间,我对本地副本进行了更改。我希望在从远程服务器重新加载数据库时保留这些更改 我一直在考虑的一个选择是使用相同的表创建两个数据库(local_xyz和remote_xyz)。来自远程服务器的数据加载到远程xyz中,并设置为只读。所有更新和新数据都写入本地_xyz。在两个数据库上执行选择,并对本地_xyz和远程_xyz进行联合 这似乎是一个复杂的解决方案,需要我更改所有查询以获得联合。我希望有另一种方法来实现这一点。

我有一个位于远程服务器上的数据库,每隔一段时间我会将其转储到本地服务器上。在工作期间,我对本地副本进行了更改。我希望在从远程服务器重新加载数据库时保留这些更改

我一直在考虑的一个选择是使用相同的表创建两个数据库(local_xyz和remote_xyz)。来自远程服务器的数据加载到远程xyz中,并设置为只读。所有更新和新数据都写入本地_xyz。在两个数据库上执行选择,并对本地_xyz和远程_xyz进行联合


这似乎是一个复杂的解决方案,需要我更改所有查询以获得联合。我希望有另一种方法来实现这一点。有什么提示/建议吗?

我已经用一个视图做了一个快速的POC,可能会对您有所帮助。您必须将所有
select
语句更改为点击
local\u merge
,而
insert
update
语句必须点击
local\u changes
(尽管您可能已经这样做了)


如果有人更新了您已在本地副本上更新的行,您会怎么做?您希望看到谁的更改?好问题,这将取决于应用程序的最终用户。现在我倾向于保留本地副本,但是每一行都有上次更新的时间戳,因此也可以使用。您要求我们为您设计一个数据库复制和合并系统。这是一项极其复杂的任务,任何完成的设计都将充满无数的权衡。我们无法回答你的问题。甚至连一本书都无法回答你的问题。只有您和您的设计团队才能回答您的问题。
create table remote (
    id serial primary key,
    val varchar(20),
    update_ts timestamp
);

create table local_changes (
    id integer primary key,
    val varchar(20),
    update_ts timestamp
);

insert into remote (val, update_ts) values ('Hello', current_timestamp);
insert into remote (val, update_ts) values ('Hello, Europe', current_timestamp);
insert into local_changes values (2, 'Hello, World!', current_timestamp);

create or replace view local_merge as
select remote.id, 
   case 
       when remote.update_ts > local_changes.update_ts 
           or local_changes.update_ts is null
           then remote.val
       else local_changes.val
   end as val,
   case 
       when remote.update_ts > local_changes.update_ts 
           or local_changes.update_ts is null
           then remote.update_ts
       else local_changes.update_ts
   end as update_ts
from remote left join local_changes
on remote.id = local_changes.id
;

-- example select
select * from local_merge where id = 2;