存储最新事件数据的最佳方法

2024-04-29 02:00:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我们使用一个基于事件的系统,其中使用postgres数据库来存储审计事件。目前,我们使用postgres物化视图来存储任何事件的最新条目。对于任何修改数据的事件,我们都会更新主事件审核表,并刷新物化视图,但这非常耗时。我们使用下面的python代码来刷新视图,但它只是删除旧视图并重新创建它,这非常耗时

await connection_pool.execute(
                    "REFRESH MATERIALIZED VIEW CONCURRENTLY events_current"
                )

我想这不是正确的处理方法,我的方法是创建一个新表,并将事件的最新数据保存在那里。请让我知道这是否合适,或者是否有更好的方法

如果需要更多信息,请告诉我


Tags: 数据方法代码视图数据库execute系统事件
1条回答
网友
1楼 · 发布于 2024-04-29 02:00:11

物化视图不是一个糟糕的解决方案,但前提是您可以将其视为“时间点”(工作日开始,或在最后3小时内……)。对于“此时此刻”的需求,这不是一个好的解决方案。你的似乎是后者
最好的选择是创建一个获取最新数据的视图。如果由于审计事件的大小,这是不可行的,那么需要寻找其他地方。我不喜欢创建包含最新数据的表。这就是复制数据,而复制数据的必然性最终是不同的。但是我想到了一个小小的转变:创建一个只包含事件id和事件审计日志id的表,只维护最后一个审计id。如果没有完整的表定义(ddl),我只能显示一个框架设置,但您应该明白了

create table event_last_audits( 
             event_id integer 
           , ea_id    integer
           , constraint last_event_audits_pk primary key (event_id) 
           , constraint last_event_audits_2fk   
                        foreign key (ea_id)
                        references event_audits(ea_id)
           );

然后,您可以在同一触发器中维护事件审核和事件上次审核。比如:

create or replace function  audit_events()
  returns trigger 
  language plpgsql
as $$
begin 
    with audit_rec( event_id, ea_id)  as 
         ( insert into event_audits(event_id, dml_action,old_status) 
               select new.event_id
                    , tg_op
                    , case when tg_op='INSERT'
                           then null 
                            else old.status 
                      end
             returning event_id, ea_id
         ) 
    insert into event_last_audits(event_id, ea_id) 
         select event_id, ea_id
           from audit_rec
             on conflict (event_id) 
             do update 
                    set ea_id = excluded.ea_id; 
     return new; 
end; $$; 
     
create trigger audit_events_aiur
       after insert or update on events 
       for each row 
       execute function audit_events(); 

demo

相关问题 更多 >