对django应用程序中静态数据的多重访问
我正在构建一个应用程序,我很难选择在django应用程序中多次访问静态数据的最佳方式。我在这个领域的经验几乎为零,所以我需要一些帮助 该应用程序基本上由食物拖放组成。当你将食物拖到一个确定的地方(例如早餐)时,不同的值会被更新:早餐总热量、一天总营养素(微/宏)、一天总热量……这就是为什么我认为我存储和访问数据的方式对性能来说非常重要 这是我当前使用的json文件的摘录: foods.json对django应用程序中静态数据的多重访问,django,json,postgresql,redis,pickle,Django,Json,Postgresql,Redis,Pickle,我正在构建一个应用程序,我很难选择在django应用程序中多次访问静态数据的最佳方式。我在这个领域的经验几乎为零,所以我需要一些帮助 该应用程序基本上由食物拖放组成。当你将食物拖到一个确定的地方(例如早餐)时,不同的值会被更新:早餐总热量、一天总营养素(微/宏)、一天总热量……这就是为什么我认为我存储和访问数据的方式对性能来说非常重要 这是我当前使用的json文件的摘录: foods.json { "112": { "type": "Vegetables", "descript
{
"112": {
"type": "Vegetables",
"description": "Mushrooms",
"nutrients": {
"Niacin": {
"unit": "mg",
"group": "Vitamins",
"value": 3.79
},
"Lysine": {
"units": "g",
"group": "Amino Acids",
"value": 0.123
},
... (+40 nutrients)
"amount": 1,
"unit": "cup whole",
"grams": 87.0 }
}
我考虑过不同的选择:
1) JSON(我目前正在使用的):
每次我将食物拖到“可拖放”位置时,我都会调用getJSON函数来访问食物数据,然后更新相应的值。这个文件有2mb的大小,但随着我添加更多的食物,它肯定会增加。我之所以使用这个选项,是因为它是最快开始构建应用程序的方法,但我认为对于live应用程序来说,它不是一个好的选择
2) 具有规范化字段的RDBMS:
我可以创建两个模型:食物和营养素,每种食物都有40+营养素与FK相关。我看到的问题是,每次发出食物数据请求时,应用程序都会多次点击数据库来检索它
3) 带pickle字段的RDBMS:
这是我正在考虑的选择。我可以制作一个食物模型,把营养物质放在腌菜地里
4) Redis/Django缓存系统:
我将更深入地探讨这个选项。我读过一些关于它们的文章,但我不清楚是否有办法用它们来解决我的问题
提前感谢,,
Mariano。我认为您使用的平面文件版本排在最后。每次请求时,它都是从上到下读取的。我想这个尺码排在最后。缓存系统将提供最佳性能,但RDBMS将最容易管理/扩展,而且您的查询将自动缓存。这是关系数据库的典型用例。在大多数情况下,或多或少的规范化形式是正确的方法 根据你的例子,我从头顶上写下了这个数据模型:
CREATE TABLE unit(
unit_id integer PRIMARY KEY
,unit text NOT NULL
,metric_unit text NOT NULL
,atomic_amount numeric NOT NULL
);
CREATE TABLE food_type(
food_type_id integer PRIMARY KEY
,food_type text NOT NULL
);
CREATE TABLE nutrient_type(
nutrient_type_id integer PRIMARY KEY
,nutrient_type text NOT NULL
);
CREATE TABLE food(
food_id serial PRIMARY KEY
,food text NOT NULL
,food_type_id integer REFERENCES food_type(food_type_id) ON UPDATE CASCADE
,unit_id integer REFERENCES unit(unit_id) ON UPDATE CASCADE
,base_amount numeric NOT NULL DEFAULT 1
);
CREATE TABLE nutrient(
nutrient_id serial PRIMARY KEY
,nutrient text NOT NULL
,metric_unit text NOT NULL
,base_amount numeric NOT NULL
,calories integer NOT NULL DEFAULT 0
);
CREATE TABLE food_nutrient(
food_id integer references food (food_id) ON UPDATE CASCADE ON DELETE CASCADE
,nutrient_id integer references nutrient (nutrient_id) ON UPDATE CASCADE
,amount numeric NOT NULL DEFAULT 1
,CONSTRAINT food_nutrient_pkey PRIMARY KEY (food_id, nutrient_id)
);
CREATE TABLE meal(
meal_id serial PRIMARY KEY
,meal text NOT NULL
);
CREATE TABLE meal_food(
meal_id integer references meal(meal_id) ON UPDATE CASCADE ON DELETE CASCADE
,food_id integer references food (food_id) ON UPDATE CASCADE
,amount numeric NOT NULL DEFAULT 1
,CONSTRAINT meal_food_pkey PRIMARY KEY (meal_id, food_id)
);
这肯定是而不是,它应该如何工作:
每次发出食物数据请求时,该应用程序都会大量访问数据库
需要多少次才能找回它
您应该计算/聚合视图或函数中需要的所有值,并且每个请求只命中数据库一次,而不是多次
根据上述模型计算膳食热量的简单示例:
SELECT sum(n.calories * fn.amount * f.base_amount * u.atomic_amount * mf.amount)
AS meal_calories
FROM meal_food mf
JOIN food f USING (food_id)
JOIN unit u USING (unit_id)
JOIN food_nutrient fn USING (food_id)
JOIN nutrient n USING (nutrient_id)
WHERE mf.meal_id = 7;
您也可以使用。例如,将每个食物的计算值存储在表中,并在基础数据发生变化时自动更新。最有可能的是,这些很少改变(但仍然很容易以这种方式更新)