Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.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
C++ 如何在SQL中存储具有大量(常量)属性的数据_C++_Python_Sql_Sqlite - Fatal编程技术网

C++ 如何在SQL中存储具有大量(常量)属性的数据

C++ 如何在SQL中存储具有大量(常量)属性的数据,c++,python,sql,sqlite,C++,Python,Sql,Sqlite,我正在解析美国农业部的食品数据库,并将其存储在SQLite中以供查询。每种食物都含有相同数量的营养素。看来营养素列表(名称和单位)已经有一段时间没有改变了,因为这是一个爱好项目,所以我不希望发生任何突然的变化。但每种食物都有一个与每种营养素相关的独特数量 那么,如何才能理智地存储此类信息呢。我的优先考虑是多程序语言友好(Python和C++有偏好),我作为编码器的理智,以及随着时间的推移检索养分集的容易或积。 到目前为止,我想到的两件事是162列(我不是特别喜欢,但它确实使查询更简单),或者是一

我正在解析美国农业部的食品数据库,并将其存储在SQLite中以供查询。每种食物都含有相同数量的营养素。看来营养素列表(名称和单位)已经有一段时间没有改变了,因为这是一个爱好项目,所以我不希望发生任何突然的变化。但每种食物都有一个与每种营养素相关的独特数量

那么,如何才能理智地存储此类信息呢。我的优先考虑是多程序语言友好(Python和C++有偏好),我作为编码器的理智,以及随着时间的推移检索养分集的容易或积。 到目前为止,我想到的两件事是162列(我不是特别喜欢,但它确实使查询更简单),或者是一个食物表,它链接到一个营养素列表表,然后链接到一个包含营养素名称和单位的静态表。第二种似乎更灵活,因为我的预期是错误的,但我甚至不知道从哪里开始编写求和和和时间序列的查询

谢谢

使用第二种(更规范化的)方法

你甚至可以得到比你提到的更少的桌子:

  • TBL营养素
    --NutrientID
    --NutrientName
    --NutrientUOM(计量单位)
    --其他东西

  • tblFood
    --FoodId
    --食品名称
    --其他东西

  • tblFoodNutrients
    --福迪德(FK)
    --营养素ID(FK)
    --计量单位

维护160多个字段的数据库将是一场噩梦


如果也涉及时间元素(测量值会改变吗?),那么您可以根据可能发生的变化向营养素和/或foodnutrient表添加日期字段。

您应该仔细阅读。大多数规范化的内容都非常直观,但是真正了解步骤的定义并查看示例有助于理解概念,并且如果您将来想要设计数据库,这将对您有很大帮助

对于这个问题,我建议您使用3个表格:一个用于食品(我们称之为
食品
),一个用于营养素(
营养素
),以及一个用于每种食品的特定营养素(
食品营养素

foods表应该有一个唯一的索引用于引用和食品名称。如果食物有其他相关数据(可能是图片或描述的链接),这些数据也应该放在这里。每种单独的食物都会在这张桌子上排成一行

营养素表还应具有唯一的索引,以供参考和营养素的名称。您的162种营养素中的每一种都将在该表中获得一行

然后你有一个交叉表,包含每种食物的营养价值。此表有三列:
食品id
营养id
。每种食物在这张桌子里有162行,每种营养素都有oe

通过这种方式,您可以随意添加或删除营养素和食物,并独立于编程语言查询所有内容(当然,使用SQL,但无论如何都必须使用它:)

让我们来举个例子。我们在
食品
表中有2种食品,在
营养素
表中有3种营养素:

+------------------+
| foods            |
+---------+--------+
| food_id | name   |
+---------+--------+
| 1       | Banana |
| 2       | Apple  |
+---------+--------+

+-------------------------+
| nutrients               |
+-------------+-----------+
| nutrient_id | name      |
+-------------+-----------+
| 1           | Potassium |
| 2           | Vitamin C |
| 3           | Sugar     |
+-------------+-----------+

+-------------------------------+
| foods_nutrients               |
+---------+-------------+-------+
| food_id | nutrient_id | value |
+---------+-------------+-------+
| 1       | 1           | 1000  |
| 1       | 2           | 12    |
| 1       | 3           | 1     |
| 2       | 1           | 3     |
| 2       | 2           | 7     |
| 2       | 3           | 98    |
+---------+-------------+-------+
现在,要获得香蕉的钾含量,您可以查询:

SELECT food_nutrients.value
  FROM food_nutrients, foods, nutrients
  WHERE foods_nutrients.food_id = foods.food_id
    AND foods_nutrients.nutrient_id = nutrients.nutrient_id
    AND foods.name = 'Banana'
    AND nutrients.name = 'Potassium';

第二种方法是明智的。Magnus Lie Hetland的《开始Python:从新手到专业人士》有一节介绍了如何使用Python和sqlite创建数据库应用程序。幸运的是,这两个(当前)答案都是正确的,但我要补充的是,你应该在“FoodNutrients”表中的食品和营养外键列中添加一个唯一的索引。这个索引不仅可以加快你的查询速度,还可以防止你在同一种食物中添加相同的营养素。时间元素有点直角,我可能不应该提起它。还有一个“膳食”数据库,它有一个日期,一个指向食物清单和数量的链接。因此,时间序列将是餐量乘以食物的总和。