2011-12-02 44 views
0

我正在構建一個應用程序,並且無法選擇如何在django應用程序中多次訪問靜態數據。我在該領域的經驗接近零,所以我可以使用一些幫助。在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,但是當我添加更多食物時它肯定會增加。我使用這個選項是因爲它是開始構建應用程序最快的選擇,但我認爲它不適合實時應用程序。

2)RDBMS與標準化領域:

我可以創建兩個模型:食品和營養,每一種食物都有40+由FK營養成分有關。我看到的問題是,每次發出食物數據請求時,應用程序都會多次觸擊分貝來檢索它。

3)RDBMS與picklefield:

這是我真正考慮的選項。我可以創建一個食物模型,並將營養物質放在酸菜中。

4)一些與Redis的/ Django的緩存系統:

我將深入更深入地進入這個選項。我已經閱讀了一些關於它們的內容,但我不清楚是否有某種方法可以用它們來解決我遇到的問題。

在此先感謝, 馬里亞諾。

回答

1

這是一個關係數據庫的典型用例。大多數時候,或多或少的標準化形式都是正確的方式。

我寫這數據模型從我的頭頂,根據自己的例子:

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) 
); 

這絕對是,它應該是如何工作的:

每當食物數據請求發出時,應用程序將觸及db很多時間來檢索它。

您應該在視圖或函數中計算/聚合所有您需要的值,並且每次請求僅擊中數據庫一次,而不是多次。

簡單的例子,根據上述模型計算一餐的卡路里:

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; 

您還可以使用materialized views。例如,將每個food的計算值存儲在表中,並在基礎數據更改時自動更新它。很可能,這些很少會改變(但仍然可以通過這種方式輕鬆更新)。

1

我認爲你使用的平面文件版本是在最後的地方。每次請求時都會從上到下進行讀取。對於大小,我認爲這是最後的地方。緩存系統將提供最佳性能,但RDBMS將是最容易管理/擴展的,而且您的查詢將自動緩存。

相關問題