2016-02-22 40 views
2

我试图设计一个数据库,它将为不同的人存储一个(或多个)用餐计划。这个问题有两种不同的情况。自定义场景的数据库表设计

第一种方案:

(请参考图像)enter image description here

有4个表:PERSON,MEALPLAN,MEALPLAN_FOOD,和食物。 PERSON表为每个拥有膳食计划的个人存储基本信息。 MEALPLAN表将跟踪每个膳食计划(饮食)。 FOOD表是不同食物(例如鸡蛋,菠菜,红薯,燕麦等)的表格,并为每个食物项目存储每个“数量单位”(例如1杯)的蛋白质/碳水化合物/脂肪/卡路里信息。 MEALPLAN_FOOD表用作MEALPLAN和FOOD的查找/关联表。

我相信我有这些表设置正确。每个人都有一个(或更多)膳食计划。每个膳食计划包括一个(或更多)食物/数量。我的问题出现在下一个场景中。

第二种情景:

(请参考图片)enter image description here

第一种方案是在事实上,它只是存储的每餐食品计划项目的列表限制。在第二种情况下,我们希望纳入额外的表格,以便膳食计划可以分解并按用餐进行存储。每个人将有一个(或更多)的膳食计划,每个膳食计划有1到4份膳食(膳食计划可能只包含2或3份膳食)。为了实现这一点,第一个场景的MEALPLAN_FOOD查找/关联表被替换为2个查找/关联表(MEALPLAN_M <#>和M<#> _FOOD)和餐桌(用于餐1,M2,M3和M4的M1 )。

问题:假设第一个场景的设计是正确的,第二个场景的设计是否正确完成了附加功能?这种设计在附加查找表中是否正确,以便每人每餐膳食计划可储存食物?或者,有没有更好的方法来完成这项任务?

谢谢!

+3

你发现任何时间你自己在表名或者列名中输入一个数字(除了address_line_1和address_line_2是街道地址),你应该得到一个大红旗,说明你做错了什么。 –

+0

@TomH,理解,谢谢你的信息。我会用它前进。 – Aaron

回答

3

通常不是每个实体都有一张桌子的好主意(即每张膳食计划/当天的餐桌)。相反,请更改您的原始设计 - 在MEALPLAN表中添加另一列,即将外键添加到名为MEALOFDAY的新表中。这样,您可以添加或删除当天的餐食(允许用户每天有6或10餐),并且如果您为MEALPLAN_MEALOFDAY添加另一个多对多表格,则可以允许在多餐之间共享膳食计划。

为MEALPLAN和MEALOFDAY您的新表的结构migh TLOOK像:

MEALPLAN 
======== 
mealplan_id (pk) 
date 
notes 
person_id (fk) 
mealofday_id (fk) 

MEALOFDAY 
========= 
mealofday_id (pk) 
meal_number 
meal_description 

另外,坐上MEALPLAN摆脱mealofday_id并创建另一个表像这样:

MEALPLAN_MEALOFDAY 
========= 
mealofday_id (fk/pk) 
mealplan_id (fk/pk) 
+0

我试图把它画出来,但是在理解你的想法时有问题。在你的推荐中,“MEALOFDAY”究竟是什么存储? 'MEALOFDAY'只有'id'和'mealnumber'两列吗?所有其他表格是否保持不变(基于情景一)? – Aaron

+0

这与MEALPLAN_FOOD的关系相似。它也可能有某种描述(“早餐”)。否则其他表保持不变。 –

+0

每个“MEALPLAN_FOOD”记录存储每个食物项目和数量。 “MEALOFDAY”存储定义膳食编号的相应记录(例如膳食1,5)。 “MEALPLAN_FOOD”和“MEALOFDAY”将具有一对一的关系。两个快速澄清的问题:1.需要添加一个额外的属性到'MEALPLAN',因为当前的PK将不再对应一个膳食计划编号(每个'MEALPLAN'记录每个'MEALOFDAY'记录的FKs),是正确的吗? 2.如果一个膳食计划每餐有6餐和5个食物,那么“MEALPLAN”,“MEALPLAN_FOOD”和“MEALOFDAY”各有30条记录,是否正确? – Aaron