0
接合テーブルproducts_tags
の2つのテーブルproduct
とtag
があります。製品にはさまざまなタグがあり、タグにはさまざまな製品がありますが、1つの製品と1つのタグの関係は一意である必要があります。接合テーブルの更新
CREATE TABLE product (
id serial PRIMARY KEY NOT NULL,
name varchar(255) NOT NULL
)
CREATE TABLE tag (
id serial PRIMARY KEY NOT NULL,
name varchar(255) NOT NULL
)
CREATE TABLE products_tags (
product_id integer NOT NULL REFERENCES product(id),
tag_id integer NOT NULL REFERENCES tag(id),
PRIMARY KEY(product_id, tag_id)
)
私は現在、製品のオブジェクトと、それがフロントエンド層により更新されるたびに
tags
配列を送信することにより、接合テーブルを更新する予定しております
は、現在のproduct_id
が含まれているproducts_tags
内のすべての行を削除し、新しい行を作成tags
配列内の各IDについてproducts_tags
になります。
私の質問です:これを達成するより効率的な方法はありますか?または、ジャンクション表のデータ保全性を保証するために行を削除して再挿入するのは唯一の方法ですか?
変更が最小限である(影響を受けた行が2 * Nかかる可能性がある)場合でも、行バージョンが多すぎると作成されます。 DBテーブルにないものを挿入し、新しいリストにないものを削除してください。 – wildplasser
あなたは正しい@wildplasserです。私は、これを処理するpostgres関数を作成すると思います。アプリケーション層でそれをやって、DBへのラウンドトリップが多すぎると面倒なように感じるかもしれません。 – Toni
ここでは機能は必要ありません。チェーン化されたCTEを使用して両方の操作を組み合わせることができます。そして、それを準備された声明の中に入れるかもしれない。 – wildplasser