【问题标题】:Database table design for a customized scenario定制场景的数据库表设计
【发布时间】:2016-02-22 17:59:47
【问题描述】:

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

第一个场景:

(请参考图片)

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

我相信我已经正确设置了这些表。每个人都有一个(或多个)膳食计划。每个膳食计划由一种(或多种)食物/数量组成。我的问题出现在下一个场景中。

第二种情况:

(请参考图片)

第一个场景的局限性在于它只存储每个膳食计划的食物列表。在第二个场景中,我们想合并额外的表格,以便可以按餐分解和存储膳食计划。每个人将有一个(或多个)膳食计划,每个膳食计划包含 1 至 4 餐(膳食计划可能仅包含 2 或 3 餐)。为了实现这一点,第一个场景的 MEALPLAN_FOOD 查找/关联表被替换为 2 个查找/关联表(MEALPLAN_M 和 M_FOOD)和一个膳食表(M1 表示膳食 1、M2、M3 和 M4 )。

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

谢谢!

【问题讨论】:

  • 任何时候你发现自己在表名或列名中输入了一个数字(除了address_line_1address_line_2 用于街道地址),你应该得到一个大红旗你做错了什么。
  • @TomH,明白了,谢谢你的信息。我会继续使用它。

标签: sql database postgresql database-schema lookup-tables


【解决方案1】:

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

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

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)

【讨论】:

  • 我试图把它画出来,但在理解你的想法时遇到了问题。在您的建议中,MEALOFDAY 存储的究竟是什么? MEALOFDAY 是否只有 idmealnumber 等 2 列?是否所有其他表都保持不变(基于方案一)?
  • 类似于 MEALPLAN_FOOD 的关系。它也可能有某种描述(“早餐”)。否则其他表保持不变。
  • 每个 MEALPLAN_FOOD 记录存储每个食品项目和数量。 MEALOFDAY 存储定义膳食编号的相应记录(例如膳食 1,5)。 MEALPLAN_FOODMEALOFDAY 将具有一对一的关系。两个快速澄清的问题: 1. 需要向 MEALPLAN 添加一个附加属性,因为当前 PK 将不再对应于膳食计划编号(每个 MEALPLAN 记录 FK 到每个 MEALOFDAY 记录),对吗? 2. 如果一个膳食计划有 6 餐,每餐 5 种食物,那么 MEALPLANMEALPLAN_FOODMEALOFDAY 将各有 30 条记录,对吗?
  • 由于字符数有限,我无法在上一条评论中标记您。感谢您的帮助!
  • 啊哈,我明白了!将mealofday_id 替换为MEALPLAN_MEALOFDAY 表仍将允许MEALPLAN 的自动增量PK 作为膳食计划编号。感谢您的澄清!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多