本当に基本的なポイント(と私が考えるもの)を指摘する答えがありません。つまり、主キーは、同じ実世界のエンティティに対してテーブルに2つのエントリが取得されないことを保証するものです(データベースでモデル化された)。この観察は、主キーの良い選択と悪い選択を確定するのに役立ちます。
たとえば、(米国)州の名前とコードの表では、名前またはコードのいずれかが主キーである可能性があります-それらは2つの異なる候補キーを構成し、それらの1つ(通常はより短い-コード)が主キー。機能依存関係(および結合依存関係-1NFから5NFまで)の理論では、主キーではなく重要なのは候補キーです。
反例として、人間の名前は一般的に主キーの悪い選択になります。「ジョン・スミス」や他の似たような名前で行く人はたくさんいます。ミドルネームを考慮に入れても(覚えておいてください:誰もが持っているわけではありません-たとえば、私は持っていません)、複製の余地はたくさんあります。したがって、人々は主キーとして名前を使用しません。彼らは社会保障番号(SSN)や従業員番号などの人工的な鍵を発明し、それらを使用して個人を指定します。
理想的な主キーは、短く、ユニークで、覚えやすく、自然なものです。これらの特性のうち、一意性は必須です。実際のデータの制約を考えると、残りは柔軟でなければなりません。
したがって、特定のテーブルの主キーを決定する場合は、そのテーブルが何を表しているかを調べる必要があります。テーブル内の列値のセットは、テーブル内の各行を一意に識別しますか?それらは候補キーです。さて、各候補キーが4列または5列で構成されている場合、それらが(主に短さを理由に)良い主キーを作成するには不格好であると判断するかもしれません。そのような状況では、代理キー(人工的に生成された番号)を導入する場合があります。多くの場合(常にではありませんが)、代理キーには単純な32ビット整数で十分です。次に、この代理キーを主キーとして指定します。
しかし、あなたがしなければならない通常の列のものをセットにユニーク制約を置くことによって-まだ他の候補キーことを確認してください(代理キーのためにあまりにも候補キーと同様に、選ばれた主キーです)、すべての一意の識別子として維持されます。
行を一意にするものを特定するのが難しい場合がありますが、単に情報を繰り返すだけではそれが真にならないため、何かを行う必要があります。また、注意していないと同じ情報を格納することを意図して2つ(またはそれ以上)の行を取得し、情報を更新する必要がある場合、1つの行だけを更新する危険性(特にカーソルを使用する場合)があります。すべての行ではなく、行が同期していないため、どの行に正しい情報が含まれているかは誰にもわかりません。
これは、いくつかの点で、かなり固い見方です。
必要なときにGUIDを使用しても特に問題はありませんが、GUIDは大きくなる傾向があり(16〜64バイトなど)、頻繁に使用されます。多くの場合、完全に適切な4バイト値で十分です。4バイトの値で十分なGUIDを使用すると、ディスク領域が無駄になり、インデックスページごとの値が少なくなるため、データへのインデックス付きアクセスも遅くなるため、インデックスはより深くなり、より多くのページを読み取る必要があります。情報。