2011-01-27 107 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