2011-12-02 4 views
0

私はアプリケーションを構築していますが、djangoアプリケーションで複数回静的データにアクセスする最良の方法が選択に問題があります。フィールドでの私の経験はゼロに近いので、私はいくつかの助けを使うことができます。djangoアプリケーションで複数の静的データにアクセスする

アプリは、基本的にドラッグのドラッグで構成されています&。あなたが決められた場所(例えば朝食)に食べ物をドラッグすると、さまざまな値が更新されます:合計朝食カロリー、1日の栄養素(マイクロ/マクロ)、1日の総カロリー、...データは非常に重要なパフォーマンス話しです。

これは私が現在使用している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 } 
} 

foods.json私はさまざまなオプションについて考えてきました:

1)JSON(1私は現在使用しています):

私は食べ物を「落書き可能な場所」にドラッグするたびに、食物データにアクセスして対応する値を更新するgetJSON関数を呼び出します。このファイルのサイズは2 MBですが、それ以上のフードを追加すると確実に増加します。私はこのオプションを使用しています。なぜなら、アプリケーションを構築するのが最も早いからですが、それはライブアプリにとっては良い選択ではないと思います。正規化されたフィールドを持つ

2)RDBMS:

私は2つのモデル作成することができます:食品と栄養を、各食品はFKで関連する40の以上の栄養素を持っています。私が見ている問題は、食べ物データのリクエストが行われるたびに、アプリがデータベースを検索して取得することが多いことです。

3)picklefieldとRDBMS:

これは私が実際に検討しているオプションです。私は食品モデルを作り、養分を漬け畑に入れることができました。 Redisの/ Djangoのキャッシュシステムと

4)何か:

私は、このオプションにより深く潜るます。私はそれらについていくつかのことを読んだが、私が持っている問題を解決するためにそれらを使う方法があるのか​​どうかはっきりとは分かっていない。

ありがとうございます。 マリアーノ。

答えて

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をヒットします。

ビューまたは関数で必要なすべての値を計算/集計し、1回のリクエストで1回だけデータベースにヒットする必要があります。

簡単な例上記のモデルによると、食事のカロリーを計算する:

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は最も簡単に管理/拡張できます。さらに、問合せは自動的にキャッシュされます。

関連する問題