[sql] ORM 또는 일반 SQL을 사용하십니까? [닫은]

필자가 개발 한 앱 중 일부를 잊어 버린 경우 주로 MySQL 용 일반 SQL을 작성했습니다. SQLAlchemy 와 같은 파이썬에서 ORM을 사용했지만 오랫동안 그것들을 고수하지 않았습니다. 일반적으로 문서화 또는 복잡성 (내 관점에서 볼 때)이 나를 방해합니다.

다음과 같이 보입니다 : 한 가지 유형의 데이터베이스를 사용하려는 경우 이식성을 위해 ORM을 사용하고 일반 SQL을 사용하십시오. 데이터베이스 지원이 필요한 앱을 개발할 때 언제 ORM 또는 SQL을 사용해야하는지에 대한 조언을 찾고 있습니다.

그것에 대해 생각하면 데이터베이스 래퍼를 사용하거나 ORM을 사용하는 것보다 가벼운 래퍼를 사용하는 것이 훨씬 좋습니다.



답변

ORM에는 멋진 기능이 있습니다. 데이터베이스 열을 개체 필드에 복사하는 많은 작업을 처리 할 수 ​​있습니다. 일반적으로 언어의 날짜 및 시간 유형을 적절한 데이터베이스 유형으로 변환합니다. 일반적으로 중첩 된 객체를 인스턴스화하여 일대 다 관계를 매우 우아하게 처리합니다. ORM의 강점과 약점을 염두에두고 데이터베이스를 설계하면 데이터베이스에서 데이터를 가져오고 나가는 데 많은 작업이 절약됩니다. (매핑해야하는 경우 다형성과 다 대다 관계를 처리하는 방법을 알고 싶을 것입니다.이 두 도메인은 ORM을 ‘컴퓨터 과학의 베트남’이라고 부르는 ‘임피던스 불일치’를 대부분 제공합니다. .)

트랜잭션이있는 응용 프로그램 (예 : 요청, 일부 개체 가져 오기, 데이터를 가져 와서 웹 페이지에서 렌더링)의 경우 성능 세가 적으며 많은 경우 ORM이 개체를 캐시하기 때문에 ORM이 더 빠를 수 있습니다. 앞에서 본 것처럼, 그렇지 않으면 데이터베이스를 여러 번 쿼리했을 것입니다.

보고가 많거나 요청 당 많은 수의 데이터베이스 행을 처리하는 응용 프로그램의 경우 ORM 세금은 훨씬 더 무겁고, 캐싱하는 캐싱은 큰 쓸모없는 메모리 낭비 부담으로 바뀝니다. 이 경우 간단한 DAL (LinQ 또는 iBatis) 또는 간단한 DAL의 수작업으로 코딩 된 SQL 쿼리를 사용하는 것이 좋습니다.

대규모 응용 프로그램에서 두 가지 방법을 모두 사용한다는 것을 알았습니다. (간단한 CRUD의 경우 ORM,보고의 경우 SQL / thin DAL).


답변

Hibernate, EclipseLink, Toplink, OpenJPA 등을 포함하여 JPA (Java Persistence API, 기본적으로 Java / J2EE / EJB에 대한 표준화 된 ORM API)를 다루는 데 상당한 시간을 소비 한 사람으로서 관찰.

  1. ORM은 빠르지 않습니다. 그것들은 적절할 수 있고 대부분의 시간은 적당하지만 대량의 대기 시간이 짧은 환경에서는 그렇지 않습니다.
  2. Java 및 C #과 같은 범용 프로그래밍 언어에서는 작동하기 위해 엄청나게 많은 마법이 필요합니다 (예 : Java에서로드 타임 제직, 계측 등).
  3. ORM을 사용할 때 (의도적 인 것처럼 보이는) SQL에서 멀어지기보다는 ORM이 성능있는 SQL을 생성하도록 XML 및 / 또는 주석 / 속성을 조정하는 데 얼마나 많은 시간이 걸리는지 놀라게 될 것입니다.
  4. 복잡한 쿼리의 경우 실제로 대체 방법이 없습니다. JPA와 마찬가지로 원시 SQL에서는 불가능한 일부 쿼리가 있으며 JPA에서 원시 SQL을 사용해야 할 때 (C # /. Net에는 동적 유형-var가 있습니다.) Object 배열보다 좋습니다);
  5. ORM을 사용할 때 엄청나게 많은 “gotchas”가 있습니다. 여기에는 의도하지 않았거나 예기치 않은 동작, JPA 또는 이와 유사한 메소드에서 refresh ()를 사용하여 데이터베이스에 대한 SQL 업데이트를 수행 할 수있는 기능을 빌드해야한다는 사실이 포함됩니다. JPA는 기본적으로 모든 것을 캐시하므로 직접 데이터베이스를 포착하지 않습니다. 업데이트-직접 SQL 업데이트를 실행하는 것이 일반적인 프로덕션 지원 활동입니다).
  6. 객체 관계 불일치는 항상 문제를 일으킬 것입니다. 이러한 문제로 인해 추상화의 복잡성과 완전성 사이에 상충 관계가 있습니다. 때때로 나는 JPA가 너무 멀리 가고 추상화가 복잡성 히트가 정당화되지 않은 실제 수익률 감소 법칙에 부딪쳤다 고 느꼈다.

좀 더 설명이 필요한 또 다른 문제가 있습니다.

웹 응용 프로그램의 전통적인 모델은 지속성 계층과 프레젠테이션 계층을 갖는 것입니다 (서비스 또는 다른 계층 사이에있을 수 있지만이 논의에서 중요한 두 가지입니다). ORM은 퍼시스턴스 레이어에서 프리젠 테이션 레이어 (즉, 엔티티)까지 견고하게 보여줍니다.

보다 원시적 인 SQL 메소드에 대한 비판 중 하나는 단순히 하나의 쿼리에서 사용되는 이러한 모든 VO (값 오브젝트) 또는 DTO (데이터 전송 오브젝트)로 끝나는 것입니다. 이를 없애기 때문에 ORM의 장점으로 선전됩니다.

문제는 ORM에서 사라지지 않는 문제이며 단순히 프리젠 테이션 레이어로 넘어갑니다. 쿼리에 대한 VO / DTO를 만드는 대신 일반적으로 모든보기마다 하나씩 사용자 지정 프레젠테이션 개체를 만듭니다. 이것이 어떻게 더 낫습니까? 그렇지 않다.

ORM 또는 SQL로 이것에 대해 썼습니다 : 아직 있습니까? .

요즘 내 선택 기술 (자바)은 이바 티스입니다. JPA가 할 수있는 것의 90 % 이상을 수행하는 SQL 주위의 꽤 얇은 래퍼입니다 (문서화되지는 않았지만 관계의 지연 로딩을 수행 할 수도 있음).하지만 복잡성과 실제 코드 측면에서 오버 헤드가 훨씬 적습니다.

이것은 작년에 내가 작성한 GWT 응용 프로그램에서 나왔습니다. 서비스 구현에서 EclipseLink에서 프리젠 테이션 오브젝트로의 많은 변환 우리가 ibatis를 사용한다면, ibatis로 적절한 객체를 생성 한 다음 스택 위아래로 전달하는 것이 훨씬 간단했을 것입니다. 일부 순수 주의자들은 이것이 Bad ™라고 주장 할 수 있습니다. 어쩌면 (이론적으로) 어쨌든 나는 당신에게 무엇을 말해줍니다 : 그것은 더 간단한 코드, 더 간단한 스택 및 더 많은 생산성으로 이어질 것입니다.


답변

R eads에 대한 일반 SQL , CUD에 대한 ORM을 말합니다 .

성능은 특히 웹 응용 프로그램에서 항상 염려하는 부분이지만 코드 유지 관리 성과 가독성도 중요합니다. 이러한 문제를 해결하기 위해 SqlBuilder를 작성 했습니다 .


답변

ORM은 이식성 만있는 것이 아닙니다 (ORM으로도 달성하기 어렵습니다). 그것이 제공하는 것은 ORM 도구가 상용구 SQL 쿼리 (PK 또는 술어, 삽입, 업데이트 및 삭제에 의해 선택)를 작성하지 못하게하고 문제 도메인에 집중할 수있게하는 기본적으로 영구 저장소에 대한 추상화 계층입니다.


답변

임피던스 불일치를 처리하기 위해서는 데이터베이스에 대한 추상화가 필요합니다. 그러나 가장 간단한 첫 단계 (대부분의 경우에 적합)는 무거운 ORM이 아닌 DAL이 될 것으로 기대합니다. 유일한 옵션은 스펙트럼 끝의 옵션이 아닙니다.


DAL과 ORM을 구별하는 방법을 설명하는 의견에 대한 답변으로 편집하십시오.

DAL은 단순히 테이블을 캡슐화하고 해당 필드를 속성에 매핑하는 클래스에서 시작하여 직접 작성하는 것입니다. ORM은 dbms 스키마의 다른 속성 (주로 PK 및 FK)에서 유추하거나 추상화하지 않는 코드입니다. (여기서 자동 추상화가 누출되기 시작하는지 여부를 알 수 있습니다. 나는 의도적으로 정보를 제공하는 것을 선호하지만 그저 개인적 선호 일 수도 있습니다).


답변

모든 도구에는 목적과 비전이 있습니다. iBatis는 아마도 당신에게도 좋은 해결책이지만, 나는 당신의 필요에 맞게 http://www.jooq.org/ 를 만들었습니다 .

jOOQ에는 기본 ORM 기능이 있지만, 대부분의 개발자는 자신의 요구에 가장 적합한 ORM을 찾을 때 대부분의 개발자가 가장 필요로하는 것들에 중점을 둡니다.

  • 코드 생성
  • 변수 바인딩 (JDBC의 고통)
  • SQL 구문 추상화 (구문 오류 방지)

그러나 종종 너무 멀리 가고 너무 많은 추상화를 제공하므로 RDBMS에 대해 실행되고 있다고 생각하지 않을 것입니다. 반면에 RDBMS를 정확하게 선택했기 때문에

  • 강력한 데이터 소스입니다
  • SQL은 여러 가지 우수한 성능을 발휘할 수 있습니다 (선택된 선택, 공용체, 복잡한 조인 등). ORM은 종종 이런 일을 할 수 없습니다.
  • 거래와 세션을 직접 처리 할 수 ​​있습니다
  • UDT와 저장 프로 시저가 있습니다

jOOQ는 이러한 점을 정확하게 해결합니다. JDBC만큼 성능이 좋을 것입니다.


답변

현대 소프트웨어 개발 시나리오에서 프레임 워크 사용 여부는 매우 일반적입니다.

이해해야 할 것은 모든 프레임 워크 또는 접근 방식에 장단점이 있다는 것입니다. 예를 들어 경험상 ORM이 트랜잭션을 처리 할 때 (예 : 삽입 / 업데이트 / 삭제 작업) 유용하지만 복잡한 데이터를 가져 오는 경우 결과 ORM 도구의 성능과 효과를 평가하는 것이 중요해집니다.

또한 프레임 워크 나 접근 방식을 선택하고 그 안에있는 모든 것을 구현하는 것이 의무적이지 않다는 것을 이해하는 것이 중요합니다. 우리가 의미하는 바는 ORM과 기본 쿼리 언어를 혼합하여 사용할 수 있다는 것입니다. 많은 ORM 프레임 워크는 기본 SQL에서 플러그인에 대한 확장 점을 제공합니다. 프레임 워크 나 접근 방식을 과도하게 사용해서는 안됩니다. 특정 프레임 워크 또는 접근 방식을 결합하여 적절한 솔루션을 제공 할 수 있습니다.

높은 수준의 동시성으로 삽입, 업데이트, 삭제, 버전 관리와 관련하여 ORM을 사용할 수 있으며 보고서 생성 및 긴 리스팅에 Native SQL을 사용할 수 있습니다.