create table operation ( id bigserial primary key , redo text not null , undo text not null , parent integer references operation(id) on delete cascade , redo_child integer references operation(id) -- must update before delete , redo_cs text not null , undo_cs text not null ); insert into operation (id, redo, undo, redo_cs, undo_cs) values (0, '', '', '', ''); create table current_operation ( id bigint primary key references operation(id) -- must update before delete ); insert into current_operation (id) values (0); create table snapshot_operation ( id bigint primary key references operation(id) on delete cascade , tag text not null unique ); create table restore_operation ( id bigint primary key references operation(id) -- set after reading inp ); insert into restore_operation (id) values (0);