2012-10-06 20 views
1

我正在嘗試構建一個存儲食物食譜的Java程序。該程序應該能夠存儲,搜索和更改存儲在數據庫中的食譜 。目前我使用的是Access 2003,因爲我習慣了它,但我很可能會在以後使用MySQL。新手數據庫:同一個表的外鍵?

這裏的問題很可能是非常基本的,但是我遇到的問題是實現我的邏輯模型,我想知道如何解決這個問題,或者是否有更好的方法來做到這一點。

所以,這裏的東西,這裏有一個具體的例子: 我想存儲數據庫中的成分,如「胡蘿蔔」。 但是很多項目都有其他名稱,特別是因爲我甚至沒有英文,所以: 假設胡蘿蔔是英文的胡蘿蔔。 現在胡蘿蔔是我的語言中的「Morot」。我可能會後來看Jamie Oliver的節目,他把胡蘿蔔叫做「shapdoodles」或其他東西。

我想存儲這些成分的原因是因爲如果我添加這三個食譜,然後再搜索「胡蘿蔔」,我希望該程序不僅列出涉及 胡蘿蔔的食譜,還包括morot和shapdoodles,因爲, ,他們也是胡蘿蔔,只是不同的名字!

聽起來很簡單,起初我認爲這只是一個簡單的表格「成分」與一個文本字段。 文本將是一個主鍵,它將存儲配料名稱,如「胡蘿蔔」或「沙皮面」。 此表格將與表格「Ingredientlist」和Ingredientlist關聯起來,導致「RecipeDescription」等。

我假設我可以簡單地添加另一個帶有兩個文本字段,名稱和備用名稱的表格,並且只需將Ingredient的文本字段作爲這兩個文本字段的外鍵,並將這兩個文本字段一起用作表格的主鍵。 我有點想這種結果的:

AlernateIngredientTable: 
carrot shapdoodle 
carrot morot 

等等......所以,當後來我可以簡單地發送查詢,發現該表中所涉及的一切「胡蘿蔔」,並從那裏找到與胡蘿蔔或沙拉醬或三明治有關的食譜。

那麼,因爲我不能將相同的外鍵添加到表中的兩個字段,我有點失落!

+1

看起來您正在尋找一個本地化解決方案,而不是您想要能夠擁有其他「上下文」來決定應該與實體關聯的名稱的語言環境。這可能會幫助你: http://stackoverflow.com/questions/316780/schema-for-a-multilanguage-database – marko

回答

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 這個食譜有2種成分:胡蘿蔔(表'成分'中的id 1)和糖(id 3)

檢索所有的食譜包括胡蘿蔔/ morots的/ etc:

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運行查詢,而不是配料名稱。

讓我知道,如果我可以幫助/解釋更多。

+0

@Deragon:更新的答案 – mbarthelemy

+0

我想我明白了!謝謝! – Deragon

相關問題