[SQL] SQL을 사용 orm 또는 일반? [닫은]
SQLSQL을 사용 orm 또는 일반? [닫은]
내가 개발 한 앱의 일부를 들어, 나는 주로 MySQL을 위해, 일반 SQL을 작성했습니다 (다음에 대해 잊지 진행). 내가 SQLAlchemy의 같은 파이썬으로 ORMs을 사용하고 있지만, 나는 오랫동안 그들과 함께 스틱하지 않았다. 보통은 날 다시 잡고 (내 관점에서) 문서 또는 복잡성 중 하나였다.
나는이처럼를 참조하십시오 이동성에 대한 ORM을 사용, 그냥 데이터베이스의 한 유형을 사용하는 것 경우 일반 SQL. 난 정말 데이터베이스 지원을 필요로 응용 프로그램을 개발할 때 ORM 또는 SQL을 사용하는 경우에 대한 조언을 찾고 있어요.
그것에 대해 생각, 그것은 단지 ORM을 사용하여 대 핸들 데이터베이스 불일치에 가벼운 래퍼를 사용하는 것이 훨씬 더 좋을 것이다.
해결법
-
==============================
1.으로 ORMs 몇 가지 좋은 기능을 가지고 있습니다. 그들은 개체 필드에 데이터베이스 열을 복사하는 개 많은 작업을 처리 할 수 있습니다. 그들은 일반적으로 적절한 데이터베이스 유형으로 언어의 날짜 및 시간 형식을 변환 처리합니다. 그들은 일반적으로 중첩 된 객체를 인스턴스화하여 꽤 우아하게뿐만 아니라 일대 다 관계를 처리합니다. 당신이 마음에 ORM의 강점과 약점과 데이터베이스를 설계 할 경우 내가 찾은, 그것의 데이터베이스에서 데이터를 가져 오는에 많은 작업을 절약 할 수 있습니다. (당신은 당신이 그지도를해야하는 경우가 다형성 다 대다 관계를 처리하는 방법을 알고 싶을 것이다. 그것은 어떤 전화 ORM '컴퓨터 과학의 베트남'을 만드는 '임피던스 부정합'의 대부분을 제공하는이 두 도메인의 .)
으로 ORMs 몇 가지 좋은 기능을 가지고 있습니다. 그들은 개체 필드에 데이터베이스 열을 복사하는 개 많은 작업을 처리 할 수 있습니다. 그들은 일반적으로 적절한 데이터베이스 유형으로 언어의 날짜 및 시간 형식을 변환 처리합니다. 그들은 일반적으로 중첩 된 객체를 인스턴스화하여 꽤 우아하게뿐만 아니라 일대 다 관계를 처리합니다. 당신이 마음에 ORM의 강점과 약점과 데이터베이스를 설계 할 경우 내가 찾은, 그것의 데이터베이스에서 데이터를 가져 오는에 많은 작업을 절약 할 수 있습니다. (당신은 당신이 그지도를해야하는 경우가 다형성 다 대다 관계를 처리하는 방법을 알고 싶을 것이다. 그것은 어떤 전화 ORM '컴퓨터 과학의 베트남'을 만드는 '임피던스 부정합'의 대부분을 제공하는이 두 도메인의 .)
트랜잭션있는 응용 프로그램의 경우, 즉 일부 데이터를 얻을 수 및 웹 페이지를 렌더링하는 그들을 통과, 일부 개체를 얻을 요청을하기 위해선, 성능 세금은 소규모이며, 캐시는 그것의 객체 때문에 많은 경우에 ORM은 빠를 수 있습니다 그렇지 않으면 데이터베이스를 여러 번 조회 한 것으로, 이전에 본.
보고 무거운, 또는 요청에 따라 데이터베이스 행의 수가 많은 거래이다 애플리케이션의 경우, ORM 세금이 훨씬 무거운이며, 그들이 큰, 쓸모없는 메모리를 소모하는 부담으로 회전을하는 캐싱. 이 경우, 얇은 DAL에서 간단한 SQL 매핑 (LINQ 또는 iBatis를) 또는 손으로 코딩 SQL 쿼리를 이동하는 방법입니다.
나는 당신이 두 가지 접근 방식을 사용하여 자신을 찾을 수있는 대규모 응용 프로그램을 발견했습니다. (간단한 CRUD 및 SQL보고 / 얇은 DAL에 대한 ORM).
-
==============================
2.JPA (자바 퍼시스턴스 API, 자바 / J2EE / EJB에 대한 기본적으로 표준화 ORM의 API) 최대 절전 모드, EclipseLink가, 상단 링크,는 OpenJPA 등이 포함, 작업 꽤 많은 시간을 보낸 사람으로 말하자면, 나는 몇 가지를 공유 할 내 관찰.
JPA (자바 퍼시스턴스 API, 자바 / J2EE / EJB에 대한 기본적으로 표준화 ORM의 API) 최대 절전 모드, EclipseLink가, 상단 링크,는 OpenJPA 등이 포함, 작업 꽤 많은 시간을 보낸 사람으로 말하자면, 나는 몇 가지를 공유 할 내 관찰.
조금 더 설명을합니다 또 다른 문제가 있습니다.
웹 응용 프로그램의 전통적인 모델은 지속성 층과 프리젠 테이션 계층하는 것입니다 (아마도 서비스 나 사이에 다른 레이어를하지만이이 토론에 대한 두 중요하다). 으로 ORMs는 프리젠 테이션 계층 (예 : 귀하의 기관)에 당신의 영속 계층에서 위로 단단한보기를 강제로.
더 원시 SQL 방법의 비판 중 하나는 단순히 하나 개의 쿼리에서 사용하는 모든 VO로 (값 객체) 또는 DTO들 (데이터 전송 객체)로 끝날 것입니다. 당신이 제거하기 때문에 이것은으로 ORMs의 장점으로 선전한다.
것은 그 문제는 멀리으로 ORMs에 가지 마세요, 그들은 단순히 프리젠 테이션 레이어로 이동합니다. 대신 쿼리를 보여 주 / DTO들을 만드는, 당신은 일반적으로 모든 뷰를 사용자 정의 프리젠 테이션 오브젝트를 작성합니다. 이것은 더 나은 방법은 무엇입니까? 이럴이 없습니다.
내가 ORM 또는 SQL 이것에 대해 서면으로 작성했습니다 : 우리는 아직 있습니까?
요즘 (자바) 선택의 내 지속성 기술은 iBATIS를합니다. 그것은 (심지어는 잘 설명되지 않지만 관계의 게으른 로딩 할 수 있습니다)하지만, 훨씬 적은 오버 헤드 (복잡성과 실제 코드의 관점에서)와 JPA가 할 수있는 일의 90 % 이상을 수행 SQL 주위에 매우 얇은 래퍼입니다.
이것은 내가 쓰는 된 GWT 애플리케이션에서 지난해 내놓았다. 은 EclipseLink에서 서비스 구현의 표현 개체에 대한 번역 많아요. 우리가 사용하고있는 경우는 iBATIS를 함께 적절한 객체를 만든 다음 모든 방법까지 스택 아래를 통과 할 훨씬 간단 했 iBatis를. 일부 지지자는이 나쁜 ™입니다 주장 할 수 있습니다. 어쩌면 그래서 (이론적으로)하지만 난 당신이 무엇을 말씀 : 그것은 간단한 코드, 간단한 스택과 생산성을 주도했습니다 것입니다.
-
==============================
3.나는에 대한 일반 SQL은 CUD를 들어, ORM을 읽어 말한다.
나는에 대한 일반 SQL은 CUD를 들어, ORM을 읽어 말한다.
성능은 특별히 웹 애플리케이션에서 항상 염려하고있어 뭔가뿐만 아니라 코드의 유지 보수성 및 가독성이다. 내가 SqlBuilder을 썼다 이러한 문제를 해결합니다.
-
==============================
4.ORM은 (그 문제도 ORM들을 달성하기 다소 어려운) 바로 휴대하지 않다. 무엇 당신을 제공하는 것은 기본적으로 영구 저장소를 통해 추상화 층, ORM 툴을 쓰는 상용구 SQL 쿼리에서 해방 당신 (선택 PK하거나 조건, 삽입, 업데이트 및 삭제에 의한)과 당신이 문제 도메인에 집중 할 수 있습니다.
ORM은 (그 문제도 ORM들을 달성하기 다소 어려운) 바로 휴대하지 않다. 무엇 당신을 제공하는 것은 기본적으로 영구 저장소를 통해 추상화 층, ORM 툴을 쓰는 상용구 SQL 쿼리에서 해방 당신 (선택 PK하거나 조건, 삽입, 업데이트 및 삭제에 의한)과 당신이 문제 도메인에 집중 할 수 있습니다.
-
==============================
5.모든 존경 디자인은 임피던스 불일치를 처리하기 위해 데이터베이스에 대한 몇 가지 추상화가 필요합니다. 하지만 기대 간단한 첫 번째 단계 (대부분의 경우에 적합)는 DAL 아닌 헤비급 ORM 될 것입니다. 유일한 옵션은 스펙트럼의 끝에서 사람들이 아니다.
모든 존경 디자인은 임피던스 불일치를 처리하기 위해 데이터베이스에 대한 몇 가지 추상화가 필요합니다. 하지만 기대 간단한 첫 번째 단계 (대부분의 경우에 적합)는 DAL 아닌 헤비급 ORM 될 것입니다. 유일한 옵션은 스펙트럼의 끝에서 사람들이 아니다.
내가 ORM에서 DAL을 구별하는 방법을 설명하라고 요구하는 의견에 응답하여 편집 :
DAL은 어쩌면 단순히 테이블을 캡슐화 및 속성에 해당 필드를 매핑하는 클래스에서 시작, 직접 작성하는 것이다. ORM은 DBMS 스키마의 다른 속성, 대부분 PK와 및 FKS에서 추론은 작성하지 않는 코드 또는 추상화 메커니즘이다. (자동 추상화가 새는를 받고 여부를 시작하면 당신이 찾을 곳이다. 나는 의도적으로 그들을 알려 선호하지만 그건 그냥 내 개인적인 취향 일 수 있음).
-
==============================
6.모든 도구는 그 목적과 비전을 가지고있다. 나는 iBatis를뿐만 아니라 아마 당신을위한 좋은 솔루션이기는하지만 정확하게 사용자의 요구에 맞게 http://www.jooq.org/을 만들었습니다.
모든 도구는 그 목적과 비전을 가지고있다. 나는 iBatis를뿐만 아니라 아마 당신을위한 좋은 솔루션이기는하지만 정확하게 사용자의 요구에 맞게 http://www.jooq.org/을 만들었습니다.
jOOQ 기본 ORM 기능을 가지고 있지만, 주로 내가 자신의 요구에 가장 적합한 ORM을 찾기 위해 시도 할 때 대부분의 개발자들이 가장 필요로 생각하는 것들에 초점을 맞추고 있습니다 :
그러나 종종 너무 멀리 가서 너무 많은 추상화를 제공, 당신은 그들이 RDBMS에 대해 실행하고 생각하지 않을 것입니다. 다른 한편으로는, 당신은 정확하게 때문에 RDBMS를 선택
jOOQ 정확히 이러한 점을 해결합니다. 그것은 JDBC뿐만 아니라 수행하지만, 통증이없는 것입니다.
-
==============================
7.내 ORM 사용을 만든 열쇠는 정말 비행 코드 생성했다. 나는 ORM 경로 코드 성능 측면에서 가장 빠른 아니라는 것을 동의합니다. 그러나 만약 당신이 큰 팀 매체를 가질 때 DB 빌드 프로세스의 한 부분으로 빠르게 DB에서 중생 클래스와 매핑 할 수있는 능력을 변화하는 것은 보라에 빛나는 무언가는 CI를 사용, 특히이다. 코드가 가장 빠른되지 않을 수도 있습니다,하지만 당신이 될 것입니다 코딩 그래서 - 나는 대부분의 프로젝트에 걸릴 줄 알고.
내 ORM 사용을 만든 열쇠는 정말 비행 코드 생성했다. 나는 ORM 경로 코드 성능 측면에서 가장 빠른 아니라는 것을 동의합니다. 그러나 만약 당신이 큰 팀 매체를 가질 때 DB 빌드 프로세스의 한 부분으로 빠르게 DB에서 중생 클래스와 매핑 할 수있는 능력을 변화하는 것은 보라에 빛나는 무언가는 CI를 사용, 특히이다. 코드가 가장 빠른되지 않을 수도 있습니다,하지만 당신이 될 것입니다 코딩 그래서 - 나는 대부분의 프로젝트에 걸릴 줄 알고.
내 추천, 스키마는 여전히 유동적입니다 동안 ORM을 사용하여 개발 병목 현상을 찾기 위해 프로파일 사용하는 것입니다, 다음 조정 원시 SQL을 사용하여 그것을 필요로하는 분야.
올바른 방법으로 사용하면 또 다른 생각은, 최대 절전 모드에 내장 된 캐시는 종종 엄청난 성능 향상을 할 수 있습니다. 더 이상 참조 데이터를 읽어 다시 DB에 가고 없다.
-
==============================
8.프레임 워크를 사용할지 여부 딜레마는 현대의 소프트웨어 개발 시나리오에서 매우 일반적입니다.
프레임 워크를 사용할지 여부 딜레마는 현대의 소프트웨어 개발 시나리오에서 매우 일반적입니다.
무엇 이해하는 것이 중요한 것은 모든 프레임 워크 또는 접근 방식은 장단점을 가지고 있다는 것입니다 - 우리의 경험에서 예를 들어 우리가 거래를 처리 할 때 ORM 유용한 것으로 나타났습니다 삽입 / 업데이트 / 삭제 작업을 즉 -하지만이 때 복잡하여 데이터를 가져 오기 위해 그것은 ORM 도구의 성능과 효과를 평가하는 것이 중요하게 발생합니다.
또한 프레임 워크 또는 접근 방식을 선택하고 그 모든 것을 구현하는 필수 아니라는 것을 이해하는 것이 중요합니다. 우리가 의미하는 것은 우리가 ORM의 혼합 및 기본 쿼리 언어를 가질 수있다. 대부분의 ORM 프레임 워크는 네이티브 SQL에 플러그인에 확장 점을 제공합니다. 우리는 이상의 프레임 워크 또는 방법을 사용하지 않으려 고한다. 우리는 특정 프레임 워크를 결합하거나 접근하고 적절한 솔루션을 제공 할 수 있습니다.
그것은 삽입, 그 갱신, 삭제에 올 때 당신은 동시성의 높은 수준의 버전, ORM을 사용할 수 있으며 보고서 작성과 긴 목록에 대한 네이티브 SQL을 사용할 수 있습니다
-
==============================
9.아무 '하나의 도구 만능'해결책은 없다,이 또한 문제 '내가 나 / m를 사용하거나해서는 안 마찬가지입니다? '.
아무 '하나의 도구 만능'해결책은 없다,이 또한 문제 '내가 나 / m를 사용하거나해서는 안 마찬가지입니다? '.
내가 말할 것이다 : 당신은 많은 다른 논리없이 초점을 맞춘 매우 '데이터'입니다 응용 프로그램 / 도구를 작성하는 경우, SQL 응용 프로그램의 이러한 종류의 도메인 특정 언어이기 때문에 그때는 '일반 SQL을 사용하는 거라고.
나는 '도메인'많은 로직을 포함하는 비즈니스 / 기업 응용 프로그램을 작성하는 것이었다 경우 반면에, 나는 코드에서이 도메인을 표현할 수있는 풍부한 클래스 모델을 쓸 것입니다. 이 경우,에서, OR / M 매퍼은 당신의 손에서 배관의 코드를 많이 필요로 성공적으로 이렇게하는 것이 매우 도움이 될 수 있습니다.
-
==============================
10.이 질문은 아주 오래 알고 있지만, 나는 누군가가 나처럼 우연히 만나는 경우에 내가 대답을 게시 할 것이라고 생각했다. 으로 ORMs는 먼 길을왔다. 개발 생산성을 만들고 성능을 유지 : 그들 중 일부는 실제로 당신에게 두 세계의 최고를 제공합니다.
이 질문은 아주 오래 알고 있지만, 나는 누군가가 나처럼 우연히 만나는 경우에 내가 대답을 게시 할 것이라고 생각했다. 으로 ORMs는 먼 길을왔다. 개발 생산성을 만들고 성능을 유지 : 그들 중 일부는 실제로 당신에게 두 세계의 최고를 제공합니다.
SQL 데이터 (http://sqldata.codeplex.com)를 살펴 보자. 그것은 모든 기반을 커버 C #을위한 매우 가벼운 무게 ORM이다.
참고로, 저는 SQL 데이터의 저자입니다.
-
==============================
11.내가 개발 한 앱 중 하나는 파이썬으로 작성된 IRC 봇이었다. 이 모듈은 별도의 스레드에서 실행 사용합니다,하지만 난이 sqlite를 사용하는 경우 스레딩 처리 할 수있는 방법을 생각하지 않았습니다. 비록, 즉 별도의 질문이 더 나은 수 있습니다.
내가 개발 한 앱 중 하나는 파이썬으로 작성된 IRC 봇이었다. 이 모듈은 별도의 스레드에서 실행 사용합니다,하지만 난이 sqlite를 사용하는 경우 스레딩 처리 할 수있는 방법을 생각하지 않았습니다. 비록, 즉 별도의 질문이 더 나은 수 있습니다.
나는 정말 제목과 실제 질문을 모두 재 진술해야합니다. 사실 어떤 언어로, 전에 DAL을 사용한 적이 없으니까.
-
==============================
12.SQL 같은 작품 있다는 ORM을 사용하지만 컴파일시 검사와 형식 안전성을 제공합니다. 나의 마음에 드는처럼 : (: 나는 그것을 쓴 공개) 데이터 지식은 개체
SQL 같은 작품 있다는 ORM을 사용하지만 컴파일시 검사와 형식 안전성을 제공합니다. 나의 마음에 드는처럼 : (: 나는 그것을 쓴 공개) 데이터 지식은 개체
예를 들면 :
for (Bug bug : Bug.ALL.limit(100)) { int id = bug.getId(); String title = bug.getTitle(); System.out.println(id +" "+ title); }
완전 스트리밍. 쉬운 설정하는 (어떤 매핑이 정의 없음 - 기존의 스키마를 읽습니다). 지원은, 거래, 내부 쿼리, 집계, 당신은 SQL에서 할 수있는 등 거의 아무것도 합류했다. 그리고 모든 방법 사소한 (안드로이드)에 이르기까지 거대한 데이터 세트 (금융 시계열)에서 입증되었습니다.
-
==============================
13.내가 말할 응답의 합창에 내 목소리를 추가하고 싶습니다 "중용이있다!".
내가 말할 응답의 합창에 내 목소리를 추가하고 싶습니다 "중용이있다!".
어플리케이션 프로그래머에, SQL은 거의 확실하게 제어 방해하지 않으려는 사용자가 제어 할 수 있습니다 사물과 사물의 혼합물이다.
내가 원했던 것은 층 괄호가 어디로 (방법, SQL 키워드 철자를 완전히 예측 가능한 의사 결정을 맡아 것이다 (DAL, ORM, 또는 마이크로 ORM 호출, 난 상관 없어에게)이며, 경우 는 SQL의 높은 수준의 측면을 담당 나를 떠나있는 동안 열 별칭을 발명, 두 개의 수레와 int를 ...) 보유 클래스의 어떤 열을 만드는, 즉 조인, 서버 측의 계산을 준비하는 방법 특색있는, 그룹 총격 사건, 스칼라 서브 쿼리 등
내가 뭔가를 썼다 그래서이 작업을 수행한다 : http://quince-lib.com/
그것은 C ++를위한이다 : 나는 당신이 사용하고있는 언어가인지 모르겠지만, 모두 같은 "중간"이 같이 수 있는지에 대한이 걸릴를 보는 것도 흥미로울 수 있습니다.
from https://stackoverflow.com/questions/494816/using-an-orm-or-plain-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 는 SQL에서 위해 물질을 결합 하는가? (0) | 2020.03.17 |
---|---|
[SQL] SQL 서버 - INSERT 후 반환 값 (0) | 2020.03.17 |
[SQL] 행에서 쉼표로 구분 된 문자열을 얻을 [중복] (0) | 2020.03.17 |
[SQL] VARCHAR2와 문자 사이의 주요 차이점은 무엇입니까 (0) | 2020.03.17 |
[SQL] 오라클 SQL 쿼리 : 시간을 기준으로 그룹 별 최신 값을 검색 [중복] (0) | 2020.03.16 |