dポイントプレゼントキャンペーン実施中!

データベースの設計について教えてください。
基本的な質問ですみません。宜しくお願いいたします。


単純なテーブルで表現しますが、
パターンA、Bのどちらのテーブルで設計するのが良いのでしょうか。
DBはmysqlで5000万件のデータで検索のみのデータベースです。



【前提】
ユーザは複数のメールアドレスを持ちます。
画面から、このユーザのもつメールアドレスを表示させる仕様だとします。


【userマスタ】
(PK)ユーザID
  ユーザ名
  会社名


<パターンA>
【mailテーブル】
(PK)ユーザID
(PK)ユーザメールアドレス
  モバイル用アドレス



<パターンB>
 【mailテーブル】
(PK)ユーザメールアドレス
  モバイル用アドレス
  ユーザID ←インデックスをはります。

A 回答 (3件)

 メールアドレスは、一応、世界に一つしかないという前提はあるにはありますが、共有という悪質なパターンが世の中にはありますので・・・



 メールアドレスに重複は存在しないと言い切るなら、パターンBの変形で
  (PK)メールアドレス
    モバイル用アドレス
  (FK)ユーザーID

 この時のFKは、外部キーと言います。
 create table時に、制約条件として、
  constraint fk_mail foreign key user(ユーザーID)
のようにして定義します。

 プライマリーキーは、出来るだけシンプルな構造にするのがベストです。強制的にインデックスが生成される上、この組み合わせセットで検索をかけることを前提にインデックスが構成されますので、複雑にすればするほどどんどん効率が落ちます。

 余談ですが、もし、モバイル用アドレスにモバイル用のメールアドレスそのものを入れる予定でしたら、モバイル用アドレスも、メールアドレスの一つであると考えれば、モバイルアドレスというカラムは必要ないように感じます。もし、モバイルアドレスのみを抽出する必要があるということで、このカラムがyes noタイプのカラムであるとすれば、存在意義はあると思います。

 世の中には、悪質なパターン(メルアドの共有)が存在するという前提に立てば、パターンAとなります。この場合は、
  (PK)メールアドレス
  (FK)(PK)ユーザーID
    モバイル用アドレス
 
となりますね。ユーザーIDは、主キーの一部であり、かつ、外部キーともなっていることに注意してください。
 この前提条件の場合は、どうしても複合キーにする必要があります。行が一意になりませんので。

 どちらの前提に立つかは、アプリケーションの要求仕様によります。

 どちらにせよ、このような構成の場合は、マスター参照の為のキーは、外部キーとして定義しておく方が良いでしょう。データを操作する時の制約条件として自動的にチェックがかかりますし、検索にも良い影響が出ます。(確か、MySQLは、外部キー定義をすると当該カラムに自動的にインデックスを生成したと覚えています。)
 ORツールを使うなら、ツールに対するテーブル構造の説明にもなります。外部キーとして使用される前提でコードが生成されますから、よりよいコード生成が期待できます。
    • good
    • 0
この回答へのお礼

大変懇切丁寧に教えて頂きまして、ありがとうございました。
とてもわかりやすく説明してくださり、本当に助かりました。
どうもありがとうございました!

お礼日時:2010/06/14 08:15

参照のみということで集計テーブルだと仮定すると



userマスタ
・ユーザーID(PK)
・ユーザー名
・会社名

mailテーブル
・ユーザーID(FK)
・ユーザーメールアドレス
・モバイル用メールアドレス

こんな感じでどうでしょう。
複数人で同じメールアドレスを使う場合もあるでしょうし、メアドは主キーとして使わない方がいいと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます!

各ユーザには、携帯メールも、会社メールも、自宅でのフリーメールでも
ユーザが望む限り登録できる仕様になっています。


こういう場合、どういうテーブル構造がベストなのでしょうか?

お礼日時:2010/06/11 13:28

こうじゃないでしょうか



 【mailテーブル】
(PK)ユーザメールアドレス
  メール種別(自宅/会社/モバイル)
  ユーザID ←インデックスをはります。
    • good
    • 0
この回答へのお礼

どうもありがとうございます!

ユーザIDとメールアドレスで複合主キーにするテーブル構造をとるより、
ユーザIDでメールアドレスを取得するのが普通なのでしょうか。

検索処理を高速にしたいのですが、
どちらの構造でもとれると思いまして疑問に思い質問させていただきました。

お礼日時:2010/06/11 13:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!