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

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

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

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

PHP

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

Q&A

解決済

4回答

461閲覧

mysqlで数100列のテーブルを作りたい

hatsu

総合スコア1809

MySQL

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

PHP

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

0グッド

0クリップ

投稿2017/07/28 10:44

編集2017/07/28 12:40

今、mysqlにてテーブルを185列のテーブルを作成しようとしています。
(以下のコード)

mysql> create table kifus( -> id int not null auto_increment primary key, -> url varchar(255), -> sente_name varchar(255), -> gote_name varchar(255), -> datetime varchar(255), -> sashite1 varchar(255), -> sashite2 varchar(255), -> sashite3 varchar(255), -> sashite4 varchar(255), -> sashite5 varchar(255), -> sashite6 varchar(255), -> sashite7 varchar(255), -> sashite8 varchar(255), -> sashite9 varchar(255), -> sashite10 varchar(255), -> sashite11 varchar(255), -> sashite12 varchar(255), -> sashite13 varchar(255), -> sashite14 varchar(255), -> sashite15 varchar(255), -> sashite16 varchar(255), -> sashite17 varchar(255), -> sashite18 varchar(255), -> sashite19 varchar(255), -> sashite20 varchar(255), -> sashite31 varchar(255), -> sashite32 varchar(255), -> sashite33 varchar(255), -> sashite34 varchar(255), -> sashite35 varchar(255), -> sashite36 varchar(255), -> sashite37 varchar(255), -> sashite38 varchar(255), -> sashite39 varchar(255), -> sashite40 varchar(255), -> sashite41 varchar(255), -> sashite42 varchar(255), -> sashite43 varchar(255), -> sashite44 varchar(255), -> sashite45 varchar(255), -> sashite46 varchar(255), -> sashite47 varchar(255), -> sashite48 varchar(255), -> sashite49 varchar(255), -> sashite50 varchar(255), -> sashite51 varchar(255), -> sashite52 varchar(255), -> sashite53 varchar(255), -> sashite54 varchar(255), -> sashite55 varchar(255), -> sashite56 varchar(255), -> sashite57 varchar(255), -> sashite58 varchar(255), -> sashite59 varchar(255), -> sashite60 varchar(255), -> sashite61 varchar(255), -> sashite62 varchar(255), -> sashite63 varchar(255), -> sashite64 varchar(255), -> sashite65 varchar(255), -> sashite66 varchar(255), -> sashite67 varchar(255), -> sashite68 varchar(255), -> sashite69 varchar(255), -> sashite70 varchar(255), -> sashite71 varchar(255), -> sashite72 varchar(255), -> sashite73 varchar(255), -> sashite74 varchar(255), -> sashite75 varchar(255), -> sashite76 varchar(255), -> sashite77 varchar(255), -> sashite78 varchar(255), -> sashite79 varchar(255), -> sashite80 varchar(255), -> sashite81 varchar(255), -> sashite82 varchar(255), -> sashite83 varchar(255), -> sashite84 varchar(255), -> sashite85 varchar(255), -> sashite86 varchar(255), -> sashite87 varchar(255), -> sashite88 varchar(255), -> sashite89 varchar(255), -> sashite90 varchar(255), -> sashite91 varchar(255), -> sashite92 varchar(255), -> sashite93 varchar(255), -> sashite94 varchar(255), -> sashite95 varchar(255), -> sashite96 varchar(255), -> sashite97 varchar(255), -> sashite98 varchar(255), -> sashite99 varchar(255), -> sashite100 varchar(255), -> sashite101 varchar(255), -> sashite102 varchar(255), -> sashite103 varchar(255), -> sashite104 varchar(255), -> sashite105 varchar(255), -> sashite106 varchar(255), -> sashite107 varchar(255), -> sashite108 varchar(255), -> sashite109 varchar(255), -> sashite110 varchar(255), -> sashite111 varchar(255), -> sashite112 varchar(255), -> sashite113 varchar(255), -> sashite114 varchar(255), -> sashite115 varchar(255), -> sashite116 varchar(255), -> sashite117 varchar(255), -> sashite118 varchar(255), -> sashite119 varchar(255), -> sashite120 varchar(255), -> sashite121 varchar(255), -> sashite122 varchar(255), -> sashite123 varchar(255), -> sashite124 varchar(255), -> sashite125 varchar(255), -> sashite126 varchar(255), -> sashite127 varchar(255), -> sashite128 varchar(255), -> sashite129 varchar(255), -> sashite130 varchar(255), -> sashite131 varchar(255), -> sashite132 varchar(255), -> sashite133 varchar(255), -> sashite134 varchar(255), -> sashite135 varchar(255), -> sashite136 varchar(255), -> sashite137 varchar(255), -> sashite138 varchar(255), -> sashite139 varchar(255), -> sashite140 varchar(255), -> sashite141 varchar(255), -> sashite142 varchar(255), -> sashite143 varchar(255), -> sashite144 varchar(255), -> sashite145 varchar(255), -> sashite146 varchar(255), -> sashite147 varchar(255), -> sashite148 varchar(255), -> sashite149 varchar(255), -> sashite150 varchar(255), -> sashite151 varchar(255), -> sashite152 varchar(255), -> sashite153 varchar(255), -> sashite154 varchar(255), -> sashite155 varchar(255), -> sashite156 varchar(255), -> sashite157 varchar(255), -> sashite158 varchar(255), -> sashite159 varchar(255), -> sashite160 varchar(255), -> sashite161 varchar(255), -> sashite162 varchar(255), -> sashite163 varchar(255), -> sashite164 varchar(255), -> sashite165 varchar(255), -> sashite166 varchar(255), -> sashite167 varchar(255), -> sashite168 varchar(255), -> sashite169 varchar(255), -> sashite170 varchar(255), -> sashite171 varchar(255), -> sashite172 varchar(255), -> sashite173 varchar(255), -> sashite174 varchar(255), -> sashite175 varchar(255), -> sashite176 varchar(255), -> sashite177 varchar(255), -> sashite178 varchar(255), -> sashite179 varchar(255), -> sashite180 varchar(255) -> );

しかし、エラーが以下のように出てしまいます。

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

エラー内容としては、
列の数が大きすぎるとのことですが、DBに関しては知識がないもので
どのように解決してくのが良いのでしょうか?

sashite varchar(255)
をtextに変えると解決がされるのか?
またsashite varchar(255)に入れる文字は全角で10文字以下であることから255のサイズを下げることが考えられるのでしょうか?

分かるかた、心当たりある方、ご教授いただけますと幸いです。

#####追記
私のイメージしているテーブルの形です。
テーブルの形についての話も出てきたため、参考のために追記させていただきました。
|id|url|sente_name|gote_name|datetime|sashite1|sashite2|...|sashite200|
|:--|:--:|--:|
|1|https://hoge|foo|bar|2017/7/28|7六歩|3四歩|...|投了|
|2|https://hoge|hoge1|hoge2|2017/7/28|2六歩|3四歩|...|投了|


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

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

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

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

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

guest

回答4

0

ベストアンサー

MySQLのバージョンは5.5以上で合っていますか?こちらの回答を参考にしてください:https://teratail.com/questions/81496

かいつまんで説明すると

  1. InnoDB ストレージエンジンのデータフォーマットを新しい "Barracuda" モードに変更する
  2. テーブルのrowフォーマットを新しい "DYNAMIC" モードに変更する

とすることで、これで190カラムくらいまでなら作成できるはずです。


うすうす感じているとは思いますが、これだけ莫大なカラムが必要になるということはデータベースの設計に問題があることを意味します。データベースの不備は後々辛い思いをすることになるので、無理のない設計を心がけたいところです。


(追記)

データベースの設計はシステム設計・開発とは別に専門家(DBA: Data Base Administrator)が存在するほど難しく奥深い世界です。「達人に学ぶDB設計 徹底指南書」などの技術本もありますが、最終的には経験や勘が重要になってきます。

まずはQiitaなどで関連するエントリーを読んで基礎知識を軽くおさえておきましょう。「正規化」がキーワードです。そのあとはソフトを作ってみて「あー、こうなってると検索がめんどくさいなー。結果を表示させるときにデータの加工が大変だな。なんかSQL実行が遅いな…」などと感じてきたら、テーブルやカラム(スキーマ)の設計を見直す、といった作業を繰り返していくしかないと思います。

たとえば今回のテーブルが将棋を扱うものであれば(すいません、知識がないです)、各手を記録するために手ごとに盤面の状態(すべての駒の絶対位置)を記録するのか、生じた事実(どこの位置に何の駒を置いた/取った)を記録するのか、もしくは両方やるのか…によってその後のデータベース設計や、プログラムの作り方が大きく左右されますよね。

次に必要なデータを正規化によって各テーブルに分割していきます。たとえば「2017/7/28、渋谷将棋会館で行われた、鈴木氏と佐々木氏の対戦:虎王戦決勝トーナメント1回戦で、1手目、先手の鈴木氏は、7六歩」という情報を記録したいとすると、とりあえず対戦の情報と手の情報でテーブルを分けるのがよさそうです。

gameiddatelocationplayer-blackplayer-whitegame-name
12342017-07-28渋谷将棋会館鈴木佐々木虎王戦決勝トーナメント1回戦
gameidmoveidxypiece-playerpiece-type
1234111white香車
1234113white歩兵
1234117black歩兵
1234119black香車
..............
1234199black香車

という感じになります。手を記録するパターンなら次のようになりますね。

gameidmoveidplayerx-beforey-beforex-aftery-afterpieceactionnarite
12341black7776歩兵移動no

さらに開発が進むと「田中氏と田村氏の対戦を検索するとき、先攻:田中/後攻:田村 と 先攻:田村/後攻:田中 と2回検索するのが大変だな…」と感じ、じゃあそこを抜き出して別テーブルにするか…と改善を進めていく感じです。(これも正規化の一種です)

がんばってくださいね。

投稿2017/07/28 11:19

編集2017/07/28 12:40
miyahan

総合スコア3095

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

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

hatsu

2017/07/28 11:29

miyahan様 ご回答ありがとうございます。 データベースの設計について違和感は持っておりました。 しかし、どのようにすべきか全く検討がつかずとりあえず動く形での解決策を投げたところでございます。 ご迷惑でなければ、お時間あるときに、膨大なカラムでのデータベースの設計の仕方の例、もしくは参考になるサイトなどありましたら教えていただきますと、非常に嬉しく思います。 よろしくお願いいたします。
miyahan

2017/07/28 12:25

乱雑でもうしわけないですが、ちょっと追記してみました。
hatsu

2017/07/29 08:57

miyahan様の追記回答はとても助かりました。 正規化について全く無知だったためqiitaからSQLアンチパターンなども図書館で借りて読み勉強し始めました。またmiyahan様がご提案してくださったテーブルの設計が綺麗な形に思えますので、参考にさせていただきます。改めてご回答ありがとうございました。
guest

0

すでに出ていますが、指し手を横並びですと180で足りるの?というのが出てきますね。
また多すぎると記憶エリアに無駄が生じますね。

投稿2017/07/28 21:38

maiko0318

総合スコア876

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

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

hatsu

2017/07/29 08:54

maiko0318様 回答ありがとうございます。 基本的に将棋の棋譜が平均120手くらいで180手を超えることがほとんどないことから、180手までとしております。また投了局面になったら、それ以降はnullとしていることから無駄が生じていることは確かですね。 正規化のところ無知だったため勉強して無駄を無くして行けたらと思います。
guest

0

専門とかではないので、聞き流してください(笑)

私ならいっそ、誰の何手目が何だけで、insertしていくのはどうですか?

id,name,teban,sashite
これで、どんどんいれてく感じ?

細かい仕様とかはもっと考えるとこはありますが、ほんととりあえずの考え方って感じで。

投稿2017/07/28 12:02

Z-TALBO

総合スコア525

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

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

hatsu

2017/07/29 09:03 編集

Z-TALBO様 ご回答ありがとうございます。 id name teban sashite 1 hoge 1 7六歩 2 foo 2 3四歩 3 hoge 3 6六歩
hatsu

2017/07/29 09:02 編集

のようなイメージですかね?
guest

0

将棋の棋譜っぽいですが、それぞれ255は必要でしょうか。varchar(10)でもいいのではないですか。
mysqlではvarchar(n)のnは文字数です。

投稿2017/07/28 11:15

SugiTK

総合スコア495

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

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

hatsu

2017/07/28 12:51

SugiTK様 回答ありがとうございます。 varchar(10)やtextでうまくいくのがわかりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問