データベース設計の基本を教えてください。
キーには、プライマリキーとユニークキーがあると思いますが、
ユニークキーはどのような時に使用するのが効果的(スピードが速い)でしょうか?
できれば例を出して説明していただければ助かります。
よろしくお願いします。
ユニークキーは 重複しないもので 検索対象となるものを 指定したらいいです。
例
商品マスタ
商品コード、商品名、価格、備考
というテーブルがあった場合、商品コードを ユニークキーに指定します。
なお、重複する商品コードは 存在させないものとします。
多少は違いますが基本的に同じです。
PostGreの場合 5.3.4. 参照
http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-8.1-ja/ddl-con...
http://www.postgresql.jp/document/pg801doc/html/infoschema-refer...
ご回答いただき、ありがとうございました。
参考になりました。
ユニークキーとプライマリーキーの性能差は大差ないと思います。
ご利用になられているDBが分かりませんが、Oracleでのことを考えると、機能としてこの二つの違いは
・プライマリーキーは一つのテーブルに一つだけ。
・プライマリーキーの列にはNULLを入れられない。
です。どちらもbinary Indexが使われるので検索スピードに大差はないと思います。考えられるとすれば、値がNULLのレコード数ですかね。
ご回答いただき、ありがとうございました。
参考になりました。
http://biz.rivus.jp/words/constraint.html
プライマリキーとユニークキーの違い
プライマリキーとユニークキーの違いは確実に 識別する(identification) ための主たる制約と NULL 以外の行が 一意であること(uniqueness) を保証するのための、その他の制約という違いがある。
さらに原則的に変更を許可するか、しないかという面もある。人間にとっては意味論的に異なるものであるが Oracle のデータベースにしてみれば、その内部の仕組みに大きな差はない。
例としては、ある顧客を会員番号を主キーとして管理している場合に (本籍)住所、氏名、生年月日のカラムの組み合わせが一意キーとして考えられる。
通常、この組み合わせのキーは一意である*1が変更可能であることに大きな違いがある。そして、これらの組み合わせでのリレーションは好ましいものではない。
一方、主キー(会員番号)は退会処理などを特別な処理しない限りは変更されることはない。不可能ではないが原則、変更不可能という位置づけである。
* キー制約とインデックスの関係
主キー制約および一意キー制約を定義すると同時にユニークインデックスが作成される(※)が、 DBMS(Oracle)の実装に関するものでキーとは関係がない。
すなわち、主キーや一意キーによるアクセスにインデックスを使用できることは実装における副産物であり SQLの規格には定義されていない。
(※) 遅延制約 の場合には NONUNIQUE インデックスが作成される。
多くの場合、ユニークキーによる検索はあいまい検索せざるを得なかったりしますので、ユニークキーとして定義すべきかどうかは正直なところ「?」です。
ご回答いただき、ありがとうございました。
参考になりました。
http://www.bitscope.co.jp/tep/MySQL/quickMySQL.html#doc1_id698
たとえばメールアドレスとパスワードでログインするシステムを考えるとします。
ユーザ情報テーブルがあり、フィールドとしては
ID,メールアドレス,パスワード,名前,......
などの時、IDはプライマリーキーにします。
IDは自動連番の数字がよいでしょう。
同じメールアドレスが複数存在すると、システムとしてはどのユーザでログインすればよいのかわからないので、メールアドレスはユニークキーにします。
もちろんメールアドレスのINSERTやUPDATEの場合、同じメールアドレスが複数存在しないようにプログラムのほうでアルゴリズムをきちんと考える必要があります。
ご回答いただき、ありがとうございました。
参考になりました。