2012-08-25 2 views
2

예를 들어 사용자 테이블이 있고 사용자간에 친구 매퍼가있는 경우를 예로들 수 있습니다. 사용자에게 'friends-count'라는 추가 열을 추가하고 친구를 추가 할 때마다 업데이트해야하며 그렇지 않으면 매번 필요할 때마다 계산 쿼리를 수행해야합니다. 어느 것이 더 효율적입니까?가장 효율적인 관계 계산 방법

+1

성능에 대해서만 이야기하는 경우 다른 테이블에서 계산하는 것보다 단일 필드에서 읽는 것이 더 빠릅니다. 이러한 접근 방식은 사용자가 친구를 추가하거나 친구를 추가 할 때마다 더 많은 작업이 필요합니다. –

답변

2

왜 두 가지 버전의 진실을 갖고 있고 동기화되지 않은 경우 어떻게 할 것입니까? 그리고 어떻게 결정할 것입니까?

가장 효율적인 방법은 매번 계산하는 것이고, 캐시를 유지하는 지원 및 검증 노력은 계산상의 이점보다 중요 할 수 있습니다. CPU 사이클은 devs의 노력과 비교하여 싸다.

앱에서 병목 현상이 발생하여 캐싱을 보게되면 캐싱에 실질적인 이점이 있습니다.

+0

오케이 알겠습니다. 그래서 일관성 문제가 더 많습니다. – Wiz

1

에 따라 다릅니다. 더 효율적인 옵션은 매번 카운트하는 것이라고 Joocer가 말했듯이 항상 사실은 아닙니다.

시스템에 다음 쿼리가 오기 전에 쿼리가 결과를 반환 할 수있는 빈도로 쿼리 된 사람에 대한 관계 정보가없는 경우 (해당 제한은 아키텍처 효율성에 따라 다름) 해당 될 수 있습니다. 만약 당신이 1 초안에 우정을 쌓을 수 있고, 2 초에 10 건의 계산 요청을 받으면 시스템이 곧 망가질 것입니다.

각 요청에 대해 "페이 스북 (Facebook)"과 같이 크고 자주 질의되는 시스템에서 카운팅 동작이 실제로 효율적이지는 않습니다.

카운팅 필드의 동시성은 시스템에 많은 작업을하지 않고도 여러 고급 기술 (중간 계층, 프런트 엔드 또는 각 아키텍처의 기본 설정에 따라 데이터베이스)을 통해 처리 할 수 ​​있습니다. 데이터베이스 크기에 크게 의존하지 않습니다.

아키텍처에 대한 자세한 내용은 특정 사례에 대한 더 나은 답변을 얻을 수 있습니다.

캐싱은 추가 열 (예 : 데이터베이스 구체화 된 뷰, RDBMS에서 지원하는 경우 사용자에게 제안하는 경향이있는 마녀)에 계산을 저장하는 것과 비슷한 방식입니다. 캐싱 구현에 따라 RDBMS에 여분의 정보를 최적의 방식으로 직접 저장하는 것보다 효율성이 떨어지는 경향이 있습니다.

+0

데이터에 많은 업데이트가있는 경우가 아니라면 한 줄로 하나의 값을 읽는 것이 더 빠릅니다. 그러나 이와 같은 권리를 행사하려는 관련 노력은 무시 당해서는 안되며 아마도 기대 이상일 것입니다. – joocer

관련 문제