0

まず第一に、あなたは素晴らしい聴衆だということを伝えたいと思います。

Footableを持つモデルがあるアプリケーションを作成していますFoos。そして、Foo に別のパラメーター HABTM パラメーターを与えたいと思いますBar。しかし、私はテーブルを作成したくありませんBarBar開始時に 5 つのポジションがあり、5 年後にはおそらく 7 つのポジションに成長するか、まったくないためです。したがって、別のテーブルを作成して、CakePHP に別の SELECT でそのテーブルを調べさせる必要はないと思います。誰でもこれが達成できるという考えを持っていますか?

私が考える1つの解決策は、テーブル用のフィクスチャを作成し、実際にはテーブルBarsのみを追加することBars_Foosです(とにかく大きくはなりません)。しかし、通常のテストフィクスチャを使用する方法が見つかりませんController

2番目の解決策は、JSONまたはシリアル化された配列をFoo1つのフィールドに保存し、ロジックをモデルに移動することですが、それが最善の解決策かどうかはわかりません. 仮想フィールドのようなもの。

実際の例:

だから私は好きBikesです。そして、すべてBikeがそのmain_type. これは今のところ{"MTB","Road","Trekking","City","Downhill"}です。長い間、このリストはそれほど大きくならないことを私は知っています. 数年で 2 つまたは 5 つのポジションになる可能性があります。それでも比較的短くなります。

(専門のバイクは何百種類もあるという方のために、別のパラメータ欄がありますspecialized_type

これは HABTM リレーションである必要がありますが、main_typesテーブルは非常に小さいので、テーブルの作成を避けて、より簡単な解決方法を見つけたいと考えています。

なぜなら

  • このような少量のデータでMySQLを悩ませます
  • MySQL クエリが複雑になる
  • 追加のモデルを作成する必要がありますMainType
  • ほとんどのデータを必要とせず、使用したい場合にバインドを解除するモデルが他にもありますrecursive
  • 好きなものをここに挿入してください...
4

1 に答える 1

1

あなたの実生活の例から判断すると、あなたは間違った方向に進んでいると思います。クエリは複雑ではありません。CakePHP は HABTM リレーションに追加のクエリを使用します。これは追加のクエリの 1 つに過ぎず、それほどコストがかからないはずです。そして、本当に (何らかの理由で) のみを使用する必要がある場合はrecursive、バインドを解除する追加のモデルが 1 つだけです。

これは聞きたいことではないかもしれませんが、「仮想データ」をハッキングしようとするよりも、適切なデータベース ソリューションの方が優れていると思います。また、テストで使用されるフィクスチャは、テストの実行時にオンザフライでデータベースに書き込まれるデータのみを定義するため、データベースに既に存在するデータを使用するよりも明らかにコストがかかることに注意してください。

追加の列を使用してデータを格納する場合、メインの型を照会しない選択のパフォーマンスがわずかに向上する可能性がありますが、適切なインデックス作成を使用したより高速な選択など、RDBMS が提供するすべての柔軟性が失われることは間違いありません。 、単一の関連する値を更新することによって複数のレコードに影響を与えるなど。それは私にとって良いトレードオフのようには思えません。考えてみてください。Downhill Trackingこの情報が 1 つの列に文字列として格納されている場合、どのようにすべての自転車を選択するのでしょうか? LIKEおそらく醜い選択を使用することになるでしょう。

待ってください。MySQL には複数の値を保持できるSETデータ型があります。そうです、それはより簡単で複雑ではないように見えます。正しいですが、バックグラウンドではそうではありません。複雑に見える結合クエリを使用すると、適切なインデックスを使用するとかなり高速になりますがSET、列に格納されているデータに適切にインデックスを付けることができないため、型のクエリはすべての行をスキャンする必要があります。より具体的な選択を行うため。

最終的にはおそらくデータに依存するため、特定の環境で両方の方法をテストし、ワークロードの下でそれらがどのように比較されるかを確認することをお勧めします.

于 2013-07-27T16:19:45.180 に答える