我想在数据库的某个字段中指向 2 种类似的事物。 其中之一是另一种或多种的组合。

在这种情况下我应该如何设计我的数据库?

在我当前的示例中,我有(简单)食品成分(组合)食品,我希望其中一个或这些东西成为膳食/饮食表中的条目。

因此,用户可以在一顿饭的某个时间点吃像苹果这样的简单食物,也可以吃像苹果派这样的复杂食物,它由 200 克苹果和 100 克面粉和 30 克糖等组成。 我在想这样的事情:

成分|IID| |姓名| |卡路里|

菜品|DID| |姓名| (|卡路里|???)

食品数据|DID| |IID| |金额|

.

用户|UID| |名字| |姓氏| 等等。

膳食|UID| |DID| |日期/时间| |金额|

我觉得这真的很烦人,因为每个单一成分都必须有两个(基本相同的)条目开始:1 个在成分表中,1 个在菜肴表中,这样它就可以在一顿饭中配对。 我在这里错过了什么吗? 有没有解决的办法?

另外我不知道一道菜是否应该有数据库中列出的卡路里。 在数据库中拥有一道菜的卡路里是相当冗余的,因为它可以在进行查询时计算(通过总结和计算其各自的成分)。 但这似乎非常低效,因为必须对菜肴的每个查询都进行此计算(并且添加宏/营养值/价格等内容会变得更糟,为了清晰/简单起见,我在这里省略了这些内容)。

此外,如果我确实有一道菜的卡路里(以及其他与食物有关的其他东西),那么在这种情况下,我可以只有一张桌子,例如:

食品|FID| |姓名| |卡路里| (|简单[bool]|?)

食品数据|FID| |FID| |金额|

总的来说,这看起来会更好。 “简单”字段将区分我认为值得放入的“简单成分”或“菜肴”,因此您不必在食品数据中搜索每个项目。

但是,如果我想介绍特定的 Dish-Only 数据,那么我会制作一些其他表格,例如:

菜品数据|FID| |烹饪时间| |介绍| 等等(这对我来说似乎很奇怪/不直观)

.

所以问题是:在这种情况下最好的一般做法是什么?

在这种情况下,查询时进行额外计算而不是冗余数据通常更好吗? 有什么我遗漏的东西会让这件事变得更简单/更好吗?

#1楼 票数:2

我不确定这是否可以像您希望的那样普遍回答,因为应该考虑语义和数据库的使用。 即使在您示例的简单/复杂食物环境中,您描述的任何一种方法(成分/菜肴/食物数据或食物/食物数据/食物数据)都可能是正确的,具体取决于具体情况。

让我先解决这个问题:我不会寻找第三种方法。 我能想到的任何其他事情在语义上都是模糊的,要维护的地狱或要查询的噩梦。

所以你首先关心的是数据库的语义。 您的第一种方法似乎更自然; 大多数人会很容易看到配料和菜肴之间的语义区别。 如果“配料”实体除了作为菜肴的一部分之外还有另一个存在的原因,例如用于管理原材料的订单,这也是唯一的选择。 如果您选择采用第二种方法,则必须确保 a) 它适合您的数据,并且 b) 您非常谨慎地选择表名。

对于语义上“适合您的数据”的第二种方法,简单的菜肴必须完全符合描述:“没有额外的菜肴数据的菜肴”。 [Simple] 标志也可以作为菜肴的属性接受,尽管真正需要它可能暗示您对这种方法不满意。 但是,如果食材和菜肴只是部分重叠,即如果您的食材不能作为菜肴,或者如果它们具有不同的一般属性,那么您肯定是偏离了基础。 如果您发现自己需要执行业务规则来阻止客户订购一份“面粉”; 如果您提出诸如“泡菜”的“卡路里”下放什么的问题(是泡菜作为配料的每 100 克卡路里,还是泡菜作为配菜的每份卡路里? ); 如果您发现诸如“测量单位”之类的字段对菜肴毫无意义,那么您正在处理两个独立的实体(配料和菜肴),而不是一个具有两个子类别(简单和复杂)的实体(菜肴)。 如果您只想在两个表之间复制一点点信息并为自己省去很多麻烦和歧义,请务必这样做。

您的第二个问题是如何使用数据。 尝试回答以下问题:您是否要每秒查询数百万次菜肴的卡路里? 菜肴的成分 - 以及卡路里 - 会永远保持不变吗? 您的客户或厨师是否需要查询菜肴是由什么制成的?

“不重复”和“不存储可计算值”是两条与设计规则一样难的规则。 即使这样的规则也应该,而不是真正弯曲,只是有时“批判性地调整”,如果这是有道理的。

#2楼 票数:0

这是一个理解数据上下文的问题。 我想膳食可以是简单的(未加工的),也可以是复杂的并包含其他膳食。 如果我要为膳食及其热值生成一个数据库,我不会将它们分开。

meal      | calorific value per 100g | glicemic index  
apple     | 12345                    | 34234
apple-pie | 3233                     | 32334

您要加入的其他桌子可能是特定人的膳食组合。

2020-02-27|Johny Doe | Breakfast |apple  | 300 g
2020-02-27|Johny Doe | Breakfast |sausage| 150 g
2020-02-27|Johny Doe | Breakfast |apple-juice | 500 g

通过连接这两个表,您将了解 Johny Doe 吃了多少卡路里,也许 glicemic 指数是多少……

然后……这is not yet an SQL question but a the question of understanding first the process one would like to describe用 SQL is not yet an SQL question but a the question of understanding first the process one would like to describe

  ask by Rotariu.Stefan translate from so

未解决问题?本站智能推荐:

3回复

用于分组记录的数据库模式模式

我正在寻找一种设计模式来管理关系数据库中属于一起的记录,例如,将多个联系人分组。 群组本身不必是实体。 网上论坛的会员人数应不受限制。 应该可以运行查询以获取给定记录的其他组成员。 我的想法是在一个表中进行管理: 编辑:请注意该group 不是外键。 它只是一个唯一的标识符。
1回复

数据库中的学生会话?

如何在学生管理系统中将数据保存到以下条件的表中。 1:Student表在Student表中有其个人信息2:Student Study in Class(Class表有自己的信息)一个学生有一个Class 3:Session表Session Year Like (2020-2021) 4:Stude
6回复

在数据库中存储用户密码/数据

寻找创建一个保存用户信息(主要是用户名和密码)的数据库表。 是哈希(密码)和用户的最佳方法吗? 我也应该加密用户名吗? 如果我有一个密码表,另一个有用户数据表,我该如何关联/链接它们? 登录不是问题,问题是如何关联表(每个用户的密码表和数据表) 谢谢
1回复

在关系数据库中存储traceroute数据

如果我说的话没有道理,请要求澄清。 我正在尝试在关系数据库中存储traceroute数据,traceroute数据的结构如下: 现在,我正在寻找一种存储数据的关系方式,最终发生的是我的数据库严重崩溃(理论上)。 有没有一种方法可以正确地(并且正确地说是最小的空间)将traceroute
2回复

SQLServerManagementStudio-如何在数据库图表中建模此数据库约束

我有一个名为Communications的表,其中包含用户的联系号码。 这可以是家庭,移动或传真号码。 我将它们全部存储在一个表中,并使用Type列标识它们。 (0 =家庭,1 =移动,2 =传真)。 通信表有一个外键UserId,它映射到我的Users表以显示User to Numbe
2回复

数据库设计:我需要数据库中的一个实体与其自身相关但也要独立

如果问题标题不清楚,我感到抱歉。 我将尝试在下面解释: 因此,我正在尝试为Campus Housing App设计数据库。 房间可以是单人房或公寓。 公寓基本上是2个单独的单人房,每个房间都有序号。 分别表示2135和2137的房间是构成公寓的两个单人间。 而2149室只是一个单人
1回复

数据库设计中设计类的最佳方法?

因此,我正在为一个简单的社交网络建模一个关系数据库,但是我不确定如何设计关系Friend,我具有以下与User的关系: 首先,我设计了这样的朋友关系: 但是,按照我尝试设计的方式,朋友关系意味着,如果A是B的朋友,那么B也是A的朋友。那样,当我插入新朋友时最好的方法是什么? 每当我
1回复

在SQL数据库中存储同质定界列表

我正在尝试在关系数据库中建模“零售商店”。 一家商店有 唯一ID 拥有者编号 它可能有多个出口 一家商店的所有商店都将拥有相同的所有者。 商店的所有销售点可能有或没有相同的产品。 在同一个零售商店的另一个商店中可能没有一个商店中有的某些产品。 我的桌子