
データベースの設計について教えてください。
基本的な質問ですみません。宜しくお願いいたします。
単純なテーブルで表現しますが、
パターンA、Bのどちらのテーブルで設計するのが良いのでしょうか。
DBはmysqlで5000万件のデータで検索のみのデータベースです。
【前提】
ユーザは複数のメールアドレスを持ちます。
画面から、このユーザのもつメールアドレスを表示させる仕様だとします。
【userマスタ】
(PK)ユーザID
ユーザ名
会社名
<パターンA>
【mailテーブル】
(PK)ユーザID
(PK)ユーザメールアドレス
モバイル用アドレス
<パターンB>
【mailテーブル】
(PK)ユーザメールアドレス
モバイル用アドレス
ユーザID ←インデックスをはります。
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ツールを使うなら、ツールに対するテーブル構造の説明にもなります。外部キーとして使用される前提でコードが生成されますから、よりよいコード生成が期待できます。
大変懇切丁寧に教えて頂きまして、ありがとうございました。
とてもわかりやすく説明してくださり、本当に助かりました。
どうもありがとうございました!

No.2
- 回答日時:
参照のみということで集計テーブルだと仮定すると
userマスタ
・ユーザーID(PK)
・ユーザー名
・会社名
mailテーブル
・ユーザーID(FK)
・ユーザーメールアドレス
・モバイル用メールアドレス
こんな感じでどうでしょう。
複数人で同じメールアドレスを使う場合もあるでしょうし、メアドは主キーとして使わない方がいいと思います。
ありがとうございます!
各ユーザには、携帯メールも、会社メールも、自宅でのフリーメールでも
ユーザが望む限り登録できる仕様になっています。
こういう場合、どういうテーブル構造がベストなのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP MySql PHP 2つのテーブルをJOINで結合 user_idで抽出 1 2023/01/03 14:04
- その他(メールソフト・メールサービス) Windows10付属のメール、なぜ設定が劇的に簡単になったのか? 1 2022/12/16 13:14
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- ルーター・ネットワーク機器 NUROのルータF660Aについて 2 2022/09/07 11:44
- UNIX・Linux コマンドプロンプトでのユーザーのサインイン時間設定について 1 2022/08/09 09:09
- Windows 10 コマンドプロンプトでのユーザーのサインイン時間設定について 1 2022/08/09 20:43
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- その他(Microsoft Office) Excelでユーザ名を入力すればそのユーザの最大、平均が表示されるようにする、何も入力されてなければ 1 2022/07/28 00:31
- サーバー Windowsサーバでグループを検索したい 1 2023/04/17 15:30
- その他(開発・運用・管理) Windowsバッチファイルでリモートデスクトップを自動ログインするが確認画面が出る対処方法 1 2022/12/19 15:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
3テーブルより抽出のSQL文
-
他のシートの検索
-
アクセルでのクエリ
-
データを同データが並ばないよ...
-
カラム表示の幅
-
アドレスブックの登録について
-
sql文でのage sageシステム
-
カラムの値を、条件により動的...
-
MySQL区切った文字列で外部結合...
-
アーメス・パピルスについて・...
-
データ型による検索速度の違い...
-
SQLにてフィールドを+1
-
テーブル設計について
-
MySQLのTimestamp型の使い方
-
社名でデータ抽出できる検索シ...
-
ENUM列に列挙されていない値を...
-
効果的なindexの設定方法
-
MySQL 配列もどきを条件式に
-
SELECTの検索速度と、DB設計
-
INDIRECT関数の代替方法は?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
インデックスについて
-
SQL Server Management Studio...
-
ユニーク制約とユニークインデ...
-
UPDATEつてインデックス貼って...
-
MySQLのKey属性「MUL」について
-
複数カラム検索で、LIKE "%検索...
-
大量の項目を対象に効率的に検...
-
1000件以下の場合はカラム数に...
-
MySqlでのデータソートについて
-
MySQLのインデックスについて
-
内容を削除したときのパフォー...
-
オートインクリメントについて
-
データベースの設計について教...
-
削除ふらぐ
-
SELECT文で、指定カラム以外の...
-
DBの定義のサイズを大きくし過...
-
INDIRECT関数の代替方法は?
-
一部のカラムでdistinctし全て...
-
テーブルの列数を調べたい
-
UNIONする際、片方テーブルしか...
おすすめ情報