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

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

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

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

CakePHP

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

Q&A

解決済

2回答

1648閲覧

cakePHP リレーションシップ HasAndBelongsToMany はどんな場合に必要か?

numa

総合スコア32

SQL

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

CakePHP

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

0グッド

0クリップ

投稿2015/11/19 07:31

編集2015/11/19 07:41

cakePHPのデータベース利用について勉強中の者です.

こちらのページに記載されている内容に沿って知識を習得しています.
http://book.cakephp.org/2.0/ja/models/associations-linking-models-together.html#id2

読み進めていて思った事なのですが,
hasAndBelongsToMany(以下 HABTM と記す)はCakePHPで必要でしょうか?

このページの説明は次の通りです.

リレーションシップ アソシエーション名 例
1 対 1 hasOne ユーザーは1つのプロフィールを持っている
1 対 多 hasMany ユーザーは複数のレシピを持っている
多 対 1 belongsTo レシピはユーザーに属している
多 対 多 hasAndBelongsToMany レシピは材料を持っており、かつ属している

例えば次の様にするとHABTMを使用する必要はなくなると考えます.
userテーブル
(PK)id

recipeテーブル
(PK)id
(FK)user_id

Ingredientテーブル
(PK)id
(FK)recipe_id

私は以前1つのモデルにbelongsToとHABTMが設定されているプログラムを見たことがあります.実際の所そのプログラムは問題なく動いていました.

なのでbelongsToとhasManyの両方を記述してもプログラムは動作すると勝手に理解しております.
そうするとHABTMは中間となるテーブルを用意する必要もあるようですし,手間もかかり,利用するメリットが分かりません.

どのような場合に用いると良いのか教えてください.

よろしくお願いいたします.

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

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

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

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

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

guest

回答2

0

中間テーブルとのjoinが無くなるので、それだけ早くなります。
非正規化と同じで、速度のために…という事はありえますが、現実のシステム設計でそのようなケースはまずありません。

投稿2015/11/19 08:02

anonymouskawa

総合スコア856

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

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

0

ベストアンサー

えっと、質問文の構造では、「1つの材料が複数のレシピで使われる」という状況を表現できないと思うのですが…

よくある例ではユーザーと権限(1人のユーザーが複数の権限を持てる)という例があって、逆に権限側も複数のユーザーが同じ権限となるので、中間テーブルを置いての対応が必要になります。

投稿2015/11/19 08:01

maisumakun

総合スコア145192

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

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

anonymouskawa

2015/11/19 08:05

cakePHPの公式の例示であり、学習者であるmumaさんはこの状況が不自然かどうかという判断はつかないと思います。 この例示自体が問題なので、私も一瞬「?」となりましたが…。
maisumakun

2015/11/19 08:16

Cakeのドキュメントの方にも目を通してみましたが、 「hasMany と HABTM の大きな違いは HABTM モデル間のリンクは排他的ではない、ということです。 たとえば、Recipe (レシピ) モデルと Ingredient (材料) モデルを HABTM を使って結合させるとします。 ここで、トマトを材料とするものは、スパゲッティのレシピだけではないということです。 他にもサラダのレシピにも使われます。」 というように、この構造を取るだけの理由説明がありました。
anonymouskawa

2015/11/19 08:25

CakePHPの中身も多対多を実装するために中間テーブルを使えという思想の元成り立っているので、理論的には多対多に見える構成でも、中身は一対多と一対多の組み合わせをした中間テーブルを利用していることになります。 あまり良くはないですね、この書き方。
numa

2015/11/24 15:33

公式ページの理由は既に何度も読んでいたのですが,正しく理解できていませんでした. 色々調べてみて,ようやく例えの意味が分かりました. お二人方,どうもありがとうございました. またよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問