2011-01-12 2 views
3

내가 일하는 회사는 거의 전적으로 저장 프로 시저를 기반으로하는 대형 응용 프로그램을 개발합니다.저장 프로 시저 비즈니스 논리와 ORM을 섞음

우리는 고전적인 ASP 및 SQL Server를 사용하며 비즈니스 논리의 주요 부분은 이러한 저장 프로 시저 안에 포함되어 있습니다.

예를 들어, 하나의 저장 프로 시저를 다른 목적 (삽입, 업데이트, 삭제, 일부 계산 ...)으로 사용할 수 있습니다. 대부분의 경우 저장 프로 시저가 관련 테이블의 작업에 사용되지만 항상 그런 것은 아닙니다.

가까운 미래에 ASP.NET (WebForms)으로 이동할 계획입니다.

저는 데이터베이스 외부에서 비즈니스 로직을 이동하도록 권장하는 많은 게시물을 StackOverflow에서 읽었습니다. 것은 우리 회사에서 결정을 내리는 사람들을 설득하려고 시도한 것이며 나는 마음을 바꾸기 위해 할 수있는 것이 아무것도 없다..

저는 객체 지향 프로그래밍의 장점을 사용할 수 있기를 원하기 때문에 테이블을 실제 클래스에 매핑하려고합니다. 지금까지의 해결책은 ORM (Entity Framework 4 또는 nHibernate)을 사용하여 개체를 수동으로 매핑하지 않고 대부분 데이터를 검색하는 것입니다. 및 데이터 액세스 계층을 사용하여 저장하기 위해 기존 저장 프로 시저를 호출합니다. .

나는 이것에 당신의 충고를 원합니다. 좋은 해결책이라고 생각하십니까? 어떤 아이디어?

편집 : 표준 DataTable/DataRow 방식으로 진행해야합니까?

+0

여전히 ORM을 통해 procs를 호출 할 수 있습니다. – ScottE

+0

@ScottE : 알아요,하지만 내 sp의 매개 변수가 클래스 멤버에 매핑되지 않은 경우 제대로 작동합니까? 이상한 연결 문자열 프로세스를 사용하여 sp (예 : "^ custid = 123^custname = blabla^adress = 1000 1st avenue")에 하나의 매개 변수 만 전달한 다음 SP에서 구문 분석합니다. – Jason

+1

어, 이상한! – ScottE

답변

5

저장 프로 시저가 많은, 여러 가지 이유로 친구입니다. 내 프로젝트의 저장된 procs에서 모든 db 작업을 수행하도록 강제하고 SQL Server에서 응용 프로그램의 계정을 잠궈 서 저장 프로 시저 (모든 종류의 직접 테이블 액세스 없음) 만 실행할 수 있도록합니다. 여전히, 동일한 프로 시저에서 업데이트/삭제를 혼합하는 것은 나쁘지 만 (동일한 프로 시저 내에서 삽입/업데이트를 결합하는 경향이 있지만) 나에게 충격을 준다.

참고 : 저장 프로 시저의 모든 논리는 웹 코드 외부에 있으므로 ASP에서 ASP.NET으로 이동할 때 다시 구현할 필요가 없습니다. 그들이 속한 곳에서 쿼리를 유지하기위한 +100 점.

요즘 일반적인 "지혜"는 데이터베이스 서버를 객체 저장소로만 사용해야한다는 것을 나타냅니다.이 점에 대해 저는 열렬히 반대합니다. 몇 년 동안 서비스를하고 갑자기 다른 언어로 작성된 다른 앱과 데이터 및 로직을 공유해야하는 몇 가지 프로젝트가있었습니다. 대부분의 DB 코드가 실제로 데이터베이스에 있고 애플리케이션 코드 외부에 있기 때문에 프로젝트간에 매우 간단하고 코드 중복을 최소화 할 수있었습니다.

ORM을 저장된 procs와 혼합하면 어린 나이에 체중과 머리카락을 잃을 수있는 좋은 방법입니다.

기존 응용 프로그램을 현재 데이터 모델에서 ORM으로 전환하면 ASP에서 ASP.NET MVC로 옮기는 복잡성을 제외하면 이미 까다로운 작업에 많은 변수와 실패 지점이 추가됩니다. ORM이 좋은 아이디어라고 생각하는 힘에 대해 설득력있는 주장을 제시 할 수 없다면, 왜 그런지 물을 수 있습니다.

+0

+1 "어떤 종류의 직접적인 테이블 액세스가 없음"- 응용 프로그램에 악의적 인 버그가 있고 동시에 읽기 권한이 있기 때문에 약탈 된 데이터에 대한 공포 이야기를 듣는 프로젝트에 몇 번이나 올지 알 수 없습니다. 모든 테이블. DB 개발자/관리자는 앱이 악용 될 수 있다고 가정하고 모든 데이터를 잠그는 데 필요한 조치를 취해야합니다. Sprocs 당신이 그것을 어떻게 얻을 수 있습니다. 내 경험에 의하면, ORM/코드 생성기를 사용하여 sprocs에 액세스하는 것은 엄청난 시간을 절약 해 주었고 좋은 것입니다 (Postgresql 및 PHP 용 .Net 및 SQL Server 용 PgFunc2Php). –

1

나는 그것이 좋은 해결책이라고 생각한다. 트리거가 테이블 데이터에 대해 수행 할 수있는 작업을주의 깊게 검사하지 않으면 발생할 수있는 부작용에주의하십시오.

한편, 어떤 종류의 응용 프로그램에서는 데이터베이스 측면에서 비즈니스 논리를 갖는 것이 매우 좋은 해결책이라고 생각합니다. 데이터베이스에서 가져 오는 것이 항상 최선의 선택은 아닙니다. 고려해야 할 사항이 많이 있습니다. 내 의견으로는

1

수신 할 것으로 기대되는 객체 지향 프로그래밍의 장점은 무엇입니까?

사람들이 OOP의 장점에 대해 이야기 할 때, 일반적으로 비즈니스 논리를 중앙 집중화하거나 관련 작업과 데이터를 의미있는 추상화를 구축한다는 의미입니다. 저장 프로 시저에 비즈니스 논리를두면 이러한 추상화가 손상되고 비즈니스 논리가 분산됩니다.

팀이 비즈니스 논리 절차를 유지하려는 경우 적어도 다음과 같은 방법으로 작업을 수행해야합니다. 코드를 절차 적으로 만들어 논리를 찾을 수있는 곳을 하나만 지정하십시오.

귀하의 웹 사이트에서 사용하기 위해 ORM을 사용하여 데이터를 data transfer objects (중요한 동작 또는 논리가 없음)으로 매핑하는 것이 일반적입니다. Dino Esposito의 Pros and Cons of Data Transfer Objects은 질문을 아주 잘 처리합니다. 저장 프로 시저를 서비스 계층으로 생각하면됩니다.

+0

코드를 재사용 할 수있는 대부분의 상속 현재 중복되었습니다. 우리는 시스템의 기본 동작에 기능을 추가하는 고객을 위해 많은 사용자 지정 작업을 수행합니다. – Jason

0

전적으로 비즈니스 요구 사항에 따라 다릅니다. 저장 프로 시저에서 비즈니스 로직의 양과 비즈니스 작업 흐름을 수립하기 위해 여러 저장 프로 시저 간의 종속성이 중요합니다.

확장 성은 큰 문제가됩니다. 종속 논리는 프로세스가 완료되기를 기다리는 동안 CPU 사용을 차단할 수 있습니다. Parallization은 성능 향상을 위해 데이터베이스 요구 사항이 기본적으로 캐시되는 서비스 구동 아키텍처에서 중요합니다. 왜 CPU 상자 하나를 치고 작업 흐름을 방해하고 분산시킬 수 있습니까?

나는 모든 나이에 머리카락을 잃지 않고 고려해야 할 사항이 있다고 생각합니다.