针对自定义场景的数据库 table 设计

Database table design for a customized scenario

我正在尝试设计一个数据库来为不同的人存储一个(或多个)膳食计划。这个问题有两种不同的情况。

第一个场景:

(请参考图片)

有 4 个 table:人物、MEALPLAN、MEALPLAN_FOOD 和食物。 PERSON table 存储拥有膳食计划的每个人的基本信息。 MEALPLAN table 将跟踪每个膳食计划(饮食)。 FOOD table 是 table 不同的食物(例如鸡蛋、菠菜、红薯、燕麦片等)并存储每个 'quantity unit' 的 protein/carb/fat/calorie 信息(例如 1 杯) 对于每一种食品。 MEALPLAN_FOOD table 作为 MEALPLAN 和 FOOD 的 lookup/associative table。

我相信我已经正确设置了这些 table。每个人都有一个(或多个)膳食计划。每个膳食计划包含一个(或多个)foods/qty。我的问题出现在下一个场景中。

第二种情况:

(请参考图片)

第一种情况的局限性在于它仅存储每个膳食计划的食品列表。在第二种情况下,我们想加入额外的 table 以便可以按膳食分解和存储膳食计划。每个人将有一个(或多个)膳食计划,每个膳食计划包含 1 至 4 餐(膳食计划可能仅包含 2 或 3 餐)。为了实现这一点,第一个场景的 MEALPLAN_FOOD lookup/associative table 被替换为 2 lookup/associative tables (MEALPLAN_M<#> and M <#>_FOOD)和一顿饭 table(M1 代表第一餐,M2,M3 和 M4)。

问题:假设第一个场景的设计是正确的,那么第二个场景的设计在完成附加功能上是否正确?此设计在附加查找 table 中是否正确,以便允许每人每餐每餐计划存储食物?或者,是否有更好的 way/design 来完成这项任务?

谢谢!

每个实体 table 通常不是一个好主意(即每天 mealplan/meal 每个 table)。相反,改变您的原始设计 - 在 MEALPLAN table 上添加另一列,将外键指向一个名为 MEALOFDAY 的新 table。这样,您可以添加或删除当天的膳食(允许用户每天吃 6 餐或 10 餐),并且如果您添加另一个多对多 table MEALPLAN_MEALOFDAY.

MEALPLAN 和 MEALOFDAY 的新 table 结构可能如下所示:

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

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

或者,删除 MEALPLAN 上的 mealofday_id 并创建另一个 table,如下所示:

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