質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

Q&A

4回答

4817閲覧

一対一の関係の場合は別テーブルにするか

mhl

総合スコア34

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

0グッド

0クリップ

投稿2017/05/09 10:00

mysqlにデータを入れる際に、1対1の関係の場合はわざわざ、テーブルを作るのではなく、1テーブルにcolumnとしてデータを入れるのがいいのか、悩んでいます。

どなたか、ご教示をお願いします!!

例:
users

idnameemailtel
1hogehoge@example.com03123456789

companies

idnameuser_id
1hogecompany1

ざっくりしたものですが、この場合はいちいち,
companiesというテーブルを作らずに、companyをいうcolumnをusersに入れるのがいいのでしょうか?
こいうusersにcolumnが少ない場合はそれのがいいと思いますがこれが、usersのcolumnが3,40になるような場合は、テーブルを分けて管理したのがいいのでしょうか?
テーブルを増やすのか、columnを増やすのかはどうやって判断すればいいのでしょうか?

DBのことを勉強中なので、質問自体が間違っていましたら、すみません!

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

email と tel にも言えることですが、いずれ一対一ではなく多対一にしたくなると思います。
私ならユーザー、メール、電話番号、会社の 4 つのテーブルを作ります。

投稿2017/05/09 10:04

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mhl

2017/05/09 10:08

ご回答ありがとうございます! 会社に対して多対1にしたくなるのはわかりますが、メール、電話番号も多対1にしたくなるのはなぜでしょうか?
Zuishin

2017/05/09 10:13

携帯と家と二つの電話番号があるからです。備考に入れてもいいのですが、電話番号は電話番号でまとめた方がフロントエンドが作りやすくなります。
mhl

2017/05/09 10:23

ありがとうございます! 大変参考になりました!
guest

0

マスターテーブルとそうではないテーブルの概念を学んだ方が良いでしょう。
以下のサイトでは、マスタデータ・トランザクションデータと呼んでいますが同じことです。
http://www.graffe.jp/blog/392/

要は通常の運用では変更されない基本となるデータをマスタとします。
また同じ情報をひとつにまとめる場合も同様です(むしろこっちの方が比重が高い)
例えば社名が複数レコードに存在していると、運用面でも処理面でも問題です。
ですので、今回の場合では、

  • ユーザーマスタ
  • 会社マスタ

と考えるとよいです。
どちらも日常的に修正が入ることはないですよね?
ユーザー情報は、転居したときや結婚して姓が変わったときなど。
会社情報も、移転したとき、合併して社名が変わったときなど。

あとはどちらを中心に考えるかですね。
0. このユーザーはどこの会社に属するのか
0. この会社に属するのはどのユーザーか

1にした場合、ユーザーマスタに会社情報を紐づければ良いでしょう。
この場合のテーブル構成はこんな感じになります。

users

idnameemailtelc_id
1hoge1-1hoge1-1@example.com031234567891
2hoge1-2hoge1-2@example.com041234567891
3hoge2-1hoge2-1@example.com051234567892
4hoge2-2hoge2-2@example.com061234567892

companies

idname
1hogecompany
2hogecompany2

では2にした場合はどうでしょう。
会社情報にユーザー情報を持ちます。

users

idnameemailtel
1hoge1-1hoge1-1@example.com03123456789
2hoge1-2hoge1-2@example.com04123456789
3hoge2-1hoge2-1@example.com05123456789
4hoge2-2hoge2-2@example.com06123456789

companies

idnameu_id
1hogecompany1
1hogecompany2
2hogecompany23
2hogecompany24

usersテーブルの方は変わりませんが、companiesテーブルはユーザー数分レコードができてしまって無駄が多いですね。
また会社名が複数レコードにあるので、会社名を変更したいという場合、複数レコード更新しないといけなくなり、マスターの意味がなくなってしまいます。

というわけで1のような構造にするのがRDMSでの一般的な設計方法になるかと思います。

投稿2017/05/10 00:17

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mhl

2017/05/10 06:36

ありがとうございます! 大変勉強になりました!
guest

0

  • usersのidをuid、nameをuname
  • companiesのidをcid、nameをcname

と切り分けて下さい
同じ会社に複数のユーザーが共存することを考えれば

userテーブルは
uid,uname,email,tel,cid
となります。

逆にcompaniesにuser_idが入ることはないような気がします

一つで管理してもいいですが、会社名が変更になった際に
正規化していればcompaniesを1箇所なおすだけで済みます

投稿2017/05/09 10:12

yambejp

総合スコア114775

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mhl

2017/05/09 10:26

ご回答ありがとうございます! columnの名前付け参考になります! 一つ質問があります。 companiesにuser_idではなくusersにcidを入れるのはなぜでしょか? 逆だと、不備が起こるのですか?
yambejp

2017/05/09 10:45

一人のユーザーが複数の会社に所属するよりも 1つの会社に複数のユーザーが所属している方が一般的です。 Aさん、Bさん、CさんがX社、 Dさん、EさんがY社にいるようなイメージです。 このさユーザーテーブルのAさんのレコードにX社のcidが入るということでわかりますか?
mhl

2017/05/10 06:38

わかりました! ありがとうございます!
guest

0

usersテーブルにcompaniesテーブルの情報を載せてはいけないわけではありません。ただし、以下の様な問題が起こる可能性があります。

・同一のcompany_nameのuserがいた場合、情報の重複する
・company_idやcompany_nameで検索したい場合に複数ヒットするので扱いが難しくなる(変更漏れの可能性)
・company_addressやcompany_phoneなどの項目が必要になると重複された情報が更に多くなる
・同一のcompany_nameの社名変更やその付随情報などの変更があった時に扱いが難しくなる(変更漏れの可能性)

逆にいうと、userとcompanyの一対一の関係が保証されるか、保証されなくても大した問題にならない場合は同じテーブルにしても構いません。例えばusersテーブルにzipとadressがあったとして、間違った郵便番号が登録されていたとしても通常は大した問題にならないとお考えます。郵便番号から検索することは無いからです。(もっとも間違った郵便番号が登録されたことが判明したら、そのレコードの修正は必要ですけどね。)

実際にどのような検索を行いどのように運用されるかによってテーブルの設計は変わってきます。

投稿2017/05/09 12:46

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iwamoto_takaaki

2017/05/09 12:48

あと、そうそう通常は項目数が何十個にもなることはないです。”正規化”がきちんと出来ていればの話ですが・・・
mhl

2017/05/10 06:37

ありがとうございます! 大変参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問