2014-10-29 4 views
0

MySQL 백엔드를 사용하는 PHP 애플리케이션이 있습니다. 이것은 100 명 정도의 사용자 만있는 내부 애플리케이션으로, 초당 수천 개의 요청을받지 못합니다.데이터에 대한 계산 수행 위치 : 개체 또는 데이터베이스에서?

현재 Google 데이터베이스에서 '마스터'보기라고하는 것을 만들었습니다. 이러한 뷰는 모든 조회 테이블을 조인하고 모든 행 기반 계산을 수행합니다. 예를 들어 테이블에 members 테이블을 참조하는 member_id을 저장합니다. 보기에서는 테이블의 모든 열을 가져옵니다. 모든 조회 테이블에 대해이 작업을 수행합니다. 행 기반 계산의 경우 일반적으로 두 날짜 간의 날짜 차이와 같은 간단한 계산입니다. 모든 조인이 이미 만들어져 있고 간단한 계산이 이미 이루어져 있기 때문에 쿼리를 작성 (특히보고)하기 때문에 이러한 마스터 뷰가 있습니다.

제 질문은 - 이것을 수행하는 가장 좋은 방법입니까? 예를 들어, 뷰 내에서 이러한 모든 계산을 수행하는 대신이 계산을 내 클래스로 옮깁니다.

<?php 
class FlockEx extends Flock 
{ 
    public function getFlockAge() 
    { 
     $date1 = new \DateTime($this->getDatePlaced()); 
     $date2 = new \DateTime($this->getDatePickedUp()); 

     $difference = $date1->diff($date2); 

     return $difference->days; 
    } 
} 

그리고 대신 : 그래서, 내 위의 예에서, 대신 두 날짜 (flock_age) 사이의 차이를 계산하는보기에서 열 필요없이 간단히 말해서 나는 당신이 계산을 수행하기 위해 내 클래스의 메소드를 작성합니다 이 룩업 테이블을 모두 합치면 다음과 같이 대신 해당 클래스의 새 인스턴스를 만듭니다.

<?php 
$flockdb = new FlockDB(); 
$flock = $flockdb->getFlockById(4); 

$memberdb = new MemberDB(); 
$member = $memberdb->getMemberById($flock->getMemberId()); 
... 

이렇게하는 것이 가장 좋은 방법이 있습니까? 또는 단순히 가장 좋은 방법은 무엇입니까?

+1

IMHO .... 나는 데이터베이스의 근육을 구부릴 수있는 한 모든 것을 데이터베이스에서 수행 할 것입니다. –

답변

2

같은 일부 DB의 개념에 대해 읽어보십시오. 이것은 탁월한 곳입니다. 영향이 합쳐져서 또는 은 조인/집계가 인공물로 필요합니다. 계산은 일반적으로 데이터베이스 자체에서 수행해야합니다.

낮은 대기 시간 /로드/카디널리티 작업 또는 동일한 기본 데이터 세트 카디널리티/크기가 비슷한 경우에는 종종 중요하지 않습니다.

이 경우에는 동일한 레코드의 두 필드 사이의 날짜 차등 (date-diff)이 클라이언트에서 수행하는 것이 좋습니다. 조인이 그것에 종속되어있는 경우는 아닐 수도 있습니다.

0

나는 가능한 한 데이터베이스에보고합니다. 저는 엄청난 OOP 지지자입니다 만, 단일 SUM() SQL 호출이 제공하는 것과 동일한 번호를 얻기 위해 수백 또는 수천 개의 DB 호출과 객체 생성을 통해 대량으로 대량 작성하는 것은 바보입니다.

기타 : 의견을 묻기 때문에 질문이 닫힐 수 있습니다. 개인적으로 가져 가지 마십시오.

+0

나는 그것이 의견을 기반으로한다는 것을 알았지 만, 이것에 대한 답을 찾는 다른 방법을 알지 못했다. 귀하의 의견을 주셔서 감사합니다. – Jeff

0

데이터베이스 계산은 항상 DB 쪽에서 수행하십시오. 그것은 당신에게 큰 성능 향상을 줄 것입니다.

는 데이터베이스가 집계에 합류 활용하는 데 사용해야 PROCEDURE & FUNCTION

관련 문제