特に識別目的の列(この場合はphoto_id)がある場合は、2番目のキー列は必要ありません。
同じphoto_idと異なるuser_idを持つ複数のレコードが存在する可能性がある場合は、多対多の関係を作成し、単一の主キーを保持するための中間テーブルを用意する方がよいと思います。例えば:
CREATE TABLE photos (
"photo_id" serial,
-- other columns
PRIMARY KEY ("photo_id")
);
CREATE TABLE users (
"user_id" serial,
-- other columns
PRIMARY KEY ("user_id")
);
CREATE TABLE photos_users (
"photo_user_id" serial,
"photo_id" integer, -- not sure if this datatype is correct for postgres
"user_id" integer, -- not sure if this datatype is correct for postgres
PRIMARY KEY ("photo_user_id")
);
私の知る限り、問題のテーブルに特定のid列がない場合は、2番目のキー列が必要であり、1つのキーのみを使用すると重複する可能性があります。この例を以下に示します。
CREATE TABLE Person (
"FirstName" varchar NOT NULL,
"LastName" varchar NOT NULL,
"PostalCode" varchar NOT NULL,
PRIMARY KEY ("FirstName", "LastName", "PostalCode")
);
上記の場合FirstName
、主キーとして持つのに十分な一意性はなく、また、もそうFirstName
でLastName
はないため、この場合、少なくとも3つの列が使用されます。もちろん、ID
またはPersonID
列を作成し、それを主キーとして使用することをお勧めします。
パフォーマンスに関する限り、主キーはあまり影響を与えません。インデックスが気になります。WHERE
句で使用される列、JOIN
またはAGGREGATE
インデックスを持つ列があることを確認してください。