2012-05-14 7 views
0

私は従業員データベース、emp_personテーブル(名、国籍、性別、... .etc情報)とemp_contractテーブル(hiredate、contract type、salary ...)をビルドしています。プライマリキーを割り当てる場所が不思議でした。これはベストプラクティスですか?assign Pk and FK

答えて

1

デザインでは、Emp_Idという名前の代理キー(AutoNumber)を作成し、emp_personテーブルの主キーとして定義します。 emp_contractテーブルにデータを格納するときに、同じキーを使用します。

数値列に作成される主キーは、ネストの練習です。レコードを一意に識別できる列がない場合は、テーブルに代理キーを作成します。

私はルールのカップルに従ってください。

  1. 主キーは必要な限り小さくする必要があります。数値型は よりもはるかにコンパクトな形式で格納されているため、数値型 を使用することをお勧めします。これは、ほとんどの主キーが外国の のキーであり、複数のインデックスで使用されているためです。 キーを小さくするほど、インデックスは小さくなり、キャッシュ内のページは少なくなります。 を使用します。
  2. 主キーは決して変更しないでください。主キーを更新する場合は、常に である必要があります。これは、 が複数のインデックスで使用され、外部キーとして使用される可能性が最も高いためです。 単一プライマリキーを更新すると、変更の波及効果が発生する可能性があります。

サロゲートとナチュラルキーについては、上記のルールを参照してください。ナチュラルキーが小さくて決して変更されない場合、ナチュラルキーはプライマリキーとして使用できます。ナチュラルキーが大きいか、または変更される可能性が高い場合は、サロゲートキーを使用します。プライマリキーがない場合、私はまだサロゲートキーを作成しています。これは、スキーマにテーブルを追加し、pkを配置することを経験が示しているからです。

アマンダ、あなたのコメントのための

ソリューションは、「私の問題は、私はすでにnvarchar型のPK(SQL Server 2008の)古い従業員表を持っていると私は他の2つのテーブルを作成したいですが、数にPKを変更した後とそれは既にFKの関係を持つ多くのテーブルに接続されています。私はPK char(シリアル番号部分)から部分文字列を取り、それが一意で新しいテーブルのPKにすることを計画しています...しかし、同じユニークなシリアル番号で、プライマリキーを更新し、すべてのFKテーブルへの更新をカスケードしたいのですが... PRIMARY KEY制約のアイソレーションがあります。

新しいテーブルを作成するそれに古いものと新しいpkの値が入っています。今まで何も壊れていないことを確認するために、両方の列に一意の制約を置いてください。

このキーをPKまたはFKとして使用するすべてのテーブルの制約を無効にします。

すべてのテーブルに対して更新を実行して、古い値を新しい値に変更します。

PKを有効にしてから、FKを有効にします。

+0

偉大な答え - 私は社会的セキュリティ番号/納税者IDのように、ユニークで変わらないものをプライマリキーとして使用しようとするアプリを見たことがありますが、間違ったSSNや誰かが間違って入力し、変更する必要があります。 – nvuono

+0

この場合、autonumberフィールドとtimestampフィールドもあるため、2つのレコードを同じにすることはできません。 –

+0

ありがとうございます4私の問題は、私はすでに古い従業員のテーブルをnvarchar PK(SQL Server 2008)と私は他の2つのテーブルを作成したいが、番号にPKを変更した後、それはすでにFG関係。私はそれがユニークであるPKのchar(シリアル番号部分)から部分文字列を取り、それを新しいテーブルのPKにするつもりです。私はほぼ12のレコードが同じユニークなシリアル番号と重複していると私はプライマリキーを更新し、すべてのFKテーブルに更新をカスケードしたい...しかし、私はプライマリキーの制約の孤立を持っています。助けてください – Amanda