gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:33:54 25 4
gpt4 key购买 nike

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

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

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

谢谢

最佳答案

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

对于这个问题,我建议你使用 3 个表:一个用于食物(我们称它为 foods),一个用于营养素(nutrients),以及一个用于每种食物的特定营养素 (foods_nutrients)。

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

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

然后您将得到包含每种食物营养值(value)的交叉表。该表包含三列:food_idnutrient_idvalue。每种食物在此表中有 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';

关于c++ - 如何在 SQL 中存储具有大量(常量)属性的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8431451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com