0

このテーブルには、ユーザーの写真(サムネイルとフル)が含まれています。
ほとんどのクエリには「WHEREuser_id=?」が含まれます 調子。

CREATE TABLE photos (
  "photo_id" serial, -- serial is postgres' autoincrement
  "user_id" integer not null, -- foreign key to users table
  "filename_thumbnail_50" varchar not null,
  "filename_thumbnail_75" varchar not null, -- 75px x 75px thumbnail
  "filename_full" varchar not null,
  PRIMARY KEY ("photo_id", "user_id")
);

このユースケースに最適な設計および/またはパフォーマンス設計は何
ですか?-上記の例のような2列の主キー?
-1つの主キー(photo_id)とuser_idのインデックス?

4

4 に答える 4

4

主キーはビジネスルールに従う必要があり、他には何も従わないでください。写真自体には「実際の」(つまり自然な)主キーがないため、PKとしてシリアルを使用することは絶対に理にかなっています。

主キーをで拡張しuser_idても意味がなく、目的もありません(photo_idとにかく一意になるため、インデックスの保守にオーバーヘッドを追加するだけです)。またuser_id、インデックスの2番目の列であるため、制限するクエリに使用される可能性はほとんどありuser_idません(不可能ではありませんが、可能性は低いです) 。

したがって、PKをオンにphoto_idして、インデックスを追加しますuser_id(とにかく、外部キー列にインデックスを付けることをお勧めします)。

于 2012-08-26T15:30:11.223 に答える
2

user_idはキーの2番目の列であるため、書き込まれた主キーはuser_idによる検索には使用できません。

2番目のオプションが最適です。これはレコードの一意の識別子であるため、photo_idのみの主キーであり、クエリ用にuser_idに個別のインデックスを追加します。

于 2012-08-26T15:29:56.510 に答える
0

IDを大きく増やした場合、主キーとしてuser_idが必要になるとは思いません。user_idのforignキーをユーザーテーブルに使用してみませんか(私はあなたがそれを持っていると思います)?

于 2012-08-26T15:34:33.503 に答える
0

特に識別目的の列(この場合は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、主キーとして持つのに十分な一意性はなく、また、もそうFirstNameLastNameはないため、この場合、少なくとも3つの列が使用されます。もちろん、IDまたはPersonID列を作成し、それを主キーとして使用することをお勧めします。

パフォーマンスに関する限り、主キーはあまり影響を与えません。インデックスが気になります。WHERE句で使用される列、JOINまたはAGGREGATEインデックスを持つ列があることを確認してください。

于 2012-08-26T16:07:08.153 に答える