나는 비즈니스 로직을 데이터베이스에서 최대한 멀리 유지하는 것을 강력히 믿는다. 그러나 회사의 성능 개발자는 때때로 우수한 성능을 달성해야한다는 점에 감사합니다. 그러나 나는 사람들이 주장하는 것보다 훨씬 덜 필요하다고 생각합니다.
나는 당신의 장단점에 이의를 제기합니다.
비즈니스 로직을 중앙 집중화한다고 주장합니다. 반대로, 나는 그것을 분산화한다고 생각합니다. 현재 작업중인 제품에서 많은 비즈니스 논리에 대해 저장 프로 시저를 사용합니다. 많은 성능 문제는 함수 호출을 반복해서 발생합니다. 예를 들어
select <whatever>
from group g
where fn_invoker_has_access_to_group(g.group_id)
이 접근법의 문제점은 일반적으로 데이터베이스가 행마다 한 번씩 함수를 N 번 실행하도록 강제한다는 것입니다 (이 경우 거짓 일 수 있음). 때로는 그 기능이 비쌉니다. 일부 데이터베이스는 함수 인덱스를 지원합니다. 그러나 가능한 모든 입력에 대해 가능한 모든 함수를 색인화 할 수는 없습니다. 아니면 할 수 있습니까?
위의 문제에 대한 일반적인 해결책은 함수에서 논리를 추출하여 쿼리에 병합하는 것입니다. 이제 캡슐화 및 복제 된 논리가 손상되었습니다.
내가 본 또 다른 문제는 저장 프로 시저 결과 세트를 조인하거나 교차시킬 방법이 없기 때문에 루프에서 저장 프로 시저를 호출하는 것입니다.
declare some_cursor
while some_cursor has rows
exec some_other_proc
end
중첩 된 프로 시저에서 코드를 꺼내면 다시 분산됩니다. 따라서 캡슐화와 성능 중에서 선택해야합니다.
일반적으로 데이터베이스가 나쁜 것으로 나타났습니다.
- 계산
- 반복 (세트 작업에 최적화 됨)
- 로드 밸런싱
- 파싱
데이터베이스는 다음에 능숙합니다.
- 잠금 및 잠금 해제
- 데이터 및 관계 유지
- 무결성 보장
루프 및 문자열 구문 분석과 같은 값 비싼 작업을 수행하고이를 응용 프로그램 계층에 유지함으로써 응용 프로그램을 수평 적으로 확장하여 성능을 향상시킬 수 있습니다. 로드 밸런서 뒤에 여러 응용 프로그램 서버를 추가하는 것이 일반적으로 데이터베이스 복제를 설정하는 것보다 훨씬 저렴합니다.
그러나 비즈니스 논리와 응용 프로그램의 프로그래밍 언어를 분리하는 것이 맞지만 이것이 왜 이점인지는 알 수 없습니다. Java 앱이있는 경우 Java 앱이 있습니다. 많은 Java 코드를 저장 프로 시저로 변환해도 Java 앱이 있다는 사실은 바뀌지 않습니다.
데이터베이스 코드가 지속성에 집중되도록하는 것이 좋습니다. 새 위젯을 작성하는 방법 3 개의 테이블에 삽입해야하며 트랜잭션에 있어야합니다. 저장 프로 시저에 속합니다.
위젯에 수행 할 수있는 작업 및 위젯을 찾기위한 비즈니스 규칙을 정의하는 것은 애플리케이션에 있습니다.