0

2つの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値が2回カウントされるため(アプリケーションで1回、トリガーで2回目)、あまり好きではありません。

この状況を確実にする方法について、私にアドバイスはありますか?

4

1 に答える 1

2

強制しようとしている不変条件については完全にはわかりませんが、問題の一般的な概要から、トリガーコードを使用してそれを強制し、SERIALIZABLE トランザクションを使用する傾向があります。そうしないと、複数のテーブルに不変条件を適用するのが非常に難しくなります。

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

完全な開示: 私の雇用主は複数のテーブルにまたがる複雑な整合性ルールを適用する必要があったため、MIT の Dan RK Ports と共に SSI を PostgreSQL に追加する作業を行いました。

于 2012-04-24T16:12:35.147 に答える