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

McB*_*eth 2 c++ python sql sqlite

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

那么,如何明智地存储此类信息。我的优先事项是多编程语言友好(Python 和 C++ 优先),作为编码员的我的理智,以及随着时间的推移轻松检索营养集以求和或绘图。

到目前为止,我想到的两件事是 162 列(我不是特别喜欢,但它确实使查询更简单),或者一个食物表,它有一个链接到一个 Nutrition_list 表,然后链接到一个静态含有营养素名称和单位的表格。如果我的期望是错误的,第二个似乎更灵活,但我什至不知道从哪里开始编写求和和时间序列的查询。

谢谢

Car*_*ten 6

您应该阅读一些关于数据库规范化的内容。大多数规范化的东西都非常直观,但真正完成步骤的定义并查看示例有助于理解概念,如果您将来想设计数据库,它将对您有很大帮助。

对于这个问题,我建议您使用 3 张表:一张用于食物(我们称之为foods),一张用于营养成分 ( nutrients),一张用于每种食物的特定营养成分 ( foods_nutrients)。

食物表应该有一个唯一的索引来引用和食物的名称。如果食物有其他相关数据(可能是图片或描述的链接),这些数据也应该放在这里。每个单独的食物将在此表中占一行。

营养素表还应该有一个唯一的参考索引和营养素的名称。您的 162 种营养素中的每一种都将在此表中占据一行。

然后你有一个包含每种食物的营养价值的交叉表。此表包含三列:food_idnutrient_idvalue。每个食物在这个表中都有 162 行,每个营养素都是 oe。

这样,您可以根据需要添加或删除营养素和食物,并独立于编程语言查询所有内容(好吧,使用 SQL,但无论如何您都必须使用它 :))。

让我们尝试一个例子。我们的foods表中有 2 种食物,表中有 3 种营养素nutrients

+------------------+
| 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    |
+---------+-------------+-------+
Run Code Online (Sandbox Code Playgroud)

现在,要获得香蕉的钾含量,您可以查询:

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';
Run Code Online (Sandbox Code Playgroud)