2010-11-29 2 views
1

나는 Django/Python 기반 응용 프로그램을 작성하는 중이고 코드 작성이나 DB에 대한 요청을 피하려고합니다. 낮은 수준에서 더 쉽게 액세스 할 수 있도록 낮은 수준에 이미 저장된 상위 수준의 데이터를 저장하는 것은 무리가 있습니까?동일한 데이터를 관계형 데이터베이스의 두 위치에 저장하는 것이 바람직하지 않습니까?

분명히 분명했습니다. 명확한 설명이 필요한 경우 알려주세요.

감사합니다.

+1

DRY는 코드에만 적용되는 것이 아닙니다. – jason

+0

http://en.wikipedia.org/wiki/Data_deduplication –

+0

정보를 하위 수준에만 저장해야하며 상위 수준에 저장하면 안된다는 문제가 있습니까? –

답변

3

필요한 계산이 극도로 복잡하거나 복잡한 경우 데이터베이스를 부분적으로 비정규 화하는 것이 유용 할 수 있지만 최적화를 시도한 다른 시도가 거의 성공하지 못했을 때만 수행해야합니다.

0

예, 매우 좋습니다.

이는 rdbms가있는 지점을 위반합니다. 어떤 데이터 사본을 변경해야한다면 업데이트해야합니까? 그것을 피할 수있는 많은 방법이 있습니다. Django에는 집중적 인 쿼리를위한 캐시 시스템이 있습니다. 데이터베이스에서 뷰를 작성하여 데이터 검색 빈도를 줄일 수도 있습니다. 또한 모델 작성 방법을 사용하면 데이터를보다 쉽게 ​​검색 할 수 있습니다.

Model-View-Controller 디자인도 살펴볼 것입니다. 설정이 잘되어 있지 않으면 애플리케이션이 혼란 스러울 수 있습니다.

2

비정규 화 외에도 다른 방법으로 쿼리 성능을 향상시킬 수 있습니다. 물론 첫 번째 단계는 코드의 성능을 실제로 측정하는 것입니다. 조인 쿼리가 매우 쉽게 확장되지 않는다고해서 조인 쿼리를 사용하는 것은 바람직하지 않습니다. 모든 웹 사이트에서 매우 최적화 된 요청 처리가 필요한 요청로드가있는 것은 아닙니다.

In fact, Cal Henderson has calculated that all but 100 websites are not in the top 100 most visited websites.

그것은 당신의 잘 밖으로 생각 밝혀 매우 mantainable 쿼리는, (당신은 아마 당신이 최고 1,000,000에, 상위 100에 필요하지 않은 경우에도) 실제로 첫 번째 단계 병목 경우 병목 현상이되는 실제 쿼리를 실제로 살펴 보는 것입니다. 경우에 따라 적절한 위치에 인덱스를 추가하거나 제거하거나 데이터베이스를 깔끔하게 유지 (VACUUM 또는 ANALYZE 명령)하여 scehdule에서 차이를 만들 수 있습니다.

다음 단계는 캐싱 기회를 찾는 것입니다. 중요한 사이트의 상당 부분이 모든 페이지와 사용자에 대해 동일한 쿼리를 반복 수행하므로 매우 빠르게 변하지 않습니다. 자주 사용되는 데이터를 캐시 (예 : memcache)에 저장하면 데이터베이스 서버에 부담이 생깁니다.

서버이라는 주제로 진행되는 동안 다른 작업을 수행하는 대신 데이터베이스를 호스팅하는 시스템이 쿼리에 응답 할 수 있는지 확인하십시오. 데이터베이스는 확장하기가 가장 어려운 기술 중 하나이므로 최대한 활용하려면 데이터베이스가 램, 빠른 디스크 및 다른 책임이없는 컴퓨터에서 실행되고 있는지 확인하십시오. 웹 응용 프로그램 서버를 자체 컴퓨터에 설치하고 정적 파일을 다른 컴퓨터에 저장하고 방화벽을 별도의 컴퓨터에 두십시오. 쿼리 캐시는 자체 시스템으로 이동할 수 있습니다.

데이터베이스가 수평 확장하기는 어렵지만 (확장하기는 쉽지만) 불가능하지 않습니다. 동일한 쿼리에서 두 테이블을 거의 사용하지 않으면 두 테이블에서 두 테이블을 분리 할 수 ​​있습니다. 특정 테이블 세트의 조인 조건이 항상 동일하면 (예 : 사용자 ID) 행을 여러 서버로 분할 할 수 있습니다 (이를 샤딩이라고 함).

일단 이러한 모든 옵션을 다 써 버리면 비정규 화가 아마도 다음 단계 일 것입니다. 간단 해 보이지만, 취할 수있는 조치가 너무 늦은 몇 가지 이유가 있습니다.

가장 큰 이유는 복제 된 데이터를 올바르게 유지하기가 실제로 어렵 기 때문입니다. 데이터가 중복되지 않으면 충돌은 발생하지 않지만 데이터가 중복되어 앱의 일부가 신중하게 두 위치를 업데이트하지 않으면 다른 쿼리가 서로 다른 충돌하는 결과를 반환합니다. 데이터의 음역을 제거 할 때 좋은 선택은 동기화 조건을 미미하게 만들 수 있습니다 (정식 소스에서 비정규 화 된 데이터를 다시 작성하기 만하면됩니다).하지만 코드 유지 관리 작업이 항상 늘어납니다.

두 번째 이유는 비정규 화가 반드시 속도 향상이 아니기 때문입니다. 인덱스를 추가하는 것과 마찬가지로 읽기 성능을 위해 쓰기 성능을 교환합니다. 상당한 양의 쓰기를 실제로 수행하면 실제로는 평균 성능이 보다 느려집니다.. 인덱스 추가와 달리 데이터베이스는 비정규 화가 필요할 때이를 알 수 없습니다. 항상 추측입니다.

마지막으로 비정규 화와 함께 결정할 때 ORM (실제로 장고 질문 일 가능성이 있으므로 사용하는 경우)이 무엇인지 알고 있어야합니다. 실제로 사용하는 데이터 만 제공하도록 쿼리를 디자인했는지 확인하고 ORM이 도움이되지 않는지 확인하십시오.

관련 문제