Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库中条目的单个或分组/组合项_Sql_Database Design_Relational Database - Fatal编程技术网

Sql 数据库中条目的单个或分组/组合项

Sql 数据库中条目的单个或分组/组合项,sql,database-design,relational-database,Sql,Database Design,Relational Database,我想在数据库的某个字段中指出两种类似的内容。其中一个是另一个的一个或多个的组合 在这种情况下,我应该如何设计我的数据库 在我当前的示例中,我有(简单)食物成分和(组合)食物菜肴,我希望其中一个,或者这些东西成为用餐/就餐表中的条目 因此,用户可以在一顿饭中的某个时间点吃一种简单的食物,如苹果,或一种复杂的食物,如苹果派,由200克苹果、100克面粉和30克糖等组成。我是这样想的: 成分| IID | |名称| |卡路里| 菜肴| DID | | Name |(|卡路里|?) 食品数据| DID

我想在数据库的某个字段中指出两种类似的内容。其中一个是另一个的一个或多个的组合

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

在我当前的示例中,我有(简单)食物成分(组合)食物菜肴,我希望其中一个,或者这些东西成为用餐/就餐表中的条目

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

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

菜肴| DID | | Name |(|卡路里|?)

食品数据| DID | IID |数量|

用户| UID | | FirstName | | LastName |等

膳食| UID | DID |日期/时间|数量|

我觉得这真的很烦人,因为每种配料都必须有两个(基本相同的)条目开始:一个在配料表中,一个在菜谱表中,这样才能在一顿饭中配对。我是不是遗漏了什么?有办法解决这个问题吗

我也不知道一道菜是否应该包含数据库中列出的卡路里。在数据库中存储一道菜的卡路里是相当多余的,因为它可以在进行查询时计算出来(通过汇总和计算其各自的成分)。但这似乎效率很低,因为它需要对每一道菜的查询都进行计算(如果添加宏/营养值/价格之类的内容,情况会变得更糟,我为了清晰/简单而省略了这些内容)

另外,如果我的一道菜含有卡路里(以及其他与食物相关的东西),那么在这种情况下,我只需要一张桌子,比如:

食物| FID | | | | | | | |卡路里|(|简单[bool]|?)

食品数据| FID | FID |数量|

总的来说,这似乎更好。简单字段将区分我认为值得放入的简单配料或菜肴,这样您就不必在食品数据中搜索每一项

但如果我想介绍特定的纯碟数据,那么我会制作一些其他表格,如:

碟片数据| FID | | Timetobook | | | Presentation |等(这对我来说似乎很奇怪/不直观)

所以问题是:在这种情况下,最佳通用实践是什么

在这种情况下,通常在查询时进行额外计算比使用冗余数据更好吗?
一般来说,我遗漏了什么可以使这更简单/更好吗?

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

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
把这两个表连接起来,你就会知道约翰尼·多伊吃了多少胼胝体,也许还有什么是神经胶质指数


然后。。。这还不是一个SQL问题,而是一个首先理解要用SQL描述的过程的问题

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

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
把这两个表连接起来,你就会知道约翰尼·多伊吃了多少胼胝体,也许还有什么是神经胶质指数


然后。。。这还不是一个SQL问题,而是一个首先理解要用SQL描述的过程的问题

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

让我先解决这个问题:我不会寻找第三种方法。我能想到的任何其他东西在语义上都是晦涩难懂的,需要维护,或者需要查询

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

对于语义上“适合你的数据”的第二种方法,简单的菜品必须完全符合描述:“没有额外菜品数据的菜品”。[Simple]标志作为dish的一个属性也是可以接受的,尽管对它的真正需求可能暗示您对这种方法的理解有偏差。但是,如果配料和菜肴只是部分重叠,即如果您的配料不能成为菜肴,或者如果它们通常具有不同的属性,那么您肯定是偏离了基准。如果您发现自己需要强制执行业务规则,以防止客户订购“面粉”;如果你提出一些问题,比如“泡菜”的“卡路里”下应该放什么(泡菜作为配料是每100克的卡路里,还是作为配菜的泡菜每餐的卡路里?);如果你发现你有像