规范化PostgreSQL中定期收集并可能具有多个重复项的大型数据集

规范化PostgreSQL中定期收集并可能具有多个重复项的大型数据集,postgresql,microsoft-graph-api,Postgresql,Microsoft Graph Api,我正在尝试决定如何处理特定类型的数据。我们有一个探测器,每5分钟从云服务收集一次历史会话详细信息。我们使用返回的数据进行分析 由于云服务在向其系统中插入新的历史记录方面可能会出现一些延迟,因此我们决定在每次查询时要求提供最后15分钟的数据,因为我们不想丢失任何数据。因此,每5分钟,我们会询问过去15分钟内填充的记录。我们现在面临一些挑战: 将有重复的会话条目 每条记录将返回200多列 记录的列实际上可以根据它们提供的数据类型进行分类,因此我们计划基于这一事实制定规范化策略。但这带来了另一个挑

我正在尝试决定如何处理特定类型的数据。我们有一个探测器,每5分钟从云服务收集一次历史会话详细信息。我们使用返回的数据进行分析

由于云服务在向其系统中插入新的历史记录方面可能会出现一些延迟,因此我们决定在每次查询时要求提供最后15分钟的数据,因为我们不想丢失任何数据。因此,每5分钟,我们会询问过去15分钟内填充的记录。我们现在面临一些挑战:

  • 将有重复的会话条目
  • 每条记录将返回200多列
记录的列实际上可以根据它们提供的数据类型进行分类,因此我们计划基于这一事实制定规范化策略。但这带来了另一个挑战:

  • 如何规范化数据,并在需要时使用适当的键将它们连接在一起
现在,我们的重点是在每次数据收集时将所有内容都放在一个表中。最后30分钟可能有1000条记录。我们将从中找到一种方法,将其分发到各个子表。例如,记录中与音频相关的列将转到音频表,视频列将转到视频表,依此类推

我知道我没有给出太多关于数据的细节,但我希望我能表达我的观点

您会推荐什么样的策略,以便我可以从我的Postgres数据库中获得合理的写/读性能

注意:我们正在尝试集成的云服务提供通信服务,每个调用可能会在历史数据库中生成多个记录。不幸的是,没有一个字段可以使记录全局唯一。为了实现这一点,我们需要一起考虑多个列,如StistTyTimes、SudioSyId、SeaMeNyType、MydiaType。我之所以提到这一点,是因为我认为这也给在不复制数据的情况下将多个表连接在一起带来了挑战


提前感谢。

您概述了两个问题:

  • 检测负载数据中的重复项
  • 规范化为单独但“可连接”的表
  • 第一个可能更难。在数据中,您需要找到一个自然密钥,而不是生成的密钥。(在类似的项目中,我使用探针(实际上是一个仪表)序列号和探针读数的时间戳,确保记录并始终以UTC进行处理,因为这不会受到DST异常的影响)。如果类似的列不可用,您仍然必须找到唯一的列或列集。然后,您可以识别并不加载复制的数据,或者在下一阶段绕过它

    第二个问题相对简单。您可以创建一个“父”表来保存基本探针信息,如:序列号、制造日期、上次维护、位置等。您可以生成一个代理密钥或用户密钥(序列号)。如果使用代理,请确保声明自然代理是唯一的。然后根据需要为每个实体创建一个单独的表。在加载过程中用于标识唯一性的其余列集将迁移到每个表,或者它们本身将成为一个中间表。无论哪种方式,最终分发表都有一个指向父级的外键,可以是直接的,也可以是通过中间的。因此,使用一种中间体,你可以得到如下结果:

    -- staging table: date is not maintained after loadiing (at least not long) 
    -- it will either be archieved or deleted. This is NOT permiante Data
    -- but it IS a perminate table.
    create table probe_staging
           ( probe_ident text                  -- from prob for id
           , transmission_time  timestamptz    -- from prob for id
           , captured_time timestamptz         -- generated
           , loaded_timestamp timestamptz      -- generated 
           , start_time      timestamp         -- prob data 
           , conference_id   text              -- ... 
           , conference_type text
           , media_type      text
           , constraint probe_staging_uk 
                        unique (probe_ident, transmission_time) 
           ) ; 
    
    -- of course columns are just examples. But overall structure valid. 
    create table probe_master 
           ( probe_id bigint generated always as identity 
           , probe_ident text
           , in_servace_date timestamptz
           , last_maintenance_date timestamptz
           , constraint probe_master_pk 
                        primary key (probe_id)
           , constraint probe_master_bk 
                        unique (probe_ident)
           ); 
    
          -- of course columns are just examples. But overall structure valid.
     
    create table probe_transmission 
           ( probe_transmission_id bigint generated always as identity 
           , probe_id  bigint
           , transmission_time  timestamptz       
           , start_time      timestamp          
           , conference_id   text              
           , conference_type text
           , media_type      text
           , constraint probe_transmission_pk
                        primary key (probe_transmission_id)
           , constraint probe_trans_2_master_fk
                        foreign key (probe_id)
                        references probe_master(probe_id)
           , constraint probe_trans_bk
                        unique (probe_id, transmission_time) 
           ); 
    -- of course columns are just examples. But overall structure valid. 
    create table probe_transmission_audio
           (probe_transmission_audio_id bigint generated always as identity
           ,probe_transmission_id bigint
           , audio_data bytea 
           , constraint probe_transmission_audio_pk
                        primary key (probe_transmission_audio_id)
           , constraint probe_trans_audio_2_trans_fk
                        foreign key (probe_transmission_id) 
                        references probe_transmission(probe_transmission_id)
           );
    -- of course columns are just examples. But overall structure valid.      
    create table probe_transmission_video
           (probe_transmission_video_id bigint generated always as identity
           ,probe_transmission_id bigint
           , video_data bytea 
           , constraint probe_transmission_video_pk
                        primary key (probe_transmission_video_id)
           , constraint probe_trans_video_2_trans_fk
                        foreign key (probe_transmission_id) 
                        references probe_transmission(probe_transmission_id)
           );  
          
     ... 
           
    

    如果您没有探头的传输时间,请使用您确定的自然密钥。我假设您可以从它传输的数据中唯一地识别探测器本身。我已经使用了prob_\ident这一术语。

    非常感谢您的详细解释。我一定要试一试。