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

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

ただいまの
回答率

90.01%

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

受付中

回答 3

投稿

  • 評価
  • クリップ 2
  • VIEW 3,172

Hookclaw

score 30

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

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

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

A.“従来の定義”

CREATE TABLE `People` (
    `person_id` INT NOT NULL,
     PRIMARY KEY(`person_id`)
);

CREATE TABLE `Items` (
    `person_id` INT NOT NULL,
    `item_seq` INT NOT NULL,
    PRIMARY KEY(`person_id`,`item_seq`),
    FOREIGN KEY(`person_id`) REFERENCES `People` (`person_id`)
);


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

CREATE TABLE `People` (
    `id` INT NOT NULL,
     PRIMARY KEY(`id`)
);

CREATE TABLE `Items` (
    `id` INT NOT NULL,
    `person_id` INT NOT NULL,
    PRIMARY KEY(`id`),
    FOREIGN KEY(`person_id`) REFERENCES `People` (`id`)
);


C.“その他”

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/03/07 16:13

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

    キャンセル

+2

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

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

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


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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/03/19 13:02

    期待した回答をありがとうございます。
    ピンポイントの質問で言葉足らずであったにもかかわらず、こちらの意を汲んでいただき、少しズームアウトした回答を頂戴いたしました。

    複雑なSQLを書かざるおえないとき、Modelに頼ると開発・実行ともに非常に時間がかかる感じがしました。
    しかし、Modelを通すことでしかCakePHP3のキャッシュ効果が得られない為、実運用での経験則を伺いたかった次第です。

    そして、miyabi-sunさんの意見に賛同します。
    >糞重い
    >レコード数のカウントSQLを勝手に作って飛ばし始める
    >PDOを一から書いて使ったほうが話が早いと思えるケースは多々ある
    WEB系初心者の自分には、まだまだ批判できる立場にありませんが、この2カ月ほどCakePHP2,3を使用して、凝ったことも実装してみましたが、私も感じ始めていたところです。

    今、他のFWに手を出すのは、時間の無駄と思えますので、少なくともCakePHP3を評価できる程度まで、使ってみたいと思います。

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/03/18 09:33

    回答ありがとうございます。
    経験に沿った回答を頂きたっかのですが、質問の仕方が悪かったようです。

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

    キャンセル

  • 2016/03/19 01:50

    CakePHPは7年前にリリースされ、現在もアップデートされているオープンソースフレームワークです。
    多くの人の経験や知識をもとに設計され規約が作られています。

    規約に従うことで、実績のあるやり方を踏襲することができるのではないでしょうか。

    あなたの経験した「未熟なFWや、FWと相性の悪い設計・実装」がどのようなものかわかりませんが、CakePHPの規約に従うことで同様の問題が生じるのであれば
    CakePHPの開発コミュニティでフィードバックを行うと良いと思います。

    キャンセル

  • 2016/03/19 13:01

    今回の質問は、CakePHP全体ではなく、CakePHP3(リリースから1年未満。新しいORMが導入されている)の質問になります。

    このスレッドの回答にも、「根本的な話としてCakePHPの規約や動作に首を傾げる箇所もあります」との意見があります。

    WEB系初心者の自分には、まだまだ批判できる立場にありませんが、少なくともCakePHP3を評価できる程度まで、使ってみたいと思います。

    キャンセル

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

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

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