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

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

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

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

3回答

1227閲覧

1ユーザーに対し4000件程度のデータを保有するDBの設計方針で悩んでいます。

sota1003

総合スコア1

MySQL

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/05/27 07:02

前提・実現したいこと

PHP+MySQLでWEBサービスを作成しています。

  • 想定ユーザー数

10,000人

  • 1ユーザーあたりのデータ件数

約20分類、計4000件程度(最大1分類2000件程度)
※分類・件数は今後増加の可能性もある

  • 格納されるデータ

0~9のいずれか

ユーザーがサービスにアクセスする都度に、20分類のうちいずれかのデータ群にアクセスし、そのデータ群の保有するデータを表示する予定です。

検討した方針

最初は分類(データ群)ごとに、テーブルを作成し、データ件数分のカラムを用意し、レコードとしてユーザー各々のデータを格納しようかと思いました。

user_iddata1data2data3...data2000
USER00001014...6
USER00002117...2
USER00003131...4
..................
USER10000452...0

調べてみると、MySQLの最大カラム数は 4096カラムとのことでした。
ですが、カラム数が多いのは可読性や保守性が最悪になると感じました。

また、ユーザーごとにテーブルを作り4000レコードを保有することも考えましたが、1万テーブルも作成されるのはどうなのだろうか...
となりました。
加えて、下の質問に寄せられている回答でもテーブルやデータベースで分けるべきではないとのことでした。
【MySQL】データベースを追加するかテーブルを追加するか|teratail

どのようにデータベースを設計するのがベストなのでしょうか...

補足情報(FW/ツールのバージョンなど)

  • APサーバ

さくらインターネット Windows Server2019

  • DBサーバ

ConoHa DBサーバ(MySQL(MariaDB))

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

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

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

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

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

guest

回答3

0

ベストアンサー

素直に正規化して、user_id, data_id, valueの列を持たせたテーブルを作る、というのが第一選択かと思います。

投稿2020/05/27 07:22

maisumakun

総合スコア145183

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

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

sota1003

2020/05/27 07:57

回答ありがとうございます。 user_id | data_id | value ------------------------------------- 00001  | 000001 | 1 00001  | 000001 | 9 00001  | ・・・  | ・・・ 00001  | 004000 | 4 00002  | 000001 | 2 00002  | 000002 | 5 00002  | ・・・  | ・・・ 00002  | 004000 | 7 ~~~~~~~~~~~~~~~~~~~~~ 10000  | 000001 | 6 10000  | 000002 | 8 10000  | ・・・  | ・・・ 10000  | 004000 | 3 という考え方であってますでしょうか。
maisumakun

2020/05/27 08:30

そんな感じです。
sota1003

2020/05/27 08:41

これだと、1万ユーザーで4千万レコードになりますが、処理速度は遅くなりますでしょうか? 1000人単位程度のグループに分けて、1テーブル4百万レコード程度に抑えた方がいいのでしょうか。
maisumakun

2020/05/27 08:42

適切にインデックスをつければ、「1ユーザーだけ」や「1項目だけ」の抽出は充分高速に行えます。
guest

0

  • まずは正規化して不要なデータを整理してください
  • NULLが多いようなデータはテーブルを分けた方がよいかもしれません
  • 検索性にもよりますが、単なるデータならJSON型やTEXTにして全文検索にしてしまう手もあります

投稿2020/05/27 07:05

yambejp

総合スコア114736

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

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

sota1003

2020/05/27 07:14

回答ありがとうございます。 どのデータも重要度は一律でどのデータもnullが入ることはありません。 0から9のいずれかが必ず格納される予定です。 全文検索については知識がありませんので、少し調べてみようと思います。
yambejp

2020/05/27 07:17 編集

あとは userid,dataNo,dataVal みたいなデータの持ち方をする手もあると思いますよ どんな検索や集計を想定しているんでしょうかねぇ
yambejp

2020/05/27 07:30

検索効率を考えなければ,0-9という出現要素が確定しているなら 2000文字のデータを1カラムに押し込んでしまってもいいです
sota1003

2020/05/27 08:02

回答ありがとうございます。 特定の条件下のものを取得することはなく、現在ログインしているユーザーが特定の分類のページにアクセスしたら、そのユーザーの保有する該当する分類のデータ全てを取得したいです。 全件取得なので、2000文字取得して、1文字目から繰り返し文で表示していくのもそこまで処理効率悪くないのでしょうか...。
yambejp

2020/05/27 08:07

2000文字で1カラムだと確かに効率は悪いですが 正規表現があるので、x番目がmで、y番目がn、z番目がoのデータ みたいな検索条件は簡単にかけます
sota1003

2020/05/27 08:41

ありがとうございます。 もう少し検討してみます。
guest

0

基本的にはmaisumakun様のuser_id, data_id, valueを基本テーブルにして宜しいのではないかと思います。
インデックス等での高速対応が心配あれば、後で検索用のテーブルを追加作成し、MySQLのトリガー機能を利用して基本ーブルの更新発生都度、基本テーブルから集計テーブルへ結果書き込みする方法も有るかと思います。
下記テーブルイメージ。
'----------------------------------------
(ユーザー別分類別集計テーブル)
user_id data_id val01 val02 val03 ・・・・・・ val09
00001 | 001 | 0 | 50 | 12 |・・・・・| 0
00001 | 002 | 40 | 500 | 50 |・・・・・| 20


'----------------------------------------
(ユーザー別集計テーブル)
user_id val01 val02 val03 ・・・・・・ val09
00001 | 40 | 550 | 62 |・・・・・| 20
00002 | 10 | 100 | 10 |・・・・・| 0


'----------------------------------------
ユーザー別分類別集計テーブルだけで良いのかも知れませんが、
運用の状況に合わせて検討されれば宜しいかと思います。
MySQLが勝手に処理してくれるので、速度面での負荷は少ないです。

投稿2020/05/28 00:45

編集2020/06/09 06:39
tosi

総合スコア553

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問