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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

195閲覧

MySQLのカラムに収めるデータ形式について

chapp

総合スコア233

MySQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/03/26 16:25

お世話になります。
勉強しながらPHPとMySQLの連携で小規模なウェブサイトを作ったりしている身ですが、新しくアプリを設計するとき、表題にある「カラムに収めるデータの形式」について悩むことが多く、質問させてください。

例えばですが、好きな果物を会員ごとに集計したいと考えたとき、

サトシさんが好きなものは、 苺とリンゴ
真由美さんが好きなものは、 みかん
武司さんが好きなものは、  苺とみかん
清美さんが好きなものは、  リンゴ

だったとします。

そこでこのデータを会員データに収める場合、苺、りんご、みかん、といったカラムを別々に設定することもできますし、「kudamono」 というカラムを設け、サトシさんだったら、「苺,リンゴ」といったようにカンマ区切りの文字列をカラムに代入することも出来ますし、苺、りんごを配列データとしてカラムに代入することもできるかと思います。

代入するだけなら上記のように複数のパターンも考えられるのでしょうが、以下のように

苺   サトシさん、武司さん
リンゴ サトシさん、清美さん
みかん 真由美さん、武司さん

といったように、果物別に好きなもの別にデータを収集する場合、苺、りんご、みかん、といったカラムを別々に設定した方が実行時間が少なく済みそうな気がするのですが、テーブルの構成を考えると効率が悪いような気がしますし、対して1つのカラムに、カンマ区切りなり、配列なり入れると、データを呼び出す際に効率が悪いような気もしています。

と、ここで質問なのですが、以上のような場合、どのような構成がサイトを稼働していくうえで負担が少なく、また効率がいいのでしょうか?

もしかしたらケースバイケースなのかもしれませんし、この質問自体が馬鹿げていることかもしれませんが、実際に規模の大きなシステムを組まれ方など実体験も含め、お話を伺えれば幸いです。

よろしくお願い申し上げます。

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

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

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

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

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

guest

回答3

0

質問されている内容は、「正規化」と言われるものです。
奥が深いので、先ずは、「正規化 データベース」などで検索してみると良いですよ。

投稿2018/03/26 17:20

sazi

総合スコア25085

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

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

chapp

2018/03/27 01:33

sazi様 夜遅くの早々の回答、ありがとうございます。 「正規化」と呼ばれているものなのですね。調べてみたいと思います。 ありがとうございました!
sazi

2018/03/27 01:42

どのように構成するかについては、他の方が述べられていますが、正規化を知った上で、正規化を緩めるなどとした方が良いと思いますので、このような案内にしました。
chapp

2018/03/27 02:22

sozai様 ありがとうございます。これまで今回質問した仕組みに似た内容は、いくつもありましたが、(規模が小さかったためか)特に問題なく今日までまいりました。アドバイスなければ調べるキッカケがなかったかと思います。ありがとうございました!
sazi

2018/03/27 03:24

sozaiにちょっと噴いたw お昼時ですもんねw
chapp

2018/03/27 08:27

あ、失礼しました(^_^;;
guest

0

基本的に
・『カラム名』にデータが入る
・データ内文字列をカンマなどで区切ったり配列を用いたりして複数を表現する

これらは実装が早いので楽に見えるかもしれませんが拡張性が低く、アプリ側のデザインやロジックに食い込んでくるので後々後悔しそうだなと思います。

私は大体「それが100種類とか大量にあっても大丈夫かどうか」で考えています。

今の場合だと「苺、りんご、みかん」の部分ですね。果物が100種類あったとしたらカラムを100個作りますか?コンマ区切りで100連結したり100要素の配列を入れますか?ということです。

「2−3個ならオッケーで多くなるとダメ」というのは個人的には採用したくないと感じています。

投稿2018/03/26 17:44

sousuke

総合スコア3828

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

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

chapp

2018/03/27 01:36

sousuke様 夜遅くのアドバイス、ありがとうございます。 >これらは実装が早いので楽に見えるかもしれませんが拡張性が低く、アプリ側のデザインやロジックに食い込んでくるので後々後悔しそうだなと思います。 > 私は大体「それが100種類とか大量にあっても大丈夫かどうか」で考えています。 これまで質問時に記載した内容しか思いつかなかったのすが、sousuke様の仰る通りかと思います。貴重なご指摘、ありがとうございます!
guest

0

ベストアンサー

####仕様
サトシさんが好きなものは、 苺とリンゴ
真由美さんが好きなものは、 みかん
武司さんが好きなものは、  苺とみかん
清美さんが好きなものは、  リンゴ

####membersテーブル

member_id*name
1サトシ
2真由美
3武司
4清美

####fruitsテーブル

froot_id*name
1
2リンゴ
3みかん

####favoritesテーブル

member_id*fruit_id*
11
12
23
31
33
42

####お膳立て

SQL

1create database test CHARACTER SET utf8mb4; 2 3use test; 4 5create table members ( 6member_id int PRIMARY KEY, 7name varchar(255) 8) ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 9 10create table fruits ( 11fruit_id int PRIMARY KEY, 12name varchar(255) 13) ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 14 15create table favorites ( 16member_id int, 17fruit_id int, 18PRIMARY KEY(member_id, fruit_id) 19) ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 20 21INSERT INTO test.members (member_id, name) VALUES (1, 'サトシ'), (2, '真由美'), (3, '武司'), (4, '清美'); 22INSERT INTO test.fruits (fruit_id, name) VALUES (1, '苺'), (2, 'リンゴ'), (3, 'みかん'); 23INSERT INTO test.favorites (member_id, fruit_id) VALUES (1, 1), (1, 2), (2, 3), (3, 1), (3, 3), (4, 2);

####SELECT

SQL

1use test; 2 3SELECT m.name, group_concat(f.name) AS fruits 4FROM favorites AS fav 5LEFT JOIN members AS m 6USING (member_id) 7LEFT JOIN fruits AS f 8USING (fruit_id) 9GROUP BY m.member_id;

※USINGとgroup_concat()関数は、MySQL専用の便利な方言

####SELECT結果

SELECT結果

####別視点

SQL

1use test; 2 3SELECT f.name, group_concat(m.name) AS members 4FROM favorites AS fav 5LEFT JOIN members AS m 6USING (member_id) 7LEFT JOIN fruits AS f 8USING (fruit_id) 9GROUP BY f.fruit_id;

####SELECT結果

SELECT結果

投稿2018/03/26 23:49

編集2018/03/27 00:10
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

chapp

2018/03/27 01:41

lucker様 ご親切な対応ありがとうございます。 テーブル構成やソースまで張り付けていただき、感謝いたします。お手数おかけいたしました。 テーブル構成を拝見し、「なるほど」と思わず声が出てしまいました。 分かり易いアドバイスに感謝いたします。ありがとうございました!
退会済みユーザー

退会済みユーザー

2018/03/27 01:43

これで感覚をつかんでからsaziさんの言うように正規化について少しずつ勉強していくとよいと思い、詳しく手順を記しました。 いきなり学習ありきだと敷居が高すぎるので、まずどんな感じなのか分かってもらえたら嬉しいです。
chapp

2018/03/27 02:26

Lucker様 ありがとうございます。sozai様への返答でも書きましたが、これまで似たような仕組みを作った事ありましたが、(とりあえず)動いていたため、調べる機会を求めず今日までまいりました。この度の分かり易いアドバイスには感謝しています。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問