2009-04-14 12 views
1

すべてのテーブルにはIdのフィールド(UserId, PostId, FooIdなど)があります。私は通常これを主キーとします。データベースの主キー - > IDフィールドと名前フィールド?

私が持っているテーブルはCountriesと呼ばれています。それは

CountryId SMALLINT 
Name VARCHAR(100) -- Yes, english country names only, in this column. 
AndSomeOtherFields. 

今私はNameがユニークでなければならないことを知っています。すべての国名は一意です。それは良い/悪い/ルーローですか?PrimaryKey == CountryId ASCName ASC

もしそれが良いのであれば、なぜそれが良いのかを誰かが説明できますか?IdはPKですか?データの整合性が保証されているかどうかだけです(例:テーブルに2つの国名が存在しない場合)。それが悪ければ..なぜ?

ありがとうございました。

+0

#複製* http://stackoverflow.com/questions/166750/should-i-have-a-dedicated-primary-key-field * http://stackoverflow.com/questions/695325/should-i -use-natural-identity-columns-without-guidそして、これは私が右に見ることができるものです。この質問はかなりの回数聞かれました。 – cgp

答えて

6

プライマリキーを作成するCountryIdNameの両方が一意であるとは限りません。それぞれがCountryId - Nameのペアがユニークであり、明らかにCountryIdが "ID"であることが保証されています。たとえば、1-US19-USのように、ペアが一意であるため、依然として対応できます。

主キーとする主な理由は、CountryIdとNameの両方がWhere句で使用されているクエリを頻繁に実行する場合のみです。主キーは、デフォルトでであり、クラスタ化インデックスを作成します。このインデックスは物理的にテーブルをソートするため、これらの述語に対する行の検索が非常に高速になります。

もう一つの重要なポイントは、特定の例では、a)非常に短くb)多くは変わらない国のリストを保存していることです。このテーブルに対するルックアップは、あなたが何をするにしても、極端にになるでしょう。 SQL Serverが毎回フルテーブルスキャンを実行しなければならない場合でも、おそらく気付かないでしょう。ページの断片化を心配する必要はありません。 ID列をスキップしてNameを主キーとして使用できます。

IDを保持するだけでなく、国名の一意性を強制する場合は、[名前]列のput a Unique Constraintを使用できます。

一般的にプライマリキー、クラスタードインデックス、およびインデックスの問題を1回の回答で深すぎるものにすることは困難です。ここで始めるためにいくつかの良いリソースです:

+0

"主キーは物理的にテーブルをソートします。明示的に行われなければならず、どのインデックスに対しても実行できます。それ以外の場合は、これは忠実なアドバイスです。 – kquinn

+0

@kquinnありがとう、その明確化を追加しました。私は、初心者レベル(私たちがここにいるところにあるように思われる)でプライマリキーに自動的にクラスタ化インデックスが付いてくることを意味しました。 –

+0

ありがとう:)小さなテーブルなので、私は例としてCountriesテーブルを使用すべきではありません。問題はどんなサイズ表にも当てはめられていました。しかし、私はそれが誰よりも少なく頼まれているように感じる:) –

1

名前がPKになったのが、私はCountryIdはあなたのためのPKとして十分であると信じて、常に最善の解決策ではありませんテーブルの名前は、あなたが使用するフィールドである場合:選択、結合、このフィールドをこのようにインデックスする必要がありますこのフィールドでクエリのフィルタリングは、速度を向上させる多くの:

幸運:)

0

私が考えることができるのはかなり明白です:あなたのインデックスは少し大きくなります。あなたのテーブルは国を格納するだけなので、それほど大きな取引ではありません。しかし、なぜこのようなインデックスが好きですか? 国IDでソートした場合、の名前をでソートするのは無意味です。あなたはいつも同じ注文を得るでしょう。本当に悪い考えです

ことの一つは、大規模な主キーを指す外部キーを持っているので、あなたがその主キーを使用している場合、国を指し、あなたの外部キーがまだのみCountryIdを使用することを確認することですカラム。

0

国名は、国の識別情報を変更することなく変更されることが判明しています。これは、その名前がPKの一部であってはならないことを示唆しています。

0

一意性を強制する必要がある場合は、制約を使用します。

1

Nameにという固有インデックスを作成します。

関連する問題