1

私は自分のために食べ物のレシピを保存するJavaプログラムを構築しようとしています。プログラムは、データベースに保存されているレシピを保存、検索、変更できる必要があります。慣れているので現在Access2003を使用していますが、後でMySQLを使用する可能性があります。

ここでの問題はおそらく非常に基本的なものですが、私が問題を抱えているのは論理モデルの実装です。これをどのように解決するか、またはこれを行うためのより良い方法があるかどうかを知りたいです。

これが具体的な例です。「にんじん」のように、材料をデータベースに保存したいと思います。しかし、特に私が英語でさえないので、多くのアイテムには別名があります。たとえば、キャロットは英語のキャロットだとしましょう。今、キャロットは私の言語では「モロット」です。たぶん後で私はジェイミー・オリバーのショーを見て、彼はニンジンを「shapdoodles」のようなものと呼んでいます。

これらの材料を保存したいのは、これら3つのレシピを追加して、後で「にんじん」を検索すると、にんじんだけでなく、にんじんやにんじんも含まれるレシピをプログラムにリストしたいからです。 、ただ違う名前!

とてもシンプルに聞こえますが、最初は、1つのテキストフィールドを持つ「材料」のテーブルを作成するのと同じくらい簡単だと思いました。テキストは主キーになり、「ニンジン」や「シャプドゥードル」などの材料名が格納されます。このテーブルはテーブル「Ingredientlist」に接続され、Ingredientlistは「RecipeDescription」などにつながります。

nameとalternatenameの2つのテキストフィールドを持つ別のテーブルを追加し、Ingredientのテキストフィールドをこれら2つのテキストフィールドの両方に対する外部キーにするだけで、これら2つのテキストフィールドが一緒になってテーブルの主キーとして機能すると仮定しました。私はこの種の結果についてちょっと考えていました:

AlernateIngredientTable:
carrot  shapdoodle
carrot morot

などなど...後でクエリを送信して、このテーブルで「ニンジン」に関連するすべてのものを検索し、そこからニンジン、shapdoodles、またはモロットに関連するレシピを検索することができます。

テーブルの2つのフィールドに同じ外部キーを追加できなかったので、ちょっと迷ってしまいました。

4

1 に答える 1

1

モデルを変更し、材料とそのすべての名前を関連付けるテーブルを作成する必要があります。にんじんに相当するすべての材料は同じIDを切ります。次に例を示します。

table Ingredient(id, name)

id    Name
---------------
1    carrot
1    shapdoodle
1    morot
2    potato
2    patata
3    sugar
3    brownsugar
3    anothernameforSugar

そしてレシピの表:

table recipe(id, name, preparation_time)
1    carrot cake    45

レシピとその材料を関連付けるための3番目のテーブル

table recipeToIngredient(recipeId, ingredientId)
1    1
1    3

この例では、ID 1の「キャロットケーキレシピ」を定義しました。このレシピには、ニンジン(表「成分」のID 1)と砂糖(ID 3)の2つの材料が含まれています。

にんじん/にんじんなどを含むすべてのレシピを取得するには:

SELECT recipe.name FROM recipeToIngredient, recipe
WHERE recipeToIngredient.recipeId=recipe.id
AND ingredient.id = recipeToIngredient.ingredientId 
AND recipeToIngredient.ingredientId = (SELECT id FROM ingredients WHERE name'carrot')

基本的に、ここで行ったことは、材料名が主キーであるモデルを使用する代わりに、材料に「id」フィールドを配置することです。このように、名前は言語に応じて変更されますが、IDは特定の材料に対して常に同じであり、材料名ではなくIDに従ってクエリを実行できます。

もっと助けたり説明したりできるかどうか教えてください。

于 2012-10-06T14:21:04.530 に答える