对django应用程序中静态数据的多重访问

对django应用程序中静态数据的多重访问,django,json,postgresql,redis,pickle,Django,Json,Postgresql,Redis,Pickle,我正在构建一个应用程序,我很难选择在django应用程序中多次访问静态数据的最佳方式。我在这个领域的经验几乎为零,所以我需要一些帮助 该应用程序基本上由食物拖放组成。当你将食物拖到一个确定的地方(例如早餐)时,不同的值会被更新:早餐总热量、一天总营养素(微/宏)、一天总热量……这就是为什么我认为我存储和访问数据的方式对性能来说非常重要 这是我当前使用的json文件的摘录: foods.json { "112": { "type": "Vegetables", "descript

我正在构建一个应用程序,我很难选择在django应用程序中多次访问静态数据的最佳方式。我在这个领域的经验几乎为零,所以我需要一些帮助

该应用程序基本上由食物拖放组成。当你将食物拖到一个确定的地方(例如早餐)时,不同的值会被更新:早餐总热量、一天总营养素(微/宏)、一天总热量……这就是为什么我认为我存储和访问数据的方式对性能来说非常重要

这是我当前使用的json文件的摘录:

foods.json

{
"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;
您也可以使用。例如,将每个
食物的计算值存储在表中,并在基础数据发生变化时自动更新。最有可能的是,这些很少改变(但仍然很容易以这种方式更新)