Doctrine 2 또는 Propel 1.5 / 1.6을 선택해야하는 이유는 무엇입니까? [닫은]


30

Doctrine 2 (이상) 및 Propel 1.5 (이상)를 사용한 사람들의 의견을 듣고 싶습니다. 이 두 객체 관계형 매퍼 간의 대부분의 비교는 이전 버전 인 Doctrine 1과 Propel 1.3 / 1.4를 기반으로하며, 두 ORM 모두 최근 개정에서 상당한 재 설계를 거쳤습니다. 예를 들어, Propel에 대한 대부분의 비판은 "ModelName Peer "클래스 를 중심으로하는 것으로 보이며 ,이 클래스는 1.5에서 더 이상 사용되지 않습니다.

여기까지 내가 지금까지 축적 한 것이 있습니다 (그리고 나는이 목록을 가능한 한 균형있게 만들려고 노력했습니다 ...) :

  • 추진
    • 찬성
      • PHP 매직 메소드에 의존하지 않고 실제 코드가 생성되므로 IDE에 매우 친숙합니다. 이것은 코드 완성 과 같은 IDE 기능 이 실제로 유용 하다는 것을 의미 합니다.
      • 빠름 (데이터베이스 사용 측면에서-데이터베이스에서 런타임 검사가 수행되지 않음)
      • 스키마 버전 간 클린 마이그레이션 (최소 1.6 베타 버전)
      • PHP 5.3 모델 (예 : 네임 스페이스)을 생성 할 수 있습니다
      • useXxx메소드 와 같은 것을 사용하여 많은 것을 단일 데이터베이스 쿼리로 쉽게 연결할 수 있습니다. (위의 "코드 완성"비디오 ​​참조)
    • 단점
      • 추가 빌드 단계, 즉 모델 클래스 빌드가 필요합니다.
      • Propel 버전이 변경되거나 설정이 변경되거나 스키마가 변경 될 때마다 생성 된 코드를 다시 작성해야합니다. 이것은 직관적이지 않을 수 있으며 모델에 적용된 사용자 정의 방법이 손실됩니다. (생각합니까?) -사실이 아닙니다. 생성 된 클래스가 기본 클래스이기 때문에 사용자 정의 메소드가 손실되지 않습니다. Propel은 확장을 위해 특별히 엔티티 클래스를 제공합니다.
      • 유용한 기능 (예 : 버전 동작, 스키마 마이그레이션)은 베타 상태입니다.
  • 교의
    • 찬성
      • 인기가 더 많은
      • Doctrine Query Language는 Propel의 ActiveRecord 전략으로 가능한 것보다 데이터 간의 복잡한 관계를 표현할 수 있습니다.
      • Propel과 비교할 때 재사용 가능한 동작을 쉽게 추가 할 수 있습니다.
      • 스키마를 빌드하기위한 DocBlock 기반 주석은 별도의 XML 파일 대신 실제 PHP에 포함됩니다.
      • 어디서나 PHP 5.3 네임 스페이스 사용
    • 단점
      • 완전히 새로운 프로그래밍 언어를 학습해야 함 (교리 쿼리 언어)
      • 여러 위치에서 "마법 방법"이라는 측면에서 구현되어 IDE 자동 완성 기능을 무가치하게 만듭니다.
      • 데이터베이스 검사가 필요하므로 기본적으로 Propel보다 약간 느립니다. 캐싱은이를 제거 할 수 있지만 캐싱은 상당히 복잡합니다.
      • 핵심 코드베이스에는 동작이 더 적습니다. Propel에서 제공하는 여러 기능 (예 : Nested Set)은 확장을 통해서만 사용할 수 있습니다.
      • Freakin 'HUGE :)

나는 두 도구 모두에 대한 문서를 읽음으로써 만 수집했지만 실제로는 아직 아무것도 만들지 않았습니다.

두 도구를 모두 사용하고 각 라이브러리의 장단점에 대한 경험을 공유 하고이 시점에서 권장 사항을 공유하는 사람들의 의견을 듣고 싶습니다. :)


어떤 버전의 교리를 이야기하고 있습니까? v2와 v1.2는 극점입니다.
Orbling

1
@Orbling : 질문의 제목이나 본문을 읽었습니까? 다시 읽어보십시오 :)
Billy ONeal

@ 빌리 ONeal : 좋은 지적. Doctrine2는 Core에서 동작이 거의 완전히 제거되었으므로 v1.2에 대해 이야기하고 있다고 생각했습니다.
Orbling

@Orbling : 아, 그건 말이됩니다. 반면에 "행동"과 동등한 기능을 제공합니다. 단지 그것들을 호출하지는 않습니다.
Billy ONeal

@Billy ONeal : 실제로는 쉬운 일이 아니며 직접 구현하거나 타사 플러그인을 얻을 수있는 것은 아닙니다. 그러나 그것은 Doctrine1이나 Propel과는 다릅니다.
Orbling

답변:


15

교리를 추천하기 위해 현재의 추세를 무시하고, 나는 달리 말해야합니다. 또한 개인 취향은 개인 경험에 중점을 두지 만 @Dan이 말한 것처럼 둘 다 매우 강력합니다.

난 당신이 크기와 있습니다 꼬추 전체 마법의 방법처럼, 앞서 언급하는 이유 중 몇 가지에 대한 교리 좋아하지 않아 거래 차단기를 나와 함께. 그래서 왜 Propel을 사용 합니까? 주로 소프트웨어 개발에서 간단한은 그것의 단순하고 있기 때문에 좋은 . 내 개인적인 생각은 디자인에 욕심이 나쁘다는 것입니다.

Propel을 사용하여 필자는 자체 시스템에 대한 리포지토리 패턴 구현을 구현했으며 실제로 가장 빠른 ORM 중 하나 인 Propel의 성능은 말할 것도 없습니다.

그래서 내 기본 답변은 Propel입니다 . 코드 가 적 으면서 좋은 소프트웨어 를 구현하고 데이터베이스에 연결하는 ORM 소프트웨어의 요점을 잃지 않고 IDE에 좋은 인텔리전스를 제공 할 수 있도록 IDE에 권한을 부여합니다.

내가 도울 수 있기를 바랍니다


나는 1 년간 교리를 사용하고있었습니다. 나는 게라와 세터를 정말 싫어하기 때문에 Kohana, Laravel Eloquent를 시도했습니다. Propel에서 'IDE friendly'라는 단어를 본 후 오늘 밤 Propel을 사용하기로했습니다.
Zorji

11

Doctrine 2에 대한 귀하의 정보가 잘못되었습니다 ...

  • DQL은 거의 SQL이므로 배울 것이 많지 않습니다.
  • Doctrine 2는 '마법'을 사용하지 않습니다 (최신 PHP 라이브러리에서 기대되는 것만).
  • Doctrine 2는 적극적으로 데이터베이스 내부 검사를 수행하지 않습니다 ... 매핑은 엔티티 / 매핑 파일에 저장되며 데이터베이스가 그에 적합하다고 가정합니다.
  • 캐싱은 '상당한 복잡성'이 아닙니다.
  • 교리 2에는 기본적으로 '행동'이 없습니다

필자는 이전에 Propel을 사용하지 않았지만 Doctrine 2는 훨씬 새롭고 고품질 코드베이스를 가지고 있습니다. 그러나 Propel은 Active Record를 사용하고 Doctrine 2는 Data Mapper 패턴을 사용하는 것처럼 보입니다.

Doctrine 2의 최신 단점은 타사 예제가 부족하지만 빠르게 구축되고 있다는 것입니다.

나는 교리 2를 추천한다 ...


당신이 전에 Propel을 사용하지 않았다면 나는 FUD이기 때문에 이것을 내려 놓을 수밖에 없습니다. 은 "매직"코멘트에 관해서는, 무슨 뜻이 같은 PHP 마술 방법을 기반으로한다는 것입니다 __get하고 __set(사실입니다) 오히려 실제 방법보다.
Billy ONeal

1
다운 투표에 대해 알겠습니다 ... 그러나 Doctrine 2는 어디에서 마술 방법을 사용합니까? DocumentRepository의 find * 메소드 (__call)를 제외하고는 더 좋은 쿼리 방법이기 때문에 문제가되지 않습니다. 항상 IDE 자동 완성 기능을 잃게됩니다. ActiveRecord를 원한다면 Propel을 사용하십시오. Data Mapper를 원하면 Doctrine 2를 사용하십시오.
Cobby

2
코드 생성 덕분에 Propel은 런타임에 데이터베이스를 검사하지 않습니다.
William Durand

글 머리 기호 항목 # 1이 완전히 올바르지는 않습니다. DQL은 SQL과 같이 "거의"아닙니다. DQL은 Doctrine이 알고 있어야하는 모델 객체를 참조하고 있다는 사실과 더 복잡한 조인이 필요한 경우 몇 가지 복잡한 문제가 있습니다.
Mike Purcell

2
DQL은 SQL의 방언입니다. 어떻게 SQL과 같이 "거의"만들지 않습니까? 그렇습니다. 언어의 의미는 약간 다릅니다 (객체 대 테이블). 그러나 궁극적으로 DQL은 구조적 데이터를 쿼리하기위한 언어입니다.
코비

3

귀하의 의견으로는 레거시 응용 프로그램에서 ORM에 대한 요구를 대체하거나 이행하기 위해 Propel 또는 Doctrine을 선택하려고하는 것처럼 들립니다.

즉, 둘 중 하나로 옮기는 것이 응용 프로그램을 크게 향상시킬 수 있다는 사실을 놓치지 않는 것이 중요하다고 생각합니다. 따라서 잘못된 답은 없습니다.

따라서 선택한 솔루션은 다음 질문에 대한 답변을 바탕으로 기본 설정에 따라 다릅니다.

  1. 현재 솔루션에 가장 적합한 솔루션은 무엇입니까?
  2. 어떤 API를 선호하십니까?
  3. 어느쪽에 공헌 하시겠습니까? (패치, 문서, 버그 보고서 등)

개인적으로 Doctrine 2 는 커뮤니티, 문서 및 아키텍처 때문에 권장 합니다.


1
그래도 그들 사이의 비교를 찾고 있습니다. (어떤 것을 중요하게 생각하고 싶은가? 나는 그들 중 누구에게도 기여하고 싶지 않다. 나는 라이브러리를 쓰고 싶지 않다!;)). Doctrine 2는 훌륭한 커뮤니티, 문서 및 아키텍처를 가지고 있으며 아키텍처 측면에서는 DataMapper입니다. 문서 현명한 나는 동의하지 않습니다-두 프로젝트 모두 좋은 문서를 가지고있는 것 같습니다. 어느 시스템을 사용하는 커뮤니티도 많이 보지 못했습니다. 이러한 것들의 의미에 대해 자세히 설명 하시겠습니까?
Billy ONeal

2
오, 당신은 교리 의사를 좋아합니까? 당신은 프로 펠 하나를 읽었습니까? 예, Doctrine 커뮤니티는 훌륭하지만 ODM 저장소를 살펴보십시오. 많은 PR은 주석을 달거나 병합하거나 거부하지도 않습니다. Propel 타임 라인을 살펴보면 커뮤니티가 실제로 활성화됩니다.)
William Durand

3

Propel은 잘 통합되어 있고 빠르며 강력하기 때문에 추천합니다. 런타임에 클래스를로드하는 것보다 코드를 생성하는 것이 좋습니다. 디버그 단계가 쉬워지고 생성 한 내용이 표시됩니다. 따라서 빌드 단계는 문제가되지 않습니다.

Doctrine2에는 공식적인 동작이 없으며 DataMapper 디자인 패턴은 멋지지만 실생활에서 사용하기는 어렵습니다. 아, 그리고 DQL은 고통 스럽지만 배우는 언어는 이상하다.

객체로 생각하고 싶다면 (DQL / SQL / 무엇이든) Propel을 선택하십시오.

Doctrine2는 실제로 Symfony2의 일부이지만 상황은 곧 바뀔 것입니다. 마지막 Fabien Potencier 기사를보십시오.

건배, 윌리엄


, 나는 2 년 전에 symfony1로 Propel을 시작했습니다. 그런 다음 symfony2를 위해 Doctrine2로 전환해야했습니다. Propel.Cheers로 돌아가서 반갑습니다!
Bhanu Krishnan 5

2

둘 다 아주 좋습니다. 하나는 다른 것보다 무언가를 할 수 있거나 더 나은 것을 할 수있는 몇 가지 경우가 있습니다. 어느 쪽이든 문제가 발생한 곳은 그들이 할 수 없었던 것보다 지식이 부족했기 때문입니다.

이는 코드의 고유 기능보다 문서 및 지원이 더 중요하다는 것을 의미합니다. 문제가 생길 때 도와 줄 사람이 있습니까? 설명서를 얼마나 잘 사용하십니까? 그들 중 하나가 yoU에 더 자연스러운 느낌을 줍니까?


2

대규모 레거시 mysql 응용 프로그램 (200 테이블 정도)에 Propel 1.63을 선택했습니다. 여기에 포함 된 요소는 다음과 같습니다. 새로운 개발자가 코드 완성으로 쉽게 길을 찾을 수있는 IDE 지원; 데이터베이스 간 스키마 지원, 성능; 열거 형에 대한 더 나은 기본 지원 및 여러 동작 사용. 실제로 Doctrine은 Symfony2가 가장 잘 지원했기 때문에 시작했지만 Propel이 Symfony에 대한 지원을 크게 개선하면 (다음에 마이그레이션 할 플랫폼) 위의 문제를 잘 처리하여 전환했습니다. 모든 프로 펠이 후회하지는 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.