코드에서 작업하는 것보다 RDBMS로 작업을 오프로드하는 것이 더 좋은 경우는 언제입니까?


12

그래, 나는 그것에 순찰 할 것이다 : 나는 데이터베이스에있는 것보다 더 나은 코더이고, "모범 사례"에 대한 생각이 SQL 쿼리에서 "간단한"계산의 주제에 대해 어디에 있는지 궁금하다. 이 MySQL 예제와 같은 코드 (필자는 작성하지 않았지만 유지 관리해야합니다!)-사용자 이름을 반환하고 사용자는 마지막 이벤트 기준으로 연령을 지정합니다.

SELECT u.username as user, 
       IF ((DAY(max(e.date)) - DAY(u.DOB)) < 0 ,   
       TRUNCATE(((((YEAR(max(e.date))*12)+MONTH(max(e.date)))
       -((YEAR(u.DOB)*12)+MONTH(u.DOB)))-1)/12, 0),  
       TRUNCATE((((YEAR(max(e.date))*12)+MONTH(max(e.date))) -            
       ((YEAR(u.DOB)*12)+MONTH(u.DOB)))/12, 0)) AS age   
FROM users as u
JOIN events as e ON u.id = e.uid
...

코드에서 "무거운"리프팅을 수행하는 것과 비교 :

질문:

SELECT u.username, u.DOB as dob, e.event_date as edate
FROM users as u
JOIN events as e ON u.id = e.uid

암호:

function ageAsOfDate($birth, $aod)
{    //expects dates in mysql Y-m-d format...
     list($by,$bm,$bd) = explode('-',$birth);
     list($ay,$am,$ad) = explode('-',$aod);

     //Insert Calculations here 
     ...
     return $Dy; //Difference in years
}

echo "Hey! ". $row['user'] ." was ". ageAsOfDate($row['dob'], $row['edate']) . " when we last saw him."; 

나는 이와 같은 간단한 경우에 큰 차이를 만들지 않을 것이라고 확신하지만 (첫 번째 질문과 같이 쿼리를 변경해야 할 때 공포의 오싹한 느낌을 제외하고는) 찾고 있습니다.

감사!


1
이것은 좋은 질문입니다-나는 같은 문제를 겪었습니다.
Michael K

다음은 하지 말아야 할 좋은 예입니다 : calendar.sql (예, 그것은 저의 괴물입니다. 예, 그것은 나쁜 생각이었고, 느리지 않습니다.)
greyfade

그래도 신들을 뒤집어 놓고 ... 나는 그 일에 대해 MD5가 "CthulhuFhtagn"이 될 것이라고 내기
GeminiDomino

답변:


13

성능상의 이유로 데이터베이스에서 모든 세트 기반 조작을 수행하려고합니다. 따라서 집계 함수, 정렬 함수, 조인 등

이 나이 계산은 코드로 할 것입니다. 데이터베이스 쿼리에서 이와 같은 작업을 수행 할 수있는 유일한 이유는 선택하지 않을 많은 열이 실제로 필요한 경우 실제로 쿼리를 의미있게 늦출 수있는 충분한 데이터가 될 수 있기 때문입니다. 정수 값을 몇 개 선택해도 의미있는 성능 차이가 발생하지 않습니다. 그리고 약간의 성능 차이가 있더라도이 논리를 응용 프로그램 코드에 유지하는쪽으로 편향됩니다.


동의한다. 표시 목적으로 값을 가진 바이올린 코드는 앱 코드에 있어야합니다.
TehShrike

4

각각의 경우는 다릅니다

논리는 ...

  • 다른 고객이 필요하십니까? 건조 : 데이터베이스에서
  • 추가 처리에 사용됩니까? 예를 들어 연령을 기준으로 내림차순 정렬 : 데이터베이스에서
  • 지역 설정이 필요합니까? dd / mm / yyyy 또는 mm / dd / yyyy : 클라이언트에서
  • 자주 사용? 반복해서 계산하는 이유 : 데이터베이스에서 계산 및 지속 열 사용

에서 경우, 나는 데이터베이스에서 계산 지속 열을 사용할 수 있습니다

더 나쁠 수 있습니다 : 데이터베이스에 이것을 가질 수 있습니다 :

"Hey! ". u.username." was ". <datecalc>. " when we last saw him."

3

기본적으로 CPU 사용량과 네트워크 트래픽의 두 가지를 살펴 봐야합니다. 데이터베이스가이 작업을 훨씬 더 잘 수행 할 수 있으므로 방대한 응답을 생성하고 네트워크를 통해 전송 한 다음 프런트 엔드에서 요약해서는 안됩니다.

데이터 조작의 경우 이는 거래입니다. 데이터베이스가 동일한 양의 CPU 사이클을 프론트 엔드 코드에 소비하는 경우 (전송되는 데이터의 양이 거의 동일하다는 점을 고려할 때) 어디에 문제가되지 않습니다. 그런 다음 프로그래밍 전문 지식이 가장 많은 곳에서 수행하십시오. 신중하게 선택하면 매우 먼 길을 갈 수 있으며 매우 유용 할 수 있습니다.


1

당신은 하나의 전문 분야를 언급했습니다. 데이터베이스 구조가 너무 집중적이지 않을 수 있으므로 일부 논리 개발 팀을 데이터베이스 중심의 팀 구성원에게 오프로드하기로 결정합니다. 이상적이지 않을 수 있지만 시간이 지나면 ...

데이터베이스 하드웨어는 다른 서버보다 훨씬 많은 리소스를 가지고 있으며이를 변경할 수 없습니다. 이것은이 특정 상황에는 적용되지 않을 수도 있지만 고려해야 할 수도 있습니다.

코드 외부의 논리가 필요할 수있는 다른 응용 프로그램이 있습니다. 일부 보고서 작성 도구는 웹 서비스 나 API를 사용하지 못할 수 있습니다. 논리를 복제하거나 요구 사항이 다를 수 있다고 생각되면


"데이터베이스 하드웨어는 다른 서버보다 훨씬 많은 리소스를 가지고 있으며이를 변경할 수 없습니다." -어? 이 두 진술은 어디에서 왔습니까?
Peter Boughton

Jeff가 독립형 데이터베이스 서버에 대해 이야기하고 있다고 생각합니다. 필자는 LA [MP] P 설정에서 주로 작업하도록 지정했을 것입니다.
GeminiDomino

1
LAMP 설정은 독립형 데이터베이스 서버가 없어야하는 이유가 아니며 독립형 데이터베이스 서버가 더 많은 자원을 보장하거나이를 변경할 수 없습니다.
Peter Boughton

으르렁 그때 확실하지 않습니다.
GeminiDomino

동일한 서버의 @Peter Boughton, DB 및 앱은 인터페이스 연결에 소요되는 시간이 줄어들고 전체에 걸쳐 IO가 커지므로이 두 가지를 함께 배치해야하는 실질적인 이유가 있습니다.
Jé Queue

0

나는 항상 DB에서 많은 처리를하는 데 실수를한다. 위의 구문은 IMO가 매우 깨끗한 솔루션 인 DB 함수로 작성 될 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.