我正在解析USDA的食物数据库并将其存储在SQLite中以供查询。每种食物都含有相同数量的162种营养素。似乎营养素(名称和单位)的列表在很长一段时间内没有改变,因为这是一个爱好项目,我不希望任何突然的变化。但是每种食物确实具有与每种营养素相关的独特数量。
那么,如何才能真正存储这类信息呢?我的优先事项是多编程语言友好(Python和C ++有优先选择),对于我作为编码器的理智,以及检索营养成分随时间推移或绘图的简易性。
到目前为止我想到的两件事是162列(我不是特别喜欢它,但它确实使查询更简单),或者是一个食物表,它有一个指向营养表列表的链接然后链接到营养名称和单位的静态表。第二个似乎更灵活,我的期望是错误的,但我甚至不知道从哪里开始编写总和和时间序列的查询。
由于
答案 0 :(得分:4)
使用第二种(更规范化的)方法。
你甚至可以用比你提到的更少的桌子来逃避:
tblNutrients
- NutrientID
- 营养素名称
- NutrientUOM(计量单位)
- Otherstuff
tblFood
- FoodId
- FoodName
- Otherstuff
tblFoodNutrients
- FoodID(FK)
- NutrientID(FK)
- UOMCount
维护160+现场数据库将是一场噩梦。
如果还涉及时间元素(测量值可以改变吗?)那么您可以根据可能发生的变化向营养素和/或食物营养素表中添加日期字段。
答案 1 :(得分:4)
你应该在database normalization上读一下。大多数规范化的东西都非常直观,但是真正经历了步骤的定义,看到一个例子有助于理解这些概念,并且如果你想在未来设计一个数据库,它会对你有很大帮助。
对于这个问题,我建议你使用3个表:一个用于食物(我们称之为foods
),一个用于营养素(nutrients
),一个用于特定营养素每种食物(foods_nutrients
)。
食物表应该有一个独特的参考索引和食物名称。如果食物中有与之相关的其他数据(可能是图片或描述的链接),这些数据也应该放在这里。每个单独的食物将在此表中排成一行。
营养素表还应该有一个独特的参考索引和营养素的名称。你的162种营养素中的每一种都会在这张表中排成一排。
然后你有一个包含每种食物营养价值的交叉表。此表有三列:food_id
,nutrient_id
和value
。每个食物在这张桌子内排成162排,每种营养素都有。
这样,您可以根据需要添加或删除营养素和食物,并查询与编程语言无关的所有内容(好吧,使用SQL,但无论如何都要使用它:))。
我们来试试吧。我们在foods
表中有2种食物,在nutrients
表中有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';