2011-11-07 16 views
2

私はプライマリキーとインデックスを理解していると思います。プライマリキーとユニークインデックスの使用を確認してください

私の設定では、私はいくつかの列を持つテーブルを持っています。これらの列のうち2つはユーザーIDとユーザー名です。 理想的には、どちらもユニークで、nullを許可しないようにしたいと思います。

私の知る限りでは、これはNULLにならない最も重要なフィールドであるため、データベースが大きくなるにつれて変更されることはないため、ユーザーIDを主キーとして使用することをお勧めします。

残念ながら、NULLになる可能性がありますが、別の行で同じになるように、ユーザー名列を一意のインデックスとして持つ必要があります。

これは、両方の列をユニークで非NULL可能にする方法がない限り、これを行います。

答えて

0

私のアプリケーション開発とデータウェアハウスの両方の経験から、ビジネス設定で使用されていない別のプライマリキーを使用し、プライマリキーとしてユーザーIDを使用しないことをお勧めします。ユーザーIDをプライマリキーとして使用すると、問題が発生する可能性があります。私は各列を(別々に)索引付けします。

ユーザーをマージまたは再割り当てしたり、IDなどを変更したりする必要がある場合は、実際にユーザーIDをプライマリキーとして使用すると、その操作に多くの問題が発生します。

また、ウェブ上では、....user/1/detailsのようなURLを見て、 '1'から '2'に変更したり、他の人の情報を表示したりする可能性があります。 IDが '57489574389ghfjghfjghf'のようにユニークであれば、URLをハックするのは難しいでしょう。 「自然」と「代理」キーがここではうまく説明されて

選択の間:
http://www.agiledata.org/essays/keys.html

この領域の問題の人々の経験のほとんどは、このようなマージや削除などのエッジケースのためのものです。これらは通常、初期段階で優先順位は低くなりますが、時間が経つにつれて懸念が高まり、設計が不適切なソリューションが崩壊し始めます(通常、データ品質が「認識された」時点で、古いデータを「修正」することはできませんし、規則なしでは、それらと共存する新しいレコードを導入することは困難です。これは古いレコードを更新する能力がまだ必要であることを前提としています。

+0

マイケルさん、非常に徹底的な答えです。私はイントラネットを作成するだけの贅沢さを持っていますが、実際にはログインユーザーをほとんど使用していません。セキュリティは現時点で機能の第2位ですが、現在のところ、このように機密データが保護されておらず、ユーザーの設定だけが変更されるため、将来変更される可能性があります。 – Eds

+1

@Eds:私は反対です... "IDが '57489574389ghfjghfjghf'のようにユニークであることはひどい提案です。これは、あなたのIDは常にGUIDであるべきだということに似ています。 ユーザーは.../user/2/detailsを使用してサイトをスクラップすることができますが、アプリケーションの設計とバグは貧弱です。貧弱なデータベース設計によって過剰に過ごすべきではありません。 –

4

Username列をNOT NULLとして宣言して、ユニークなインデックスを置くことはできますが、インデックス自体はNULL以外の値を強制しませんが、フィールド定義が有効になるため、一意のnull不可能なフィールドになります。

+0

ありがとう、これはおそらく私が行くつもりです! – Eds

0

ノップ、両方のアカウントで間違っていると申し訳ありません。

1)あなたが望むならば、PKが変わることができることを除いて、ほとんどすべてについて。

2)ユニークなインデックスは、定義上、一意であり、繰り返すことはできません。あなたが意味するのは、ユニークではない普通の古いインデックスです。これは繰り返すことができます。その目的は、そのフィールドで頻繁にフィルタリングする場合にクエリを高速化することです。そうでなければ、それを使用しないほうが良いです。

必要なもの:Column1 =主キー(nullではない)、Column2 =一意索引(nullではない)、あなたの言ったこととまったく同じですが、今度は必要に応じて動作する理由が分かりました。

編集:また、あなたはインデックスと非nullableの間のコアレーションを行うようです。索引であるかどうかに関係なく、列をnull不可能にすることができます。

+0

お返事ありがとうございました – Eds

0

マイケルと完全に同意します。プライマリキーの列には、特にuserIDのような意味のあるデータは入れないでください。したがって、PKの他の列を追加してシーケンスから入力する必要があります。

また、Darhazerに同意してください:ユーザーIDフィールドとユーザー名フィールドの両方にNOT NULL制約と一意のインデックスを入れる必要があります。

+0

ありがとうございました! – Eds

関連する問題