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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

4回答

5862閲覧

CakePHPを使って動的にテーブルを生成する

arsro

総合スコア24

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2015/11/28 19:01

編集2015/11/29 12:49

あるアカウントが作成されるごとに、そのアカウントに応じて別々のテーブルを動的に生成したいのですが、CakePHPで提供されているライブラリのようなものを見つけることができませんでした。
なので、query() を使って直接SQL文を投げる方法も考えたのですが、あまり推奨されていないようでした。

動的にテーブルを生成するようなことはあまり行わないのでしょうか。
もし、生成するとするならばquery() を使う以外で方法をご存知の方がいらっしゃいましたら、
教えていただけると助かります。
また以下は生成したいテーブルのqueryです。

sql

1CREATE TABLE `comment_table` ( 2 `comment_table_id` int(11) unsigned NOT NULL AUTO_INCREMENT , 3 `post_id` int(11) NOT NULL , 4 `user_id` int(11) NOT NULL , 5 `id` int(11) NOT NULL , 6 `text` text NOT NULL , 7 `img` text , 8 `create_at` datetime NOT NULL, 9 PRIMARY KEY (`colony_comment_table_id`) 10) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;

追記

現在開発しているアプリがツイッターのように1つのタイムラインで全員が会話するものではなく、2chの掲示板のように複数あるコミュニティ(このコミュニティはユーザーが作成することができる)の中で、タイムラインが存在するようなものなんですが、そういった場合1つのテーブルの中ですべてのコミュニティのタイムライン情報が管理されているのでしょうか。
直感的ではありますが、コミュニティごとのタイムラインを管理するようなテーブルがあったほうがスムーズのような気もするのですが。
いかがでしょうか。

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

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

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

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

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

guest

回答4

0

よほど特殊な理由が無い限りはRDBMSでデータ保存されているwebアプリケーションでテーブルを動的に生成したりはしませんね。

RDBMSはテーブルというデータ定義の下にレコードというデータそのものをぶら下げていき、原則として同じ定義(役割として同じ)データは同じテーブルに格納することで集計や検索、更新の機能と利便性を確保するという性質を持つ仕組みであるためです。
*極端にレコードが多い、年次/月次ごとにテーブルを分けたいなど、場合によっては必要な場合もあるとは思います。

「何を実現したいのか」が明確になればより「よくある」アプローチについて回答を得られるかと思いますよ。

**以下追記

現在開発しているアプリがツイッターのように1つのタイムラインで全員が会話するものではなく、2chの掲示板のように複数あるコミュニティ(このコミュニティはユーザーが作成することができる)の中で、タイムラインが存在するようなものなんですが、そういった場合1つのテーブルの中ですべてのコミュニティのタイムライン情報が管理されているのでしょうか。
直感的ではありますが、コミュニティごとのタイムラインを管理するようなテーブルがあったほうがスムーズのような気もするのですが。
いかがでしょうか。

そういった場合、RDBMSで実装するなら

  • コミュニティテーブル

コミュニティの情報を保存する

  • タイムラインテーブル

コミュニティIDとタイムラインそのもの(タイムライン作成日時やタイムライン名)を保存する

  • タイムライン参加者管理テーブル

タイムラインへの参加/退席をレコードで管理

  • タイムラインへの発言テーブル

タイムラインへの発言をレコードで管理
という様な形で実装するのが定石です。
各テーブルについて外部キーとインデックスが適切に紐づいていれば、
「このタイムラインの発言一覧を取得する」といった操作がRDBMSが得意な方法で実装可能です。

また、こうしないとコミュニティやタイムラインをまたいだ検索や統計を取ることが出来なくなったりと拡張性がほぼ無くなります。

どうしてもテーブルを分けたいのであれば、RDBMSでは無くてNoSQLやファイルベース(2chのdatのイメージ)で実装してしまった方が素直です。

投稿2015/11/28 19:12

編集2015/11/30 04:49
tanat

総合スコア18713

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

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

arsro

2015/11/30 16:43

追記に対する解答ありがとうございます。 ・コミュニティテーブル  コミュニティの情報を保存する ・タイムラインテーブル  コミュニティIDとタイムラインそのもの(タイムライン作成日時やタイムライン名)を保存する に関しては設計する際に考えついたのですが、その後の ・タイムライン参加者管理テーブル タイムラインへの参加/退席をレコードで管理 ・タイムラインへの発言テーブル タイムラインへの発言をレコードで管理 については複数のタイムラインが存在する場合、かつそれらのタイムラインがユーザーによって動的に作成される場合、タイムライン参加者管理テーブルとタイムラインへの発言テーブルを、それぞれ1つのテーブルで管理するとなると逆に煩雑になるように思いまして、 今の形で実装することにしました。 それについてはどうお考えになりますか?
tanat

2015/11/30 19:28

なぜ「逆に煩雑になるよう」に思ったのか がわからないので何ともですが RDBMSの設計について理解が浅い時点ではよく出てくる発想/設計であることは経験しています。(専門学校等で講師をすると、1クラスに1-2人くらいは動的なテーブル作成/削除で作ろうとすることがあります。) 「適切に設計すれば煩雑になり得ないし、管理もしやすい(簡単なSQL文で必要な情報が抽出できる)、パフォーマンスもそれなりに確保できる)し、拡張性も確保できる」 と考えます。 もし、このアプリケーションを外注した場合で、この仕様のアプリケーションを設計するにあたってMySQLを使ってテーブルを動的に作るという設計を出してきた場合には、即座に発注を取りやめて、今後永久にそこには仕事を発注しないと思う程度には適切では無い設計です。 とは言え、仕事では無いのであれば何事も経験なので、一度作って、管理して、評価してもらって、育てていくというプロセスを踏んで、何が必要なのかを考えていけばいいと思います。
guest

0

comment_tableを静的に用意しておいて、アカウントが作られるたびにレコード追加でいいと思います。クエリ発行にもコストがかかるので毎度動的にテーブルを作るというのはあまりやる意味がないかと思います。

どれだけのアカウントが生成されると想定されているのか分かりませんが、1000個アカウントがあったらテーブルも1000個作るんでしょうか?運用コストがものすごくかかる気がするのですが。

投稿2015/11/28 19:24

tixure55

総合スコア400

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

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

0

ベストアンサー

テーブルを分ける方法にはいろいろあります。
アプリケーション側で全ての機能を賄うのではなく、
併せて DB サーバの機能を利用してみてはいかがでしょうか?

SQL 文から推測すると、MySQL をお使いのようですね。
MySQL ならパーティショニングの機能があるので、
こちらで検討してみてはいかがでしょうか?
この機能をうまく使えば、アプリ側でわざわざ動的に生成することを
考える必要は減ることになると思います。

投稿2015/11/30 00:47

okinaka3

総合スコア304

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

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

arsro

2015/11/30 16:44 編集

アドバイスありがとうございます。 パーティショニング機能を使うとして、それは動的にパーティションすることができるのでしょうか? それとも先にあるパーティションをわけて置く必要があるということですか。
okinaka3

2015/12/01 04:09

そこは設計次第ですが、通常は事前に分けておくのが基本です。 例えば、コミュニティID をキーとして、 IDの「偶数・奇数」でテーブルを分割(2分割)、 IDの1桁目で10テーブルに分割など分割していきます。 このあたりは、どのくらいのデータ件数が登録されるかの見積もりや、 どのようなクエリを発行するかなどの設計なども重要になってきますので、 状況次第になるのかなと思います。 テーブル分割数は設定次第ですが、コミュニティごとにテーブルを分割してしまうと 大変なことになると思いますので、控えたほうがよいと思います…。
guest

0

CakePHP3を使ったテーブルの作成方法でコメントしましたが、疑問があるなら、その「質問」でわからないことはその場で重ねて質問されては? 理解できていないのに安易に解決済みにして、新たに似たような「質問」を投げるのは止めませんか?

たとえ、CakePHP などで CREATE TABLE できる機能を提供したとして、間違って作ってしまっまったテーブルをMODIFY(変更)したり、DROP TABLE する機能が必要になります。そのためにはSQLのDDLのそれなりのスキルが必要です。CakePHP を使っている人が何人も似たようなテーブルを作ってしまったら、まともにDBを管理できるでしょうか? DB管理者がいても何年か前に作られたテーブルが今も使われているのか簡単にはわからないこともしばしばです。

ここのような掲示版は h_chicKer さんと同じ様なことを調べたい人が読んでいけば、 h_chicKer さんと同じ様な疑問・勘違いなどを解決して正解を見つける道しるべになる場にしたいものです。

投稿2015/11/28 21:37

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問