On Sat, Nov 19, 2022 at 6:47 PM Stavros Koureas
<koureasstav...@gmail.com> wrote:
>
> Hi all,
>
> Working with PostgreSQL Logical Replication is just great! It helps a lot 
> doing real time replication for analytical purposes without using any other 
> 3d party service. Although all these years working as product architect of 
> reporting i have noted a few requirements which are always a challenge and 
> may help enhance logical replication even better.
>
> To the point:
> PostgreSQL14 Logical Replication allows replication of a table to another 
> table that exists in another database or even in another host. It also allows 
> multiple upstream tables using the same structure to downstream into a single 
> table.
> CREATE PUBLICATION pb_test FOR TABLE test
>
> PostgreSQL15 Logical Replication allows even better replication options, like 
> selecting subsets of the columns from publisher tables. It also supports 
> plenty of options like disable_on_error etc.
> CREATE PUBLICATION pb_test FOR TABLE test ("id", "name")
>
> What does not support is the option for defining custom column expressions, 
> as keys or values, into the upstream (publication). This will give more 
> flexibility into making replication from multiple upstreams into less 
> downstreams adding more logic. For instance, in a project for analytical 
> purposes there is the need to consolidate data from multiple databases into 
> one and at the same time keep the origin of each replicated data identified 
> by a tenanant_id column. In this case we also need the ability to define the 
> new column as an additional key which will participate into the destination 
> table.
>
> Tenant 1 table
> id serial pk
> description varchar
>
> Tenant 2 table
> id integer pk
> description varchar
>
> Group table
> tenant integer pk
> id integer pk
> description varchar
>
> Possible syntax to archive that
> CREATE PUBLICATION pb_test FOR TABLE test ({value:datatype:iskey:alias} 
> ,"id", "name")
>
> Example
> CREATE PUBLICATION pb_test FOR TABLE test ({1:integer:true:tenant} ,"id", 
> "name")

I think that's a valid usecase.

This looks more like a subscription option to me. In multi-subscriber
multi-publisher scenarios, on one subscriber a given upstream may be
tenant 1 but on some other it could be 2. But I don't think we allow
specifying subscription options for a single table. AFAIU, the origin
ids are available as part of the commit record which contained this
change; that's how conflict resolution is supposed to know it. So
somehow the subscriber will need to fetch those from there and set the
tenant.

-- 
Best Wishes,
Ashutosh Bapat


Reply via email to