C++ 如何在SQL中存储具有大量(常量)属性的数据
我正在解析美国农业部的食品数据库,并将其存储在SQLite中以供查询。每种食物都含有相同数量的营养素。看来营养素列表(名称和单位)已经有一段时间没有改变了,因为这是一个爱好项目,所以我不希望发生任何突然的变化。但每种食物都有一个与每种营养素相关的独特数量 那么,如何才能理智地存储此类信息呢。我的优先考虑是多程序语言友好(Python和C++有偏好),我作为编码器的理智,以及随着时间的推移检索养分集的容易或积。 到目前为止,我想到的两件事是162列(我不是特别喜欢,但它确实使查询更简单),或者是一个食物表,它链接到一个营养素列表表,然后链接到一个包含营养素名称和单位的静态表。第二种似乎更灵活,因为我的预期是错误的,但我甚至不知道从哪里开始编写求和和和时间序列的查询 谢谢使用第二种(更规范化的)方法 你甚至可以得到比你提到的更少的桌子:C++ 如何在SQL中存储具有大量(常量)属性的数据,c++,python,sql,sqlite,C++,Python,Sql,Sqlite,我正在解析美国农业部的食品数据库,并将其存储在SQLite中以供查询。每种食物都含有相同数量的营养素。看来营养素列表(名称和单位)已经有一段时间没有改变了,因为这是一个爱好项目,所以我不希望发生任何突然的变化。但每种食物都有一个与每种营养素相关的独特数量 那么,如何才能理智地存储此类信息呢。我的优先考虑是多程序语言友好(Python和C++有偏好),我作为编码器的理智,以及随着时间的推移检索养分集的容易或积。 到目前为止,我想到的两件事是162列(我不是特别喜欢,但它确实使查询更简单),或者是一
- TBL营养素
--NutrientID
--NutrientName
--NutrientUOM(计量单位)
--其他东西 - tblFood
--FoodId
--食品名称
--其他东西 - tblFoodNutrients
--福迪德(FK)
--营养素ID(FK)
--计量单位
如果也涉及时间元素(测量值会改变吗?),那么您可以根据可能发生的变化向营养素和/或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”表中的食品和营养外键列中添加一个唯一的索引。这个索引不仅可以加快你的查询速度,还可以防止你在同一种食物中添加相同的营养素。时间元素有点直角,我可能不应该提起它。还有一个“膳食”数据库,它有一个日期,一个指向食物清单和数量的链接。因此,时间序列将是餐量乘以食物的总和。