0

テーブル間の関係に関しては、実行したいという考えがあり、データベースの設計に非常に慣れていません。3 つの材料を 3 つ<input type="text">のフィールドに入力して、それらの材料を使用したすべてのレシピを検索できるようにしたいと考えています。

私は3つのテーブルを持っています...

  • 材料
  • レシピ
  • メニュー

太字の列が主キーで、イタリック体の列を外部キーにしたい。

例 - iName は、iName1 iName2 および iName3 の主キーです。


材料

iName - iType

レシピ

mName - iName1 - iName2 - iName3 - メソッド

メニュー

mName - mDisscription - mアレルギー


私の質問は...私のテーブル間の関係は、私がやりたいことに対して十分に効率的ですか? たとえば、結合クエリはどうなるでしょうか

SELECT mName, mDiscripton, mAllergy
FROM menu
WHERE iName1 = input etc etc

この件に関する光を当てることは大きな助けになります。私はすでにデータベースの1つのテーブルバージョンを持っており、使用しているクエリは正常に動作します。データベースを再設計し、クエリを適切に変更したいだけです。

4

2 に答える 2

0

あなたのデザインには、効率的にするために 1 つのテーブルがありません。レシピ テーブルから iName1 から iName3 を削除し、レシピと 1 つの材料の外部キーを持つマッピング テーブル「recipe_ingredients」を追加します。次に、すべてのレシピに対して、そのテーブルに 1 つから複数の行が表示されます (私の例を見てください)。ただし: 材料が使用されているすべてのレシピを簡単に検索できます。また、必要に応じて 1 つのレシピに 10000 個の材料を使用できます。

テーブルメニューとレシピの関係は?メニューは常に 1 つのレシピで構成されていますか? それ以外の場合は、その関係のマッピング テーブルも追加します。

SELECT mName, mDiscription, mAllergy 
    FROM menu
        JOIN recipe ON recipe.mName = menu.mName
        JOIN recipe_ingredients ON recipe_ingredients.mName = recipe.mName
    WHERE recipe_ingredients.iName = 'whatever'
于 2013-01-15T13:21:58.917 に答える
0

2 つのテーブル間の n..m 接続を保存するために 1..n 列を使用しないでください。

1つの材料で異なるレシピを使用できるため、対応するテーブルが必要になります。それらはしばしばtable1_2_table2と呼ばれ、あなたの場合はrecipe2ingredientと呼ばれます。そこに、両方のテーブルの主キーを保存します(ほとんどの場合、そのテーブルの結合された主キーとして、理にかなっています)

複数のメニューでレシピを使用する可能性があるため、メニューとレシピについても同じことが言えます。

そう

Table 1 - Menu    (ID, Name, ... whatever columns you need on top of that)
Table 2 - Recipe (ID, Name, ...whatever columns you could desire)
Table 3 - Menu2Recipe( IdMenu, IdRecipe)
Table 4 - Ingredient (ID, Name, measurement unit)
Table 5 - Ingredient2Recipe( IdRecipe, IdIngredient, Amount )

これで少しはお分かりいただけると思います。

于 2013-01-15T13:20:09.827 に答える