一部の製品の価格を格納する次のテーブル (PostgreSQL 8.3) があります。価格は別のデータベースと同期されます。基本的に、以下のほとんどのフィールド (1 つを除く) はクライアントによって更新されませんが、別の株式データベースと同期するために、時々削除および更新されます。
CREATE TABLE product_pricebands (
template_sku varchar(20) NOT NULL,
colourid integer REFERENCES colour (colourid) ON DELETE CASCADE,
currencyid integer NOT NULL REFERENCES currency (currencyid) ON DELETE CASCADE,
siteid integer NOT NULL REFERENCES site (siteid) ON DELETE CASCADE,
master_price numeric(10,2),
my_custom_field boolean,
UNIQUE (template_sku, siteid, currencyid, colourid)
);
同期では、基本的に上記のほとんどのデータを削除しますが、my_custom_field が TRUE のデータを除きます (TRUE の場合は、クライアントが CMS を介してこのフィールドを更新したことを意味するため、このレコードを削除しないでください)。次に、数百から数千の行をテーブルに INSERT し、INSERT が失敗した場所 (つまり、(template_sku、siteid、currencyid、colorid) の組み合わせが既に存在する場所) で UPDATE を実行します。
私の質問は、主キーを作成するためにここでどのようなベスト プラクティスを適用する必要があるかということです。主キーも必要ですか?主キー = (template_sku, siteid, currencyid, colorid) を作成したかったのですが、colorid フィールドは NULL にすることができ、複合主キーで使用することはできません。
他のフォーラムの投稿で読んだことから、上記を正しく行ったと思います。明確にする必要があるだけです。
1) 必要になった場合に備えて、「シリアル」主キーを使用する必要がありますか? テーブル内の重要なデータは価格とカスタム フィールドであり、(template_sku、siteid、currencyid、colorid) の組み合わせによってのみ識別されるため、現時点ではそうではありません。
2) (template_sku, siteid, currencyid, colorid) は製品の価格を照会するために使用する組み合わせであるため、varchar である「template_sku」など、列にさらにインデックスを追加する必要がありますか? それとも、UNIQUE 制約は既に私の SELECT の適切なインデックスですか?