私は休止状態でpostgresを使用しており、2つのSQLテーブルがあります。「TABLE_2」は「TABLE_1」と多対一の関係にあります。
CREATE TABLE "TABLE_1"
(
"ID" bigint NOT NULL,
"VALUE" bigint NOT NULL,
CONSTRAINT "PK_TABLE_1 " PRIMARY KEY ("ID" ),
)
CREATE TABLE "TABLE_2"
(
"ID" bigint NOT NULL,
"TABLE_1_ID" bigint,
CONSTRAINT "PK_TABLE_2" PRIMARY KEY ("ID" ),
CONSTRAINT "FK_TABLE_2-TABLE_1" FOREIGN KEY ("TABLE_1_ID")
REFERENCES "TABLE_1" ("ID") MATCH SIMPLE
ON UPDATE CASCADE ON DELETE ????????
)
テーブル 2 には、テーブル 1 のエントリに依存する多数 (数百万) のエントリが存在する場合があります。テーブル 1 のエントリを削除すると、テーブル 2 のすべての依存エントリも削除する必要があります。(メモリ不足例外なし)
それを行うための2つの可能な解決策があります。
テーブル 2 で「ON DELETE CASCADE」を使用します。
カスケードされたエントリを削除するビジネス ロジックを実装する
バツ
while (true) {
recTable2 = table2Dao.findForTable1(table1, 100);
if (( recTable2 != null) && (recTable2 .size() > 0)) {
for (Table2 Table2entry : recTable2) {
table2Dao.remove(Table2entry);
}
} else {
break;
}
}
メモリ不足の例外を回避するために、1 ステップで 100 エントリのみが削除されます
ここで私の質問:
「ON DELETE CASCADE」でソリューション 1 を使用すると、削除するデータが大量にある場合はどうなりますか? 私はメモリ不足の例外を取得しますか、それとも postgres はこれを「自動的に」処理しますか?
ビジネス ロジックでソリューション 2 を使用すると、パフォーマンスが非常に低下します。多くのテーブル エントリを削除するより良い方法はありますか??
カスケード テーブル エントリを削除するには、一般的にどちらの方法を使用しますか? ビジネスロジックで行うか、それとも「ON DELETE CASCADE」で行うか?