我在设计数据库时遇到问题。 我必须做一个包含让我们说食谱的女巫。 我有表格,包括说:香料,肉类,蔬菜。
现在我需要从Spices,Meats,Veggies获取数据并在Recipes表中创建配方。我的问题是如何将所有这些都映射到食谱中,考虑到一个食谱可以有更多的蔬菜,更多类型的满足和更多的香料。
感谢。
答案 0 :(得分:8)
肉类,蔬菜和香料是成分,IngredientType
(M,V,S)用于识别每个群体。
如果由于某种原因您觉得每种成分都需要自己的表,因为它们有不同的列,那么请使用此模型。将所有常用列保留在Ingredient
表中。
答案 1 :(得分:4)
在我看来,你在谈论一个与n-m的关系:
您通常将其存储在数据库中的方式是使用Recipe和Veggies之间的关联表。
Recipe <----> RecipeVeggies <----> Veggies
配方和蔬菜必须各有一个唯一的主键(id),表RecipeVeggies存储两个主键,以创建两者之间的关联。
这是一个小结构示例:
Recipe : id, name, description
Veggies : id, name
RecipeVeggies : recipe_id, veggies_id
RecipeVeggies表创建存储配方和素食之间的关系。
您必须为香料和肉类创建类似的表格。
我希望我很清楚,否则可以随意提出更多问题,我会改进我的答案。
答案 2 :(得分:1)
这就是我要做的事。
我会使用继承映射,每个ORM都有它,而且几乎每种Web语言都有它(php有doctrine,java和.net都有Hibernate等)。
正如此link中的示例所示,您的层次结构顶部有一个表,对于您的系统,我称之为成分,然后将素食/肉类/香料作为子表。然后我会创建一个名为Recipe的表,它与成分表有一对多的关系。
我希望您使用ORM,这样可以节省大量的时间,并且可以减少错误。
感谢您提出这个有趣的问题,它有一个更主观的设计类型问题,以获得创意果汁。
答案 3 :(得分:0)
你可以这样做..在食谱表中列出食谱名称的详细信息(比如说x),对食谱项目的每个内容重复,然后你可以用食谱项目创建另一个表格它的名称和编号..在原始表中使用此编号..简而言之,将配方表标准化。您可以为每种成分进一步完成。
答案 4 :(得分:0)
你有一个所谓的n:m
食谱和配料之间的关系。在关系数据库中解决此问题的常用方法是引入映射表。
假设您的每个食谱都有一个id(RecipeID
),每个成分也有一个id(IngredientID
)。然后,您创建一个包含RecipeID
列和IngredientID
列的新表。此表中的每条记录都将一种成分映射到配方,反之亦然。
如果您希望进一步限定关系,这样的表格也很方便。例如,您可以在映射表中添加另一列,其中包含配方需要多少成分的说明。