0

問題をそのように置きましょう。私は 2 種類の食材を使ったピザを持っています。これらの成分は PHP の配列に格納され、MySQL ではこれらの配列の位置の合計の Int をバイナリで格納します。

つまり:

$ingredients = ["cheese","pepperoni","bacon","onion"];

ピザにチーズとベーコンが含まれている場合、値 2^0 + 2^2 = 5を保存します。

DB で値5のすべてのピザを検索し、すばやくクールな検索を取得することで達成したこと。

私の質問は次のとおりです。非常に多くの材料がある場合はどうなりますか? 2 つしか使用しない場合でも、それらが配列のより大きな位置 (100 としましょう) にある場合、私はうんざりします。

その特定の問題でどのような解決策を使用しますか?

PD - 明らかに、私はピザの会社について話しているわけではなく、ミリ秒の速度を気にしています

4

3 に答える 3

6

通常の関連テーブルを作成した方がよい ( pizzapizza_ingredientsingredients)

そして、それはあなたにとって、そしてMySQLでさえもはるかに簡単です:

# simple query to find pizza's with specified ingredients
SELECT 
  *
FROM
  pizza_ingredients tpzi
LEFT JOIN
  pizza tp ON
  tp.pizza_ID = tpzi.pizza_ID
WHERE
  tpzi.ingredient_ID IN (1,2,3,45)

テーブルの例:

pizza:

  • ピザID、ピザ名

テーブルpizza_ingredients':

  • ピザ_材料_ID, ピザ_ID, 材料_ID

テーブルingredients

  • 成分ID、成分名

興味深いのは.. チーズを使ったピザを見つけようとすると:

標準:

SELECT 
  *
FROM
  pizza_ingredients tpzi
LEFT JOIN
  pizza tp ON
  tp.pizza_ID = tpzi.pizza_ID
WHERE
  tpzi.ingredient_ID = 1

あなたの案:

SELECT 
  *
FROM
  pizza
WHERE
  pizza_ingerdients MOD = 0

遅くなります:)

于 2012-09-01T19:05:39.003 に答える
2

このようなシナリオでは、ピザとトッピングの間に多対多の関係を実装する必要があります。

于 2012-09-01T19:00:05.707 に答える
1

SET データ型について話しているようです。SET は名前のコンマ区切りリストとして入力および表示されますが、整数ビットマップとして内部的に保存されるため、検索は高速です。

ただし、要素数は 64 に制限されています。64 を超える数が必要な場合は、複数の列を含めることができます (成分 1、成分 2)。

于 2012-09-01T19:38:20.640 に答える