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

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

ただいまの
回答率

90.47%

  • MySQL

    6018questions

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

MySqlで1テーブルの列が多くなりすぎる場合の設計

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,484

nuages

score 29

MySqlデータベースで店舗情報を管理しようとしています。
店名や住所、電話番号やFAXなどをそれぞれ列として作ろうと思っていたのですが、
どんどん増えて現状50列以上になる見込みです。

(shop_id, key, value) から成るテーブルを作って列数を減らそうかとも思いましたが
Entity-Attribute-Value は駄目だという評判も多くどのようにすればいいのかわかりません。

店名などの重要な情報のみ shops テーブルに格納し、座席数や喫煙可などの余り重要でない列のみ shop_details に分けて join する位しか思いつきませんが、このようなケースではどのようにして設計すればいいのでしょうか?
また、列数の常識的な上限はどのくらいなのでしょうか?


追記

具体的な列を列挙します(49列)

ID
固有番号
グループID
ログインID
パスワード
店名
よみがな
運営会社
運営会社よみがな
担当者名
担当者よみがな
担当者連絡先
メイン画像
サムネイル
営業時間
定休日
予約制か
喫煙可か
席数
席の種類
電話番号
FAX
E-Mail
求人電話番号
求人メールアドレス
郵便番号
県名
住所
建物名
緯度
経度
エリア区分
アクセス方法
ウェブサイト
Twitter
Facebook
Instagram
LINE
紹介文
PR
一言メッセージ
カテゴリID
ジャンルID
会員グレード
備考
登録日
更新日
削除日
公開状態

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

アプリケーションで各情報がどの様に扱われるかによって適切な設計は変わりますが、
設計完了までに情報が固まり、あくまで店舗ごとに情報を扱うようなケースであれば、列数は100でも200でも問題にならないと思います。

また、店舗数がそんなに多くないのであれば、列の追加によるインデックスの貼り直しコストもそんなに大きな問題にはならないので、列数を気にしないという方向はありだと思います。

(shop_id, key, value) から成るテーブルを作って列数を減らそうかとも思いましたが 

管理画面から動的に列の変更をしなければならないようなケース以外だとデメリットの方が大きくなると思います。
それならば、項目ごと、出来れば項目の分類ごとにテーブルを用意して、店舗IDをキーにしてjoinするような方法の方がまだいいかなと思いますね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/19 10:18

    今のところ動的に項目が増減する予定はないので key-value ペアを登録する形は避けたほうが良さそうですね。
    店舗数は現状1万レコードほどで将来的に2〜3万程度になる可能性はあります。列を分割せずに設計した時、この数字はインデックス再作成に問題が出る規模なのでしょうか?

    キャンセル

  • 2016/05/19 10:42

    サーバのスペック次第ではありますが、多分大丈夫なんじゃないかなあと思います。予定よりちょっと厳しいくらいの条件で実際に試してみるのが確実ですね。

    キャンセル

+1

Entity-Attribute-Valueは確かにアンチパターンとして挙げられているように、テーブルのカラムが少なくなるだけで、データ抽出が難しくなります。
あと程度カラムは増えても仕方ない面もありますが、テーブルを分割すべきときは、1つの店舗に対して複数の値を持つカラムが登場したときには、テーブルを分けましょう。

例えば1つの店舗に対し、複数の電話番号やFAX番号を持つことはありますよね。そういう場合は電話番号テーブルを作成して、店舗を一意に決定するコード値で関連付けする…といった設計になるでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

質問文を見る限り抵触してはいなさそうですが、例えば複数の電話番号を管理するのに「tel1,tel2,tel3」のようにカラムを増やしているなら、これはマルチカラムアトリビュートのアンチパターンになります。
そうでないならば、他の方もおっしゃっていますが50項目程度なら特に問題にならないと思います。

ただ大半の店舗には不要でNullが設定されるカラムばかりが多いなら
全ての店舗に共通して入力必須な項目と、一部の店舗のみに必要な項目はテーブルを分けるのも良いかも知れません。
その際も、その2つのテーブルの項目数が同じ50程度になるように分けるので良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/18 21:01

    項目追記と入れ違いの投稿になってしまいました。
    ぱっと見た感じ、管理会社関連と担当者関連は、同じ会社や担当者が複数の店舗に登録されるなら、テーブルを分けたほうが良いかも?と思う程度ですね。

    キャンセル

0

必要なら作るしかないと思いますが…
項目一覧がわかれば、それを評価してくれる
詳しい方はいるかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/18 20:56

    具体的な列の一覧を追記いたしました。
    よろしくお願い致します。

    キャンセル

  • 2016/05/18 21:07

    拝見しました。
    特にこれといった問題はなさそうな気がします。
    データを分けたことにより処理の煩雑さを増すより
    1テーブルに収めた方がいい気がしますね~
    気になる点といえば、「ログインID」「パスワード」は
    いっしょに持つ必要はあるのかなあ、と。
    ログイン時しか使わないと思うし、セキュリティの
    観点からも別扱いしといた方がいいかも?

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • MySQL

    6018questions

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