7

OR- 맵퍼를 사용하는 것이 합리적입니까?OR 매퍼를 사용하는 것이 합리적입니까?

스택 오버플로에 대한이 질문은 내가 알고있는 스마트 개발자가 도움과 의견을 기꺼이 제공 할 수있는 가장 좋은 장소이기 때문에이 질문을 스택 오버플로에 넣고 있습니다.

내 논리는 다음과 같습니다.

1.) SQL은 어디에 속하는가?

). 내가 작업 한 모든 전문 프로젝트에서 데이터 보안이 핵심 요구 사항이었습니다. 저장 프로시 듀어는 액세스 W 감사를 제어하기위한 고유 게이트웨이를 제공합니다.

b.) 프로덕션 환경에서 응용 프로그램 관련 문제는 새 빌드를 내보내지 않고 테이블과 저장 프로 시저간에 해결 될 수 있습니다.

2.) 생성 된 SQL을 어떻게 제어합니까? 나는 효율적인 SQL을 생성하기 위해 구문 분석 트리를 신뢰하고있다. SQL-Server와 Oracle에서 SQL을 최적화하는 데 경험이 많았지 만, 다시는 할 필요가 없다면 부정 행위를하지 않을 것입니다. :)

3.) 스토어드 프로 시저에서 데이터를 가져 오는 경우 OR-Mapper를 사용하는 것이 무엇입니까?

저는 자체 개발 한 일반 데이터 액세스 레이어로 저장소 패턴을 사용했습니다. 컬렉션을 캐시해야하는 경우이를 캐시합니다. 또한 작은 CRUD 어플리케이션에서 EF를 사용하고 성능 문제가 발생한 NHibernate 애플리케이션을 튜닝하는 데 경험이있는 경험이 있습니다. 그래서 나는 조금 편향되어 있지만 기꺼이 배울 것입니다.

지난 수년 동안 우리는 특정 OR 매퍼 (엔티티 프레임 워크, NHibernate 등)의 사용을지지하는 존경할만한 개발자를 많이 들었습니다.

누군가가 주요 프로젝트의 주류 개발을 위해 ORM으로 이동해야하는 이유는 누구에게 말해 줄 수 있습니까?

편집 : http://www.codinghorror.com/blog/2006/06/object-relational-mapping-is-the-vietnam-of-computer-science.html이 토픽에 대해 강하게 토론을하고 있지만 오래되었습니다.

또 다른 편집 : 성능상의 이점과 프로그래밍 로직을 데이터에 더 가깝게 추가 할 수 있기 때문에 저장 프로 시저가 견고한 엔터프라이즈 응용 프로그램에 사용된다는 데 모두 동의하는 것으로 보입니다.

나는 OR 매퍼를지지하는 가장 강력한 논쟁이 개발자 생산성이라는 것을 알고 있습니다.

ORM 이동에 대한 큰 동기는 개발자가 계속 지속성을 잃지 않을 것으로 생각됩니다 (데이터가 캐싱이 아닌 경우 또는 데이터베이스에있는 경우 상관하지 않음).

로컬 및 소규모 웹 응용 프로그램의 경우 ORM이 뛰어난 시간 절약형 서비스 인 것으로 보입니다.

내가보기에 가장 좋은 조언은 client09에서 나온 것일 수 있습니다. ORM 설정을 사용하지만 데이터베이스 집약적 인 작업 (예 : ORM이 불충분 한 것으로 보이는 경우)을 위해 저장 프로 시저를 사용하십시오.

+2

CSLA는 OR-Mapper가 아닙니다.이것은 일반적인 오해입니다. –

+1

어쩌면 이것은 당신에게 더 많은 현재 일 것입니다. http://stackoverflow.com/questions/404083/is-orm-still-the-vietnam-of-computer-science – dkretz

답변

4

나는 프로 SP 였고, DB 개발을하는 유일한 방법이라고 생각했지만, 마지막으로 3-4 번 프로젝트에서 EF4.0 w/out SP 및 개선 사항을 완료했습니다. 내 생산성면에서 정말 경외심을 불러 일으켰습니다. 전 하루 전에 몇 줄의 코드를 작성하면됩니다.

나는 여전히 SP가 중요하다고 생각하지만 (잘 선택한 SP로 성능을 크게 향상시킬 수있는 경우도 있지만) 일반적인 CRUD 작업에서는 되돌릴 수 없다고 생각합니다.

나를위한 짧은 대답은 개발자 생산성이 ORM을 사용하는 이유입니다. 어쨌든 학습 곡선을 넘으면됩니다.

1

저장 프로 시저는 데이터베이스 논리를 한 곳에서 캡슐화하는 데 적합합니다. 필자는 오라클 스토어드 프로 시저만을 사용하는 프로젝트에서 작업했으며, 현재 Hibernate를 사용하는 프로 시저에서 작업하고 있습니다. 우리는 Java 개발자가 PL/SQL 패키지 종속성에 정통하지 않았기 때문에 중복 프로 시저를 개발하는 것이 매우 쉽다는 것을 발견했습니다.

프로젝트의 DBA로서 Java 개발자는 모든 것을 Java 코드로 유지하는 것을 선호합니다. "왜 방금 돌아온 모든 물체를 돌아 다니지 않는가?" 이로 인해 여러 가지 "색인이 왜이 문제를 해결하지 않습니까?" 문제.

Hibernate를 사용하면 엔티티가 링크 된 데이터베이스 특성을 포함 할 수있을뿐만 아니라 이에 대한 조치를 포함 할 수 있습니다.

예를 들어 Task Entity가 있습니다. 하나는 다른 것들 사이에서 작업을 추가하거나 수정할 수 있습니다. 이것은 Named Queries의 Hibernate Entity에서 모델링 될 수있다.

그래서 ORM 설정으로 이동 하겠지만 데이터베이스 집약적 인 작업을위한 절차를 사용하십시오.

Java에서 SQL을 유지하는 단점은 매개 변수화되지 않은 쿼리를 사용하는 개발자가 SQL 인젝션을 열어 두는 위험을 감수해야한다는 것입니다.

+0

"With Hibernate 당신의 엔티티는 링크 된 데이터베이스 속성뿐만 아니라 포함 할 수 있습니다. 그 (것)들에 취해진 어떤 행동. 하지만 ORM없이 이것을 얻을 수 있습니다. 또한 단일 책임도 여기에 포함되어야합니다. Dto의 역할은 무엇입니까? 데이터를 전송하거나 값을 기반으로 계산 하시겠습니까? – RBZ

3

다른 접근법 ... 이제 SQL을 사용하지 않기 때문에 데이터를 저장하는 대신 객체/문서 데이터베이스를 사용해 볼 수 있습니다. 이런 식으로, 당신은 기본적으로 OR 매핑을 피할 것입니다. 응용 프로그램에서 사용하는 데이터를 저장하고 작업자 프로세스의 장면 뒤에서 변환하여 추가 분석 및보고를 위해보다 관계형/OLAP 형식으로 이동하십시오.

1

다음은 제 개인 의견이므로 다소 주관적입니다.

1.) 로컬 응용 프로그램과 엔터프라이즈 응용 프로그램을 구별해야한다고 생각합니다. 로컬 및 일부 웹 응용 프로그램의 경우 DB에 직접 액세스 할 수 있습니다. 엔터프라이즈 응용 프로그램의 경우 캡슐화 및 권한 관리 기능이 향상되면 결국 저장 프로 시저가 더 나은 선택이 될 것입니다.

2.) 이것은 ORM의 큰 문제 중 하나입니다. 일반적으로 특정 쿼리 패턴에 맞게 최적화되어 있으며 이러한 쿼리 패턴을 사용하는 한 생성 된 SQL은 일반적으로 양질입니다. 그러나 효율적으로 유지하기 위해 데이터에 가깝게 수행해야하는 복잡한 작업의 경우 수동 SQL 코드를 사용하는 것이 좋으며,이 경우 코드는 SP에 포함됩니다.

3) 데이터 엔티티로 객체를 처리하는 것은 "루스"데이터 세트에 직접 액세스하는 것 (입력 한 경우에도)에 비해 유용합니다. 결과 집합을 SP에서 반환했는지 아니면 동적 SQL 쿼리에서 반환했는지에 관계없이 결과 집합을 개체 그래프로 deserialize하면 매우 유용합니다.

SQL Server를 사용하는 경우 오픈 소스 bsn ModuleStore 프로젝트를 살펴 보겠습니다. DB 스키마 버전 관리 및 SP를 경량 ORM 개념 (직렬화 및 개체 직렬화를 통해 호출 할 때 사용)에 대한 프레임 워크입니다. SP).

관련 문제