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

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

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

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

データベース

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

Q&A

3回答

5498閲覧

CakePHPでのDBデザイン「主キーの決定」

Hookclaw

総合スコア32

CakePHP

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

データベース

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

0グッド

2クリップ

投稿2016/02/28 01:22

DB設計については、10年ほどのキャリアになります。
CakePHP2で2カ月ほどコーディングしてCakePHP3を勉強し始めたばかりのWeb系初心者です。

以下の規約を読んで、疑問が出てきました。
http://book.cakephp.org/3.0/ja/intro/conventions.html

CakePHPの歴史は古いので熟練者も多数いらっしゃるかと思います。
熟練者の方にお聞きしたいのですが、CakePHP3でコーディングする場合、
以下のどのケースが、望ましいと考えますか?

A.“従来の定義”

SQL

1CREATE TABLE `People` ( 2 `person_id` INT NOT NULL, 3 PRIMARY KEY(`person_id`) 4); 5 6CREATE TABLE `Items` ( 7 `person_id` INT NOT NULL, 8 `item_seq` INT NOT NULL, 9 PRIMARY KEY(`person_id`,`item_seq`), 10 FOREIGN KEY(`person_id`) REFERENCES `People` (`person_id`) 11);

B.“CakePHPの規約を尊重した定義”
※規約の解釈が間違っている場合、御指摘頂ければ幸いです。

SQL

1CREATE TABLE `People` ( 2 `id` INT NOT NULL, 3 PRIMARY KEY(`id`) 4); 5 6CREATE TABLE `Items` ( 7 `id` INT NOT NULL, 8 `person_id` INT NOT NULL, 9 PRIMARY KEY(`id`), 10 FOREIGN KEY(`person_id`) REFERENCES `People` (`id`) 11);

C.“その他”

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

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

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

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

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

guest

回答3

0

CakePHP は命名規則が重要なフレームワークで、単数形/複数形などの決まりに沿ってコードを書いていくことで Model への記述等を CakePHP 側に任せることを売りにしています。もし CakePHP で使うためにデータベースから設計するのであれば、B の規約遵守型をおすすめします。というのも、これに従うことで Model フィールドなどをコマンド一発で生成したり、リレーションなどを簡単に設定できるためです。

ただ、CakePHP の規約が趣味に合わないのであればそれを無視しても問題ありません。自分でその都度フィールドを記述していけば良いですし、マニュアルにもその旨は細かく記載されています。

(個人的には People テーブルなら CakePHP でなくても id とする派ですが…w)

投稿2016/02/28 05:25

chitoku

総合スコア1610

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

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

Hookclaw

2016/03/07 07:13

すみません。熟練者の方へ質問したつもりです。 プロフィールにPHPをかじっただけと書かれていますので、質問の意図にそぐわない回答とさせて頂きます。 書かれている内容については、公式サイトのHelloWorld的な練習課題にも挙げられており、CakePHP初心者の方でも書ける内容だと思います。
guest

0

根本的な話としてCakePHPの規約や動作に首を傾げる箇所もあります。

しかし、汎用的なシステムを構成するというFW本来の目的で考えれば、
各テーブル名は複数形、idというオートインクリメントのカラムがある作りは常に最善とは呼べないものの、
多数のパターンに適合する現実的な設計かと思います。

そして同じプロジェクトで開発するメンバーは、
これの規約に同意するものとして考えています。
従ってCakePHPの規約は多くの場合、プロジェクトの規約として用いられます。


今回の例ではAとBのプランを上げてますが、実際に実装して比べてみてください。
テーブルを複合主キーで管理するならば、CakePHPの便利機能に頼る事は難しく、管理は相応のコストが必要となります。
凝った事をしはじめて、複数レコードを同時に編集するなどのケースを考えると、Aプランではitem_seqの整合性をどうとるかで凄まじく時間をとられるはずです。

今回の例では1レコードのparsonが、何個のアイテムを所持しているかしか分からないので、
これだけの情報では規約を崩すか否かの選択は誰にも出来ません。

CakePHPのやり方が嫌ならどうぞCodeigniterでもお使い下さいという回答が関の山です。
実際糞重くて、レコード数のカウントSQLを勝手に作って飛ばし始めるCakePHPをなだめすかしながら使うより、
PDOを一から書いて使ったほうが話が早いと思えるケースは多々ありますよ、マジな話。。。

投稿2016/03/19 02:35

miyabi-sun

総合スコア21158

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

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

Hookclaw

2016/03/19 04:02

期待した回答をありがとうございます。 ピンポイントの質問で言葉足らずであったにもかかわらず、こちらの意を汲んでいただき、少しズームアウトした回答を頂戴いたしました。 複雑なSQLを書かざるおえないとき、Modelに頼ると開発・実行ともに非常に時間がかかる感じがしました。 しかし、Modelを通すことでしかCakePHP3のキャッシュ効果が得られない為、実運用での経験則を伺いたかった次第です。 そして、miyabi-sunさんの意見に賛同します。 >糞重い >レコード数のカウントSQLを勝手に作って飛ばし始める >PDOを一から書いて使ったほうが話が早いと思えるケースは多々ある WEB系初心者の自分には、まだまだ批判できる立場にありませんが、この2カ月ほどCakePHP2,3を使用して、凝ったことも実装してみましたが、私も感じ始めていたところです。 今、他のFWに手を出すのは、時間の無駄と思えますので、少なくともCakePHP3を評価できる程度まで、使ってみたいと思います。
guest

0

以下のどのケースが、望ましいと考えますか?

望ましいのは規約に沿った作りです。
「規約に沿わないのが望ましい」という回答をする人はいないはずです。

技術的には規約から外れることも可能です。
CakePHPの規約以外の制約や考え方の違いのため、
規約に沿わない作りにしたいなら、それでも構わないと思います。

投稿2016/03/16 04:49

Hiron

総合スコア32

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

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

Hookclaw

2016/03/18 00:33

回答ありがとうございます。 経験に沿った回答を頂きたっかのですが、質問の仕方が悪かったようです。 あと、経験上、未熟なFWや、FWと相性の悪い設計・実装というものもあります。 無条件に >「規約に沿わないのが望ましい」という回答をする人はいないはずです。 というのは、言いすぎだと考えます。
Hiron

2016/03/18 16:50

CakePHPは7年前にリリースされ、現在もアップデートされているオープンソースフレームワークです。 多くの人の経験や知識をもとに設計され規約が作られています。 規約に従うことで、実績のあるやり方を踏襲することができるのではないでしょうか。 あなたの経験した「未熟なFWや、FWと相性の悪い設計・実装」がどのようなものかわかりませんが、CakePHPの規約に従うことで同様の問題が生じるのであれば CakePHPの開発コミュニティでフィードバックを行うと良いと思います。
Hookclaw

2016/03/19 04:01

今回の質問は、CakePHP全体ではなく、CakePHP3(リリースから1年未満。新しいORMが導入されている)の質問になります。 このスレッドの回答にも、「根本的な話としてCakePHPの規約や動作に首を傾げる箇所もあります」との意見があります。 WEB系初心者の自分には、まだまだ批判できる立場にありませんが、少なくともCakePHP3を評価できる程度まで、使ってみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問