2011-12-02 4 views
0

저는 애플리케이션을 구축 중이며 장고 앱에서 정적 데이터에 여러 번 액세스하는 가장 좋은 방법은 선택하는 데 어려움을 겪고 있습니다. 현장에서의 경험은 제로에 가깝기 때문에 도움을받을 수 있습니다.장고 앱의 정적 데이터에 대한 다중 액세스

앱은 기본적으로 드래그로 구성되어 있습니다. & 드롭입니다. 음식을 정해진 장소 (예 : 아침 식사)로 끌면 differents 값이 업데이트됩니다 : 총 아침 식사 칼로리, 총 일 영양소 (마이크로/매크로), 총 하루 칼로리 ... 그래서 내가 생각하기에 나는 데이터는 말하기 성능이 매우 중요합니다. 나는 다른 옵션에 대해 생각했습니다

{ 
"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 (한

내가 현재 사용하고 JSON 파일의 발췌 한 것입니다 현재 사용 중입니다.) :

"droppable"장소로 드래그 할 때마다 getJSON 함수를 호출하여 음식 데이터에 액세스 한 다음 해당 값을 업데이트합니다. 이 파일의 크기는 2MB이지만 필자가 더 많은 음식을 추가함에 따라 분명히 증가 할 것입니다. 이 옵션은 앱을 만드는 데 가장 빨리 시작했기 때문에이 옵션을 사용하고 있지만 라이브 앱에는 적합하지 않다고 생각합니다. 정규화 필드

2) RDBMS :

나는 두 가지 모델로 만들 수

: 음식과 영양소를 각 음식은 FK에 의해 관련 40 개 + 영양분을 가지고 있습니다. 필자가 보게되는 문제는 음식 데이터 요청이있을 때마다 앱이 데이터베이스를 검색하기 위해 많은 시간을 쏟아 붓는다는 것입니다.

3) picklefield와 RDBMS :

이 실제로 고려하고있는 옵션입니다. 나는 음식 모델을 만들고 picklefield에 영양분을 넣을 수 있습니다. 레디 스/장고 캐시 시스템과

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를 누르십시오 시간을 검색 할 수 있습니다.

뷰나 함수에서 필요한 모든 값을 계산/집계해야하며 요청 당 한 번만 데이터베이스를 방문해야합니다.

간단한 예는 위의 모델에 따라 식사의 칼로리를 계산 : 또한 materialized views을 사용할 수 있습니다

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; 

. 예를 들어 food 당 계산 된 값을 테이블에 저장하고 기본 데이터가 변경되면 자동으로 업데이트합니다. 대부분 변경되는 경우는 거의 없지만 (이 방법으로 쉽게 업데이트 할 수 있습니다).

1

사용중인 플랫 파일 버전이 마지막 위치에 있다고 생각합니다. 요청이있을 때마다 위에서 아래로 읽습니다. 크기에 관해서는 이것이 마지막 장소에 온다고 생각합니다. 캐시 시스템이 최상의 성능을 제공하지만 RDBMS가 관리/확장이 가장 쉬우 며 쿼리가 자동으로 캐싱됩니다.

관련 문제