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