如何保证PostgreSQL表中聚合数据的准确性?

如何保证PostgreSQL表中聚合数据的准确性?,postgresql,aggregate,Postgresql,Aggregate,我有两个PostgreSQL表-表A包含个别客户的信贷变动记录(增加/减少),表B包含汇总表A的数据。表的简化结构(我删除了FK和规则): 列“信用审查汇总。有效的审查id”是FK到“信用审查.id” 因为正确地保存聚合表中的数据非常重要,所以我正在寻找一种确保这种需要的方法。我突然想到: 禁用删除和自定义两个表中的记录 在聚合表上创建触发器,检查输入的数据是否正确(如果不正确,则不允许插入)。我不太喜欢它,因为当一条记录被插入到聚合表中时,credit_amount值将被计数两次(一次在应用程

我有两个PostgreSQL表-表A包含个别客户的信贷变动记录(增加/减少),表B包含汇总表A的数据。表的简化结构(我删除了FK和规则):

列“信用审查汇总。有效的审查id”是FK到“信用审查.id”

因为正确地保存聚合表中的数据非常重要,所以我正在寻找一种确保这种需要的方法。我突然想到:

  • 禁用删除和自定义两个表中的记录
  • 在聚合表上创建触发器,检查输入的数据是否正确(如果不正确,则不允许插入)。我不太喜欢它,因为当一条记录被插入到聚合表中时,credit_amount值将被计数两次(一次在应用程序中,另一次在触发器中)

  • 您有什么建议可以帮助我确保这种情况吗?

    我不完全清楚您试图强制执行的不变量,但从问题的总体概述来看,我倾向于使用触发器代码强制执行它,并使用可序列化事务。否则,在多个表之间强制执行不变量会变得非常棘手

    充分披露:因为我的雇主需要在多个表之间实施复杂的完整性规则,我与麻省理工学院的Dan R.K.Ports一起致力于将SSI添加到PostgreSQL

    CREATE TABLE "public"."credit_review" (
          "id" SERIAL, 
          "client_id" INTEGER NOT NULL, 
          "credit_change" INTEGER DEFAULT 0 NOT NULL, 
          "itime" TIMESTAMP(0) WITH TIME ZONE DEFAULT now()
    ) WITHOUT OIDS;
    
    CREATE TABLE "public"."credit_review_aggregated" (
      "id" SERIAL, 
      "credit_amount" INT DEFAULT 0 NOT NULL, 
      "valid_to_review_id" INT NOT NULL, 
      "client_id" INTEGER NOT NULL, 
      "itime" TIMESTAMP(0) WITH TIME ZONE DEFAULT now()
    ) WITHOUT OIDS;