メールアドレスは一意ですか、それとも主キーですか?


11

私はデータベースの初心者です。文字列の比較が遅く、複雑な結合のパフォーマンスに影響するため、メールアドレスを主キーとして使用することはおそらく良いアイデアではないことがわかりました。メールを変更すると、すべての外部キーを変更する必要があり、多くのことを必要とします。努力の。

しかし、私のユーザーテーブルですべてのユーザーがメールアドレスを持っている必要があり、それらのメールアドレスはそれぞれ一意である必要がある場合、メール列に一意のインデックスを追加するだけで十分ですか?Afaikの一意のフィールドではnull値が許可されているため、私はすべてのユーザーがnull値を許可せずに電子メールアドレスを持っている必要があります。ここで見逃しているものはありますか?または、電子メール列を一意にし、サーバーでのデータ検証中に、ユーザーが電子メールアドレスを入力してすべてのユーザーが1つ持つことを確認するとしますか?


3
ユーザーが自分の電子メールアドレスを変更するとどうなるか-たとえば、仕事を変更する場合
user151019

1
文字列の比較は低速であるだけでなく、文字列も整数よりも大きくなる傾向があるため、メモリ内のページに収まる数が少なくなり、クエリの論理読み取りが増加します。
Nameless One

回答:


7

最初にキーとインデックスを区別しましょう。キーは論理モデルの一部であり、多くの場合、一意のインデックスで実装されます。ただし、キーを作成せずに一意のインデックスを作成することはできますが、外部キーから参照することはできません。

候補キーは、テーブル内の行を一意に識別するものです。SQLでは、通常、候補キーの1つが主キーとして使用されます(ckの1つが他よりも「優れている」と考えられている理由は本当にわかりませんが、それはもう1つです。ストーリー)、残りのckは一意の制約になります。

一意制約は、主キーと同じように使用できます。検討してください:

create table A ( x ... not null
               , y ... not null
               , z ... not null
               ,     unique (x)
               ,     primary key (y,z) );

create table B ( x ...
               ,   ...
               ,     foreign key (x) references A (x) );

create table C ( y ...
               , z ...
               ,   ...
               ,     foreign key (y, z) references A (y, z) );  

Bは一意制約を参照し、Cは主キー制約を参照します。

NOT NULLは、さらに別の種類の制約です。あなたの場合、あなたはそれをユニークに宣言せずにこれをメールに強制することができます。

投稿の次の側面は、キーの安定性に関係します。キーは安定している必要があります(ただし、変更できないことを意味するわけではなく、不変である必要はありません)。一部のDBMSは、このような操作に役立つON UPDATE CASCADEを実装していますが、モデルの周囲にキーが分散されている場合は、更新に手間がかかります。

あなたの場合、おそらく私は主キーとして別の候補キーを選択し、電子メールがNOT NULLで一意であることを宣言します。


1
SQL Serverでは、一意のインデックスをFKとして参照できます。
マーティン・スミス

1
SQLにアクセスできないため、自分で確認できません。一意のインデックスを作成すると、暗黙的に一意の制約が作成されますか?
Lennart、2014

1
いいえ。一意の制約は少し異なる方法で処理され、一意のインデックスと比較して追加のメタデータと追加の制限がありますが、SQL ServerではFKでどちらを使用することもできます。
マーティンスミス

1
それは少し奇妙です、インデックスはsql標準でさえ言及されていませんが、キーはその中心的な部分です。とにかく、情報をありがとう。
Lennart 2014

メールに外部キーが付けられたレコードが多数ある場合、更新がカスケードされると、それらすべてのレコードを更新するのにかなりの時間がかかる可能性があることに注意してください。
cimmanon 14

6

はい、EmailAddress列に一意のインデックスがあっても問題ありません。唯一の問題は、誰かがあなたのサービスにサインアップした後にメールアドレスをあきらめたが、あなたに言わなかった場合、そのメールアドレスの所有者がサインアップしようとする人です。しかし、それはかなりまれなエッジケースです。

一意インデックスがデータベースプラットフォームに依存するnull値を許可するかどうかについて。Oracleでは、SQL Serverは単一のNULL値を許可しています。これを解決するには、列にNULL値を許可せず、その列に一意のインデックスを作成します。


1
SQLサーバーについてはそうではありません。whereたとえば、NULLインデックスから値を除外できる句を使用してインデックスを作成できます。
カークウォル

1
ステートメントSQL Server allows a single NULL valueはまだ真実です。複数のNULL値を取得する方法がないということではありません。私は答えた人が答えを単純にしようとしていて、余分な詳細(フィルターされたインデックス付きなど)を説明しようとしていなかったと思います。
ブランドン

1
はい、フィルター処理されたインデックス全体を完全に覆すことができたかもしれませんが、単純な質問では通常、単純な答えが必要です。データベースプラットフォームとバージョンがなければ、私は自分の答えを一般的なものにします。
mrdenny、

2

EmailAddressに一意のインデックスがあれば問題ありません。

必須フィールドとしてメールアドレスを使用するためのアプリケーションの検証があることをすでに述べたように、他の検証はデータベースからのものであるため、メールアドレスを持たないユーザーを受け入れず、エントリの重複とこれらの検証を防止しますこの一意のインデックスが課されます。

SQL Serverの他の回答で述べたように、一意のインデックスを作成する前に、列にnull値を許可しないようにする必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.