2009-08-09 2 views
7

O/R 매퍼를 사용하거나 기존 데이터 액세스를 사용하는 사이에 나는 정말로 찢겨 나옵니다. 어떤 이유로 O/R 매퍼를 불러올 때마다 동료 개발자가 성능 문제에 대해 말을하거나 말하며, 전반적으로 나쁘다. 내가 여기서 무엇을 놓치고 있니? LINQ to SQL과 Microsoft Entity Framework를보고 있습니다. 이 주장들에 대한 근거가 있습니까? O/R 매퍼를 사용하려면 어떤 종류의 작업을해야합니까? 감사.O/R Mappers - 좋음 또는 나쁨

+8

'성능상의 이유로'손을 펴서 프로젝트의 80 %를 소비하고 최종 사용자에게 부풀린 viewstate를 100,000 개나 뿌려주는 devs를 좋아합니다 ... 우선 순위 – redsquare

+1

커뮤니티 위키일까요? –

+1

이 질문은 여러 번 질문되었습니다. 간단히 'ORM'을 검색하면 무리를 찾을 수 있습니다. –

답변

1

많은 OR 매퍼에서 볼 수있는 문제는 일반적으로 데이터 액세스 프레임 워크의 나머지 부분과 매우 결합 된 부풀어 오른 도메인 객체를 얻는 것입니다. 우리의 개발자도 그렇게 생각합니다. :)이 객체를 다른 데이터 액세스 기술로 이식하는 것이 더 어렵습니다. L2S를 사용하는 경우 생성 된 코드를 살펴볼 수 있습니다. 그것은 완전히 혼란스럽게 보입니다. NHibernate 아마 이것에서 최고 중 하나입니다. 엔티티는 데이터 액세스 레이어를 올바르게 디자인하면 이러한 데이터 액세스 레이어를 전혀 알지 못합니다.

+0

DTO는 실제로 귀하의 합격입니다 죽. 그리고 네, 그들의 단점 중 하나는 그들이 만드는 계급 폭발입니다. – BozoJoe

0

나는 Rockford Lhotka의 저서 인 C# 비즈니스 객체를 읽음으로써 ORM 매핑과 데이터 액세스 계층을 처음 접하게되었습니다. 그는 DAL의 프레임 워크에서 수년을 보냈습니다. 그의 프레임 워크는 매우 비대 해져 어떤 경우에는 잔인 함에도 불구하고 훌륭한 아이디어를 가지고 있습니다. 나는 ORM mappers를보고있는 누군가를 위해이 책을 매우 추천한다. 나는 많은 아이디어를 없애고 그것을 내 자신의 프레임 워크와 코드 생성으로 만들기에 충분할 정도로 그의 책의 영향을 받았다.

10

이것은 처음에는 관련이없는 답변처럼 보일 것입니다. 그러나 제 관심사 중 하나는 2 차 세계 대전 시대의 전투기입니다. 모든 전쟁 국가 (미국, 영국, 독일, 소련, 일본 등)는 전쟁 중 여러 전투기를 만들었습니다. 그들 중 일부는 레이디 얼 엔진 (P47, Corsair, FW-190, Zero)을 사용했습니다. 일부는 인라인 액체 냉각 엔진 (Bf-109, Mustang, Yak-7, Spitfire)을 사용했습니다. 일부 엔진은 하나 대신 두 개의 엔진을 사용했습니다 (P38, Do-335). 일부는 기관총을 사용하고, 일부는 대포를 사용하고, 일부는 사용했습니다. 당신이 상상할 수있는 일부는 심지어 합판으로 만들어졌습니다.

결국 모두 유능하고 경험이 풍부한 파일럿의 손에, 그들은 매우 빠르게 움직였습니다. 그들은 신인 선수를 심장 박동으로 쏴 버릴 것입니다. 나는 많은 조종사가 "오, 그 바보가 방사형 엔진으로 무언가를 날고있다 - 나는 그에게 전혀 걱정할 필요가 없다"라고 생각하는 것을 상상한다. 모든 사람들은 궁극적 인 목표를 성취 할 수있는 다양한 방법이 있다는 것을 이해했으며, 각 접근법에는 상황에 따라 특별한 장점과 단점이있었습니다.

ORM 및 기존 데이터 액세스 사이의 논쟁은 바로이 같은이며,이 두 가지 접근 방식과 능력이되고, 손의 작업에 적합한 옵션을 선택할 수있는 프로그래머들에게 당연히 할 일이다 behoove.

+6

올바른 직업에 적합한 도구를 선택하는 것이 모든 프로그래밍 질문에 대한 일반적인 일반 답변이기 때문에 투표를 취소해야합니다. 대신 ORM이 적절한 지 또는 적절한 지의 여부에 대해 더 나은 대답을 제시 할 수 있습니다. 나는 프로그램 아키텍처 선택을 묘사하기 위해 육체적 인 유추를 사용하는 것이 미묘함이 고려되면 항상 고장 나기 때문에 두 번째로 투표 할 것입니다. 파일럿 교육 시간, 항공기 유지 보수 비용, 자원 사용량? – jfar

+1

@jfar : 내 요점은 당신이 분명히 취한 방식보다 더 일반적이었습니다. "ORM은 훌륭하고 다른 방법은 완전한 쓰레기"(또는 그 반대)라고 말하는 사람들은 단지 어리 석다는 것입니다. 그리고 "아무도 그렇게 말하지 않는다"고 말하지 마라. 왜냐하면 사람들은 항상 여기에 그런 식으로 말하기 때문이다. 소프트웨어에 대한 물리적 유비가 세부 사항을 고려할 때 무너지는 한, 나는 "이런"라고하는 것을 싫어하므로 그렇게하지 않을 것입니다. – MusiGenesis

5

저는 오랫동안이 결정에 어려움을 겪었습니다. 나는 두 가지 주요한 이유로 주저했다고 생각한다. 첫째, O/R 맵퍼는 앱의 중요한 부분에서 무슨 일이 일어나고 있었는지에 대한 제어력이 부족했기 때문에 둘째, 저는 90 %의 경우에는 최고 였지만 마지막에 대해서는 비참한 솔루션으로 인해 여러 번 실망했습니다 10 %. 물론 선택자는 * 선택자에게만 적용됩니다. 그러나 복잡성을 높이고 대용량의 중요한 시스템을 보유하고 경력을 쌓으려면 모든 쿼리 패턴과 바이트를 완벽하게 제어해야합니다 와이어를 통해. 나를 비롯한 대부분의 개발자는 툴이 우리를 실패 할 때 좌절감을 느낍니다. 우리는해야 할 일을 할 수 없으며 툴의 지원을받는 패턴에서 벗어날 수 있습니다. 도구의 특정 결함에 대해 언급 할 것입니다.

다행히도 Anderson ImesCodeSmithnetTiers template으로 시도 할 것을 확신했습니다. (아니, 나는 그들을 위해 일하지 않는다.) 이것을 사용하여 1 년 이상 후에, 나는 우리가 그것을 더 일찍하지 않았다고 믿을 수 없다. 우리 팀은 Visual Studio DB Pro를 사용하며 모든 체크인시 지속적인 통합 빌드로 새로운 데이터 액세스 레이어 어셈블리 집합이 삭제됩니다.이것은 일반적으로 위험성이 낮은 모든 것들을 자동으로 처리하지만 까다로운 부분에 대한 맞춤 sproc을 작성하고 생성 된 클래스에 메소드로 포함 시키며 생성 된 코드의 템플릿을 사용자 정의 할 수도 있습니다. 이 방법을 적극 권장합니다. 이 수준의 제어를 허용하는 다른 도구가있을 수 있으며 LINQ to SQL을 사용하는 PLINQO라는 새로운 CodeSmith 템플릿이 있습니다. 우리는 아직 그것을 조사하지는 않았지만,이 전반적인 접근법은 많은 장점을 가지고 있습니다.

제리는 각 ORM 제공 이후 이에 대한 간단한 대답은 없다

0

는 자신의 특정 장단점의 것입니다. 일부 ORM 솔루션은 다른 솔루션보다 유연합니다. onus는 개발자가 사용하기 전에 이것을 이해하고 있습니다.

그러나 LinqToSql을 사용하십시오. SQL Server에서 전환하지 않아도된다면 ORM 매퍼에서 볼 수있는 일반적인 문제를 해결할 수 있습니다. 저장 프로 시저 (정적 메서드)를 쉽게 추가 할 수 있으므로 생성 된 SQL에만 국한되지 않습니다. 지연된 실행을 사용하므로 쿼리를 효율적으로 체인 연결할 수 있습니다. 부분 클래스를 사용하여 생성 된 클래스에 사용자 지정 논리를 쉽게 추가 할 수 있으므로 다시 생성 할 때 발생하는 상황을 염려 할 필요가 없습니다. 또한 LINQ를 사용하여 자신 만의 추상적 인 DAL을 만드는 것을 막을 수있는 방법은 없습니다. 단지 프로세스 속도를 높이는 것입니다. 주된 것은 CRUD 레이어를 만드는 데 필요한 지루함과 시간을 줄이는 것입니다.

그러나 단점도 있습니다. 테이블과 클래스간에 긴밀한 결합이있을 수 있으며 약간의 성능 저하가있을 수 있습니다. 예상보다 효율적이지 않은 쿼리를 생성하는 경우가 있습니다. SQL Server에 묶여 있습니다 (일부 다른 ORM 기술은 데이터베이스에 무관심합니다).

내가 말했듯이, 중요한 것은 특정 방법론에 색상을 고정하기 전에 장단점을 인식하는 것입니다.

+0

대부분의 다른 O/RM 도구는 sprocs에 쉽게 매핑 할 수 있습니다. 몇 가지 이름을 짓기 위해 : (N) Hibernate와 EntityFramework.또한 Microsoft는 현재 Linq2Sql에 대한 작업을 중단했습니다. 따라서 우리는 현재 구현을 고수했습니다 ... – Ray

+0

Linq2Sql에서 작업이 중지 되었습니까? http://damieng.com/blog/2009/06/01/linq-to-sql-changes-in-net-40 – jfar

2

O/RM 도구는 대부분의 상황에서 매우 잘 수행되도록 설계되었습니다. 엔티티를 캐쉬 할 것이고, 대량으로 쿼리를 실행할 것이고, 객체에 대한 액세스를 매우 낮은 수준으로 최적화하여 수동으로 값을 속성에 할당하는 것보다 빠르기 때문에, aspect 기반 프로그래밍의 변형을 매우 쉽게 통합 할 수 있습니다. 인터셉터와 같은 현대 기술은 여러분을 위해 엔티티 상태를 관리하고 갈등을 해결하는 데 도움을 줄 것입니다.

이 접근법의 단점은 대개 상황이 매우 낮은 수준에서 작동하는 방식에 대한 이해가 부족하다는 것입니다. 가장 일반적인 문제는 "SELECT N + 1"(link)입니다.

지금은 2.5 년 NHibernate에 작업 있었고, 난 여전히 거의 매일 그것에 대해 뭔가 새로운 것을 발견 해요 ...

2

좋은. 대부분의 경우에.

ORM을 사용하는 생산성 이점은 대부분 데이터 액세스 방식에 대한 제어 손실을 상회합니다.

C#을 피할 사람이 많지 않으므로 MSIL 또는 Assembly 프로그램을 사용하면 더 많은 제어 권한을 얻을 수 있습니다.

+0

+1 때문에 핵심 단어 : ** 생산성 **. MySQL에서 복잡한 데이터베이스를 사용하여 일종의 CRM 시스템을 구현했습니다. 요구 사항이 변경 될 때마다 수동으로 모든 매핑을 수행해야한다고 상상할 수 없으며 50 번이나 발생했습니다. –

+0

+1 어셈블리에 대한 글쓰기의 큰 비교. – Jdahern

1

정말 상황에 따라 다릅니다.

나는 ORM을 사용하지 않고 항상 SQL 쿼리를 작성한 회사에게 조정 된 ORM을 사용하는 회사를 방문했습니다.

  • 높은 블로
  • 당신이 당신의 쿼리를 미세하게 제어 할 수 없습니다 : 내가 코드를 단순화하기 위해 ORM을 사용하는 방법에 대해 물었을 때, 나는 그것의 모든 악재 다음에 얼굴에 빈 모습 것을 얻었다 테이블 매핑에 무거운 물체가 불필요한 사람
  • 을 실행
  • 의 건조하지 코드는

    상에 자기에게

을 반복해야하기 때문에 버그가 있다면 우리는 소수에 불과 을 고칠 것, 거의 동일했다 몇 가지 질의를했고, 시간이 많이

  • :

    글쎄, 몇 주 동안이 작업 후에, 나는 것을 발견했다

  • 일반적인 테이블 쿼리를 캐싱하는 대신 여러 번 테이블을 읽게됩니다.
  • 우리는 모든 곳에서 우리 자신을 되풀이하고있었습니다.
  • 몇 가지 수준의 기술 수준이 있으므로 일부 쿼리는 가장 효율적으로 작성되지 않았습니다.

나는 대부분 이것을 지적한 후에 ORM이라고 부르기를 원하지 않기 때문에 "DBO"라고 썼습니다. 그들은 하나를 수정하는 대신 처음부터 쓰기로 결정했습니다.

또한 논쟁의 대부분은 ORM의 무지에서 비롯된 것 같습니다. 내가 본 모든 ORM은 사용자 지정 쿼리를 허용하고 심지어 ORM 규칙을 따르면서도 매우 복잡하고 자세한 쿼리를 작성할 수 있으며 일반적으로 사람이 읽을 수 있습니다. 또한, 그들은 매우 건조한 경향이 있고, 당신은 그들에게 당신의 스키마를 주며, 나머지는 관계 맵핑으로 계산합니다.

현대 ORM에는 마이그레이션 스크립트와 같은 많은 도구가있어 동일한 개체에 액세스 할 수있는 여러 DB 유형이 있으므로 NOSQL과 SQL DB의 장점을 활용할 수 있습니다. 그러나 당신이 그것을 사용할 것이라면 당신은 당신의 프로젝트에 맞는 ORM을 선택해야합니다.

관련 문제