2011-01-27 106 views
0

我發現很難決定數據庫的高效設計。我的應用程序會從用戶那裏得到一些成分(表格),並檢查數據庫以找到可以從用戶提供的成分列表中準備的配方。設計數據庫

我最初的設計是

Useringredients(ing_id,ing_name..); 

配方數據庫將

recipe(rec_id,rec_text,...); 
items_needed(rec_id,item_id,...); 
items(item_id,item_name); 

這是一個好辦法嗎?如果是的話,我將如何查詢從用戶成分列表中檢索食譜。

幫助將非常感激。

+0

關於數據庫存儲食譜的許多問題,例如[this one](http://stackoverflow.com/questions/3225536/database-design-for-storing-食品配方)。我記得最近看到一個類似的問題,關於食譜與一些可用的配料的最佳匹配,但我現在找不到它...... – pascal 2011-01-27 14:22:22

回答

1

此設計可以工作。你有一個桌面錄製食譜,一個錄製項目和一個錄製兩者之間的多對多關係(儘管我會按照你的命名約定來保持事物的一致性)。

要獲得包含在列表中的至少一個項目的任何配方,你可以使用以下命令:

Select rec.rec_id, 
     Count(itn.item_id) as [NumMatches] 
From recipe as rec 
Join items_needed as itn on itn.rec_id = rec.rec_id 
Where itn.item_id in (comma-delimited-list-of-itemIDs) 
Group By rec.rec_ID 
Having Count(itn.item_id) > 0 
Order By Count(itn.item_id) desc 

這將返回一個包含至少一些被選中的項目,與排序任何食譜具有最高匹配數量的第一食譜。

+0

只是爲了重述我的問題,請考慮我發送一個包含10個項目(userIngredients)的表和我想知道可以用這10個項目的組合來準備的食譜。不一定非要全部10個項目,比如只需要準備4個配料即可。 – Neelesh 2011-01-27 10:46:35

+0

我剛修改了查詢。現在它將返回至少有一個匹配的任何配方,並且會對它們進行排序,使列表中的較高者與列表中的項目匹配得越多。 – 2011-01-27 10:50:28

0

下面的查詢應該給你使用的成分用戶搜索中的任何一個獨特的配方列表爲

select distinct rec_id,rec_text,ii.item_name 
from recipe rr 
join items_needed itn on itn.rec_id=rr.rec_id 
join items ii on ii.item_id=itn.item_id 
join userIngredients ui on ui.ing_id=ii.item_id 

亞科夫的查詢看起來像它會處理你想要的所有成分的情況。您可能可以用(select ing_id from userIngredients)替換(comma-delimited-list-of-itemIDS