0

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

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;

“credit_review_aggregated.valid_to_review_id”列是“credit_review.id”的FK。

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

  1. 禁用删除和更新两个表中的记录
  2. 在聚合表上创建触发器以检查输入的数据是否正确(如果不正确,则不允许插入)。我不太喜欢它,因为当将记录插入聚合表时,credit_amount 值将被计算两次(一次在应用程序中,第二次在触发器中)。

您对我如何确保这种情况有一些建议吗?

4

1 回答 1

2

我并不完全清楚您要强制执行的不变量,但从问题的一般轮廓来看,我倾向于使用触发代码来强制执行它,并使用 SERIALIZABLE 事务。否则,在多个表中强制执行不变量会很快变得非常棘手。

http://wiki.postgresql.org/wiki/SSI

全面披露:因为我的雇主需要跨多个表强制执行复杂的完整性规则,所以我与麻省理工学院的 Dan RK Ports 一起将 SSI 添加到 PostgreSQL。

于 2012-04-24T16:12:35.147 回答