5

原則として、ネイティブの主キー (つまり、既存の列または列の組み合わせ) を使用するのと、主キーを整数の自動生成行に設定するのとではどちらがよいでしょうか?

編集:これはこの質問
に非常に似ていることが指摘されています。

ここでのコンセンサスは、私の自然な傾向である代理キーを使用することですが、上司から、可能であれば自然キーも使用するように言われました。Name in row はそれを一意に識別し、古いデータを表示する機能を維持する必要があるため、名前/ルールへの変更は新しい一意の行を意味するため、彼のアドバイスはこの特定のアプリケーションに最適である可能性があります。

ここでの回答はすべて役に立ちますが、それらのほとんどは主観的な「これがあなたがすべきことです」に基づいており、裏付けとなる情報源を引用していません. 重要な読み物がいくつか抜けているのでしょうか、それともベスト プラクティスのデータベース設計が非常に主観的であり、アプリケーションに依存しているのでしょうか?

4

6 に答える 6

8

主キー

  1. 行を一意に識別する必要があります。
  2. データを含めることはできません。含まない場合、データが変更されると変更されます(これは悪いことです)
  3. 操作の比較を高速化する必要があります(WHERE句/結合)

理想的には、行に人工(代理)キーを使用します。スペース効率が高く高速であるため、数値整数データ型(INT)が最適です。

主キーは、条件1.-3を満たすために、最小数のフィールドで作成する必要があります。大多数のテーブルの場合、この最小値は次のとおりです。1フィールド。

リレーションテーブル(または非常に特殊なエッジケース)の場合は、それより高くなる可能性があります。複合主キーを使用してテーブルを参照するのは面倒なので、それ自体で参照する必要があるテーブルには複合キーはお勧めしません。

リレーションテーブル(m:nリレーション)では、関連テーブルの主キーから複合キーを作成するため、複合キーは上記の3つの条件すべてを自動的に満たします。

データが一意であり、変更されないことが絶対に確実な場合は、データから主キーを作成できます。これを保証するのは難しいので、私はそれに対してお勧めします。

于 2009-02-10T13:48:57.693 に答える
2

常にint。

(外部キーを使用して)他のテーブルの要素を相互参照するときは、そうしてくれたことに感謝します。

于 2009-02-10T13:50:08.597 に答える
1

それが何であれ、意味のないものにします(代理キー)。意味のある主キーは致命的です。

于 2009-02-10T13:42:37.133 に答える
1

それは純粋主義者と実用主義者の間の古い戦争です。純粋主義者は代理の主キーを受け入れず、自然なものだけを使用することを主張します。あなたが私に尋ねれば、私はほとんどの状況で増分(代理キー)に投票します。

于 2009-02-10T13:44:36.487 に答える
0

私は自動生成と言いますが、私の心にない本当の理由はありません。ある種のハッシュテーブルを開発している場合を除いて、それでも、データベースによって自動的に作成された一意の主キーに固執します。その迅速、シンプル、そして信頼性。ホイールがすでに存在する場合は、ホイールを再発明しないでください。

于 2009-02-10T13:42:47.087 に答える