• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:データベースの設計について教えてください。)

データベースの設計について教えてください

このQ&Aのポイント
  • データベースの設計について基本的な質問です。単純なテーブルで表現する場合、パターンAとパターンBのどちらが良いでしょうか。
  • ユーザのメールアドレスを表示する仕様の場合、ユーザ情報を持つuserマスタテーブルとメールアドレスを持つmailテーブルをどのように設計すると良いでしょうか。
  • パターンAではuserマスタテーブルとmailテーブルをユーザIDで関連付ける設計であり、パターンBではmailテーブルに直接ユーザIDを持たせる設計です。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.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ツールを使うなら、ツールに対するテーブル構造の説明にもなります。外部キーとして使用される前提でコードが生成されますから、よりよいコード生成が期待できます。

hanahana1234
質問者

お礼

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

その他の回答 (2)

回答No.2

参照のみということで集計テーブルだと仮定すると userマスタ ・ユーザーID(PK) ・ユーザー名 ・会社名 mailテーブル ・ユーザーID(FK) ・ユーザーメールアドレス ・モバイル用メールアドレス こんな感じでどうでしょう。 複数人で同じメールアドレスを使う場合もあるでしょうし、メアドは主キーとして使わない方がいいと思います。

hanahana1234
質問者

お礼

ありがとうございます! 各ユーザには、携帯メールも、会社メールも、自宅でのフリーメールでも ユーザが望む限り登録できる仕様になっています。 こういう場合、どういうテーブル構造がベストなのでしょうか?

回答No.1

こうじゃないでしょうか  【mailテーブル】 (PK)ユーザメールアドレス   メール種別(自宅/会社/モバイル)   ユーザID ←インデックスをはります。

hanahana1234
質問者

お礼

どうもありがとうございます! ユーザIDとメールアドレスで複合主キーにするテーブル構造をとるより、 ユーザIDでメールアドレスを取得するのが普通なのでしょうか。 検索処理を高速にしたいのですが、 どちらの構造でもとれると思いまして疑問に思い質問させていただきました。

関連するQ&A