언제 Perl의 DBIx :: Class를 사용해야합니까?


17

DBIx :: ClassDBI 를 통해 연결할 수있는 모든 데이터베이스에 널리 사용되는 Perl 인터페이스 입니다. 기술적 인 세부 사항에 대한 좋은 문서가 있지만 원하지 않는 상황을 포함하여 올바른 사용법에 대한 정보는 부족합니다.

많은 상황에서 사람들은 데이터베이스와 관련된 모든 것에 사용해야한다고 생각하기 때문에 재귀 적으로 접근합니다. 그러나 나는 그것이 종종 고통의 지점이되는 지점까지 오용되는 것을 보았습니다. 코드 및 아키텍처 검토 중 제 질문은 항상 "Foo가 제공하는 이점은 무엇입니까?"입니다. 대부분 이러한 상황에서 내가 본 개발자는 이에 대한 일관된 답변을 얻을 수 없습니다. 그러나 그들은 종종 간단한 SQL을 이해하지 못합니다.

지난 몇 달 동안 사람들에게 "왜 DBIx :: Class를 사용합니까?" 단 하나의 좋은 답변을 받았습니다 (그리고 그 사람은 "사용하지 않을 때"에 대한 후속 조치에도 답변 할 수있었습니다). 수석 개발자 인 피터 래빗 슨 (Peter Rabbitson)은 FLOSS Weekly 에 대한 인터뷰에서 답을 얻었 지만 인터뷰 도중에 조금 묻혔습니다.

그렇다면 DBIx :: Class 사용이 프로젝트에 적합한 지 어떻게 결정할 수 있습니까?


3
다른 책을 쓰고 있습니까? :)
simbabque

1
내 경험상 DBIC가 과잉 상태 인 상황에서 DBIC가 사용될 때 고통이옵니다. 또한 매우 강력 함에도 불구하고 사람들은 기본 기능 (SQL 생성 및 조인) 만 사용하고 다른 기능은 필요하지 않기 때문에 종종 과도합니다. 그렇기 때문에 기본 기능을 제공하고 스키마를 하드 코딩 할 필요가없는 DBIx :: Lite를 작성했습니다.
Alessandro

답변:


24

질문에 대답하기 전에 몇 가지 배경 지식이 있다고 생각합니다.

문제의 핵심

수년간 개발자를 인터뷰하고 고용 한 후 두 가지를 배웠습니다.

  1. 대다수의 개발자는 데이터베이스 디자인 경험이 거의 없습니다.

  2. 나는 데이터베이스를 이해하지 못하는 사람들과 ORM을 싫어하는 사람들 사이 의 느슨한 상관 관계를 발견했습니다 .

(참고 : 예, ORM을 싫어하는 데이터베이스를 잘 이해하는 사람들이 있다는 것을 알고 있습니다)

사람들은 당신이에 제조업체 이름을 포함하지 않는 이유 외래 키가 중요한 이유를 이해하지 않는 경우 item테이블, 또는 왜 customer.address1, customer.address2그리고 customer.address3필드 쓰기 데이터베이스 버그에 대한보다 쉽게하기 위해 ORM을 추가, 좋은 아이디어 없습니다 아무것도 도와주지 않을 것입니다.

대신 적절하게 설계된 데이터베이스와 OLTP 사용 사례를 사용하여 ORM은 황금색입니다. 많은 작업 이 사라지고 DBIx :: Class :: Schema :: Loader 와 같은 도구 를 사용하면 몇 분 만에 훌륭한 데이터베이스 스키마에서 작동하는 Perl 코드로 이동할 수 있습니다. 파레토 규칙을 인용하고 내 문제의 80 %가 20 %의 작업으로 해결되었다고 말하지만 실제로는 그보다 더 큰 이점이 있습니다.

솔루션 남용

일부 사람들이 ORM을 싫어하는 또 다른 이유는 추상화 유출을 허용하기 때문입니다. MVC 웹 앱의 일반적인 경우를 고려해 봅시다. 다음은 우리가 일반적으로 볼 수있는 것입니다 (의사 코드).

GET '/countries/offices/$company' => sub {
    my ( $app, $company_slug ) = @_;
    my $company = $app->model('Company')->find({ slug => $company_slug }) 
      or $app->redirect('/');
    my $countries = $app->model('Countries')->search(
     {
         'company.company_id' => $company->company_id,
     },
     {
         join     => [ offices => 'company' ],
         order_by => 'me.name',
     },
   );
   $app->stash({
     company   => $company,
     countries => $country,
   });
}

사람들은 이와 같은 컨트롤러 경로를 작성하고 뒷면에 ​​자신을 두드려서 깨끗하고 깔끔한 코드라고 생각합니다. 컨트롤러에서 SQL을 하드 코딩하는 데는 놀랍지 만 다른 SQL 구문을 노출시키는 것 이상은 거의 수행하지 않았습니다. ORM 코드는 모델로 푸시 다운해야하며 다음과 같이 할 수 있습니다.

GET '/countries/offices/$company' => sub {
   my ( $app, $company_slug ) = @_;
   my $result = $app->model('Company')->countries($company_slug)
     or $app->redirect('/');
   $app->stash({ result => $result });
}

지금 무슨 일이 있었는지 알아? 모델을 올바르게 캡슐화하고 ORM을 노출하지 않았으며 나중에 데이터베이스 대신 캐시에서 해당 데이터를 가져올 수있는 경우 컨트롤러 코드를 변경할 필요가 없습니다. 테스트를 작성하고 로직을 재사용하기 위해).

실제로 사람들은 자신의 컨트롤러 (및 뷰) 전체에서 ORM 코드를 유출하고 확장 성 문제에 부딪 치면 아키텍처가 아니라 ORM을 비난하기 시작합니다. ORM은 나쁜 랩을 얻습니다 (많은 고객에게 반복적으로 봅니다). 대신, ORM 한계에 도달했을 때 코드를 ORM에 너무 밀접하게 연결하지 않고 문제에 대한 적절한 솔루션을 선택할 수 있도록 추상화를 숨기십시오.

보고 및 기타 제한

Rob Kinyon이 위에서 분명히 밝힌 바와 같이,보고는 ORM에서 약한 경향이 있습니다. 이는 여러 테이블에 걸쳐있는 복잡한 SQL 또는 SQL이 ORM에서 제대로 작동하지 않는 더 큰 문제의 하위 집합입니다. 예를 들어, ORM은 때때로 원하지 않는 조인 유형을 강제하고이를 수정하는 방법을 알 수없는 경우가 있습니다. 또는 MySQL에서 색인 힌트사용하고 싶지만 쉽지 않습니다 . 또는 때로는 SQL이 너무 복잡하여 제공된 추상화 대신 SQL을 작성하는 것이 더 좋을 수도 있습니다.

이것이 DBIx :: Class :: Report 작성을 시작한 이유 중 일부입니다 . 지금까지는 잘 작동하고 사람들이 여기에서 가지고있는 대부분의 문제를 해결합니다 (읽기 전용 인터페이스로 괜찮다면). 그리고 목발처럼 보이지만 실제로는 이전 섹션에서 설명한 것처럼 추상화를 유출하지 않는 한 DBIx::Class더 쉽게 작업 할 수 있습니다.

그렇다면 언제 DBIx :: Class를 선택하겠습니까?

나를 위해 데이터베이스에 대한 인터페이스가 필요한 대부분 의 시간을 선택했습니다 . 나는 몇 년 동안 그것을 사용 해왔다. 그러나 나는 OLAP 시스템을 위해 그것을 선택하지 않을 수도 있으며, 새로운 프로그래머는 확실히 그것을 고투 할 것입니다. 또한 메타 프로그래밍이 필요한 경우가 많으며 DBIx::Class도구 를 제공하는 동안 문서화가 잘되어 있지 않습니다.

DBIx::Class올바르게 사용하는 열쇠 는 대부분의 ORM과 동일합니다.

  1. 추상화를 누설하지 마십시오.

  2. 저주받은 테스트를 작성하십시오.

  3. 필요에 따라 SQL로 드롭 다운하는 방법을 알고 있습니다.

  4. 데이터베이스를 정규화하는 방법을 배웁니다.

DBIx::Class, 일단 배운 후에는 대부분의 어려운 작업을 처리하고 응용 프로그램을 빠르게 작성할 수 있습니다.


1
사용하지 않을 때 다른 목록을 추가 할 수 있습니다. :)
brian d foy 2018

1
이것은 (내가에 년 동안 한 말을 많은 독자들에게 분명하지 아마 당신에게 분명하지만입니다 #dbix-class#catalyst참조) - "추상화를 누설하지 않는다"비트의 열쇠는 당신이 DBIC에서 작업하고 매일 일이 있다는 것이다 쿠키 커터 동작을 제공하는 서브 클래스 서브 클래스에 메소드를 추가하는 것이 좋습니다. Q & D 작업을 수행하지 않는 한, 작성한 메소드 만이 공용 인터페이스의 일부 여야합니다.
hobbs December

@ hobbs : 사실, 사람들이 이것에 가장 잘못 가고있는 것을 보았고 그것이 DBIC에 갇히는 방법입니다. 우리는 종종 사람들이 자신이하는 일을 작은 곳에서 알고 있다고 생각하지만 그렇지 않은 곳에서는 크게 알아냅니다.
brian d foy

9

무언가를 언제 사용해야하는지 알기 위해서는 물건의 목적이 무엇인지 이해하는 것이 중요합니다. 제품의 목표는 무엇입니까?

DBIx :: Class는 ORM-Object-Relational Mapper입니다. ORM은 관계형 / 집합 기반 관계형 데이터베이스 데이터 구조를 가져 와서 오브젝트 트리에 맵핑합니다. 전통적인 매핑은 테이블의 구조를 클래스 설명으로 사용하여 행당 하나의 객체입니다. 데이터베이스의 부모-자식 관계는 개체 간의 컨테이너 관계로 취급됩니다.

그것이 핵심입니다. 그러나 ORM을 사용해야하는지 결정하는 데 도움이되지 않습니다. ORM은 주로 다음과 같은 경우에 유용합니다.

  • 관계형 데이터베이스를 사용합니다.
  • 귀하의 데이터는 주로 OLTP (Online Transaction Processing)에 사용됩니다.
  • 응용 프로그램 내에 보고서를 쓰지 않습니다.

ORM이 가진 가장 큰 장점은 관계형 데이터 구조 위에 겹쳐진 트리 그래프를 표시하기 위해 좋은 SQL을 구성하는 것입니다. SQL은 종종 털이 많고 복잡하지만 임피던스 불일치를 관리하는 가격입니다.

ORM은 행 추출 SQL을 작성하는 데 능숙하지만 데이터 정렬 SQL을 작성하는 데는 매우 부족합니다. 보고서가 작성되는 SQL 유형입니다. 이러한 종류의 데이터 정렬은 ORM이 아닌 다른 도구를 사용하여 작성됩니다.

Perl에는 여러 언어로 된 ORM이 여러 개 있습니다. 다른 맵퍼는 Class :: DBI 및 Rose :: DB입니다. DBIx :: Class는 종종 결과 세트의 강점에서 다른 클래스보다 더 나은 것으로 간주됩니다. 이것은 SQL 생성이 SQL 실행과 분리되는 개념입니다.


업데이트 : Ovid에 대한 응답으로 DBIx :: Class (SQL :: Abstract를 통해)는 반환 할 열과 사용할 인덱스 힌트를 모두 지정할 수있는 기능을 제공합니다.

그러나 일반적으로이 작업을 수행하려는 경우 해당 특정 쿼리에 ORM을 사용하지 않는 것이 좋습니다. ORM의 주요 목적은 테이블의 행을 속성이 테이블의 열인 클래스의 오브젝트에 맵핑하는 것입니다. 일부 속성 만 채우는 경우 해당 개체의 잠재적 사용자는 어떤 속성이 채워 졌는지 알 수 없습니다. 이것은 끔찍한 방어 프로그래밍 및 / 또는 ORM에 대한 일반적인 증오로 이어집니다.

거의 항상 인덱스 힌트를 사용하거나 반환되는 열을 제한하려는 것은 속도 최적화 및 / 또는 집계 쿼리입니다.

  • 집계 쿼리는 ORM이 설계 되지 않은 사용 사례 입니다. DBIx :: Class는 집계 쿼리를 작성할 수 있지만 오브젝트 그래프는 작성하지 않으므로 DBI를 직접 사용하십시오.
  • 쿼리되는 데이터가 액세스 방식에 관계없이 기본 데이터베이스에 비해 너무 크기 때문에 성능 최적화가 사용됩니다. 대부분의 관계형 데이터베이스는 대부분의 데이터 + 표시가 RAM에 맞는 SSD에서 최대 1-3MM 행이 실행되는 테이블에 이상적입니다. 상황이 이보다 큰 경우 모든 관계형 데이터베이스에 문제가 있습니다.

그렇습니다. 훌륭한 DBA는 Oracle 또는 SQL * Server에서 100MM + 행을 가진 테이블을 작동시킬 수 있습니다. 이 글을 읽고 있다면 훌륭한 DBA 직원이 없습니다.

이 모든 것이 좋은 ORM은 단순히 객체 그래프를 만드는 것 이상을 의미합니다. 또한 데이터베이스에 대한 내관적인 정의를 제공합니다. 이를 사용하여 오브젝트 그래프를 작성하지 않고 임시 조회를 작성하고 DBI에서와 같이 소비 할 수 있습니다.


나는 내가 보는 거의 모든 것이 보고서를 작성한다고 생각하기 때문에 사람들이 수동 쿼리로 드롭 해야하는 이유 일 것입니다.
brian d foy

1
보고서에 대한 수동 쿼리로 드롭 다운해야하는 이유를 모르겠습니다. DBIC을 사용하여 매우 복잡한 보고서를 작성했습니다. 물론, 종종 '프리 페치'와 '조인'을 많이 사용하여 대규모 맞춤형 결과 집합을 구축해야합니다.
Dave Cross

Dave : 수동 SQL을 작성하는 것이 훨씬 쉬울 수 있으며 3 개의 테이블에서 필요한 7 개의 필드 만 가져 와서 단일 행으로 표시 할 수 있습니다. 또한 원시 SQL을 작성할 때 힌트를 제공하기가 훨씬 쉽습니다.
커티스 포

> 필요한 7 개의 필드 만 가져 오려면 ResultSet 검색에 "열"속성이 사용됩니다. 원시 SQL을 수행하기 위해 들었거나 본 유일한 유효한 인수는 다음과 같습니다. 1. 일반적으로 잘못 설계된 테이블 / DB의 결과 인 매우 복잡한 하위 쿼리 2. DBDL이 아닌 DDL 또는 기타 'do'작업 실행 실제로 만들어지지 않았습니다. 3. 색인 힌트를 해킹하려고합니다. 다시 말하지만, 이는 RDBMS의 약점이지만 때로는 수행해야합니다. 그리고 그런 종류의 기능을 DBIC에 추가하는 것이 가능합니다.
Brendan Byrd

8

Interchange6 전자 상거래 플랫폼 (및 기본 스키마 전기 톱)의 핵심 개발자 중 한 사람인 저는 DBIC에 대해 깊이있는 경험을 가지고 있습니다. 다음은 훌륭한 플랫폼을 만드는 몇 가지 사항입니다.

  • 쿼리 생성기를 사용하면 많은 데이터베이스 엔진 (및 각각의 여러 버전)에 대해 한 번 쓸 수 있습니다. 현재 MySQL, PostgreSQL 및 SQLite와의 Interchange6을 지원하며 시간과 리소스를 확보하면 더 많은 엔진에 대한 지원을 추가 할 예정입니다. 현재 전체 프로젝트에는 두 개의 코드 경로 만 있으며 엔진 간의 차이점을 충족시키기 위해 추가 코드가 있으며 이는 특정 데이터베이스 기능이 부족하거나 (SQLite가 부족함) 변경 된 MySQL의 특성 때문입니다. LEAST 함수가 두 부 버전 사이의 NULL을 처리하는 방식.

  • 미리 정의 된 쿼리는 응용 프로그램 코드에서 (args가 있거나없는) 호출 할 수있는 간단한 메서드를 만들 수 있으므로 쿼리를 응용 프로그램 코드를 어지럽히는 대신 스키마 정의 내부에 유지합니다.

  • 컴포저 블 쿼리 생성을 통해 쿼리를 이해하기 쉬운 작은 사전 정의 쿼리로 나눈 다음 함께 연결하여 단일 쿼리로 구성된 경우 DBIC (순수 SQL에서는 더 나빠)에서 장기적으로 유지하기 어려운 복잡한 쿼리를 만들 수 있습니다.

  • Schema :: Loader를 통해 레거시 애플리케이션과 함께 DBIC를 사용하여 새로운 라이프리스와 미래에 대한 더 간단한 경로를 제공 할 수있었습니다.

  • DBIC 플러그인, DeploymentHandler 및 마이그레이션은 모두 내 인생을 더 단순하게 만드는 도구 세트에 엄청나게 추가됩니다.

DBIC과 대부분의 다른 ORM / ORM 유사 플랫폼의 큰 차이점 중 하나는 작업을 수행하는 방식으로 안내하려고 시도하지만 좋아하는 미친 일을 멈추지 않는다는 것입니다.

  • 쿼리에서 함수 이름을 키로 제공하여 DBIC이 알지 못하는 SQL 함수 및 저장 프로 시저를 사용할 수 있습니다 (MySQL에서 LEAST를 사용하려고 할 때 약간의 즐거움을 줄 수 있지만 ^^ DBIC의 결함이 아닙니다) .

  • 'DBIC 방법'이없는 경우 리터럴 SQL을 사용할 수 있으며 반환 된 결과는 여전히 접근자가 포함 된 멋진 클래스로 래핑됩니다.

TL; DR 아마도 몇 개의 테이블로 간단한 애플리케이션을 위해 그것을 사용하지 않을 것입니다. 그러나 더 복잡한 것을 관리해야 할 때, 특히 크로스 엔진 호환성과 장기 유지 관리가 중요한 경우 DBIC는 일반적으로 내가 선호하는 경로입니다.


7

(시작하기 전에 이것이 DBIC, DBI 및 Mojo 기반 DBI 래퍼를 비교한다고 말해야합니다. 다른 Perl ORM에 대한 경험이 없으므로 직접 언급하지 않습니다).

DBIC은 많은 일을 잘 수행합니다. 나는 그것을 많이 사용하지는 않지만 이론을 알고 있습니다. SQL 생성의 훌륭한 작업, 특히 조인 등을 처리하는 등의 작업을 수행합니다. 또한 다른 관련 데이터를 프리 페치 할 수도 있습니다.

내가 볼 때 가장 큰 장점은 결과를 모델 클래스로 직접 사용할 수 있다는 것입니다. 이를 "결과 세트 메소드 추가"라고하며 결과를 얻고 해당 결과에 대해 메소드를 호출 할 수 있습니다. 일반적인 예는 DBIC에서 사용자 오브젝트를 페치 한 후 메소드를 호출하여 비밀번호가 유효한지 확인하는 것입니다.

물론 스키마 배포는 어려울 수 있지만 항상 어렵습니다. DBIC에는 손으로 직접 스키마를 관리하는 것보다 쉽고 더 쉬운 도구가 있습니다 (일부 외부 모듈에 있음).

동전의 반대편에는 모조 향미 DBI 래퍼와 같은 다른 감성에 호소하는 다른 도구가 있습니다. 이들은 희박하면서도 여전히 사용 가능하다는 호소력을 가지고 있습니다. 대부분은 Mojo :: Pg (원본)에서 힌트를 얻었으며 플랫 파일의 스키마 관리 및 pubsub 통합과 같은 편리한 기능을 추가했습니다.

이러한 Mojo 맛 모듈은 DBIC의 또 다른 약점에서 자랐습니다. 즉, 아직 비동기 쿼리를 수행 할 수 없습니다. 필자들은 기술적으로도 가능하지만 빨리 API를 디자인하는 데 문제가 있다고 확신했다. (물론 나는 이것을 도와 달라는 요청을 받았으며, 그렇게 할 때 바늘에 헌신해야 할 때 바늘을 움직이는 방법을 모른다.)

TL; DR은 SQL을 좋아하거나 비동기식이 필요한 경우가 아니면 DBIC을 사용합니다.이 경우 Mojo 플레이버 DBI 랩퍼를 조사하십시오.


6

나는 3 년 전 DBIC vs DBI 에서 이것에 대한 생각을 썼다 . 요약하자면, 나는 두 가지 주요 이유를 나열했습니다.

  1. DBIC은 필자가 작성하는 거의 모든 응용 프로그램에 필요한 모든 사소한 SQL에 대해 생각할 필요가 없음을 의미합니다.
  2. DBIC은 바보 같은 데이터 구조가 아니라 데이터베이스에서 객체를 돌려줍니다. 이것은 모든 표준 OO 장점을 가지고 있음을 의미합니다. 특히 DBIC 객체에 메소드를 추가 할 수 있으면 정말 유용합니다.

안티 패턴에 관해서는, 내가 생각할 수있는 유일한 것은 성능입니다. CPU에서 모든 클럭 사이클을 짜내려면 DBIC이 작업에 적합한 도구가 아닐 수도 있습니다. 그러나 작성하는 응용 프로그램의 경우 이러한 경우가 점점 더 드 rare니다. 데이터베이스와 대화하고 DBIC를 사용하지 않은 새 응용 프로그램을 마지막으로 작성한 시점을 기억할 수 없습니다. 물론 DBIC이 생성 하는 쿼리조정하는 방법에 대해 조금이라도 알고 있으면 도움이 됩니다.


2
허, 충분한 문자를 변경하지 않아서 오타를 수정할 수 없습니다 ( "리그 툴"). 흥미롭게도 절름발이입니다. 그러나 이것은 나를 괴롭히는 일종의 대답입니다. 나는 PerlHacks 게시물에서 Rob이 지적한 한 가지 문제를 언급하지만 다른 것을 고려하지는 않는다고 생각합니다. 많은 경우 사람들이 수동 SQL로 돌아가는 것을 발견했습니다.
brian d foy 10

1

내가 그것을 확장시키는 방법 :

  1. DBI 소켓 생성자와 테스트 메소드를 제공하는 하나의 클래스를 작성하십시오.

  2. 해당 클래스를 SQL 쿼리 클래스 (sql 테이블 당 하나의 클래스)로 파생시키고 생성자 시간에 소켓을 테스트하십시오.

  3. 클래스 범위 변수를 사용하여 테이블 이름 및 기본 인덱스 열 이름을 보유하십시오.

  4. SQL에서 정적으로 정의하는 대신 변수에서 SQL 보간 테이블 이름과 기본 인덱스 열을 모두 작성하십시오.

  5. 편집기 매크로 만 사용하여 sql 문만 입력하는 동안 기본 DBI 메소드 쌍 (준비 및 실행)을 작성할 수 있습니다.

그렇게하면 하루 종일 DBI 위에 깨끗한 API 코드를 비교적 쉽게 작성할 수 있습니다.

찾을 수있는 것은 많은 쿼리가 여러 테이블에서 이식 가능하다는 것입니다. 이 시점에서 EXPORTER 클래스로 잘라 붙여 넣어 필요한 곳에 다시 뿌릴 수 있습니다. 여기에서 테이블 이름과 기본 인덱스 열 이름의 클래스 범위 보간이 시작됩니다.

이 접근 방식을 사용하여 비교적 우수한 성능으로 수백 개의 DBI 방법으로 확장했습니다. DBI 코드를 다른 방법으로 시도하고 유지하고 싶지 않습니다.

DBI 사용시기 : 항상.

나는 그것이 당신의 진짜 질문이라고 생각하지 않습니다. 귀하의 실제 질문은 "이것은 거대한 PITA처럼 보입니다.이 작업을 수행 할 필요가 없다고 말씀해주십시오."

당신은하지 않습니다. 올바르게 배치하면 DBI 부분은 대부분 자동화 할 수있을 정도로 중복됩니다.


공유 할 수있는 오픈 소스 프로젝트가 있거나 각 클래스의 예를 들어 github의 요지가 있습니까? 나는 당신이 말하는 아이디어가 흥미롭고 아마도 많은 사람들의 프로젝트에서 실행 가능할 것이라고 생각하지만, 몇 가지 예를 다루는 것이 조금 더 쉬울 것입니다.
msouth

0

저는 Perl 전문가는 아니지만 많이 사용합니다. 내가 모르거나 더 잘하는 법이 많이 있습니다. 문서화에도 불구하고 아직 이해하지 못하는 것들.

"이 프로젝트는 단순한 프로젝트이므로 ORM의 부풀림이 필요 없으며 설정 및 스키마 모듈로 번거롭고 싶지 않습니다."라고 생각하기 때문에 DBI로 시작하는 경향이 있습니다. 하지만 거의 매 순간마다 저는 그 결정에 대해 저주를 시작합니다. SQL 쿼리 (비교 자리 표시 자뿐만 아니라 동적 쿼리)에서 창의성을 발휘하고 싶을 때 DBI를 사용하여 온 전성을 유지하는 데 어려움을 겪고 있습니다. SQL :: Abstract는 많은 도움이되며 일반적으로 충분합니다. 그러나 내 다음 정신 투쟁은 내 코드 안에 많은 SQL을 유지하는 것입니다. 못생긴 heredocs에 내장 SQL 줄과 줄이 있다는 것은 매우 산만합니다. 품질이 좋은 IDE를 사용해야 할 수도 있습니다.

결국, 나는 여러 번, 나는 똑 바른 DBI를 고수한다. 그러나 나는 더 좋은 방법이 있기를 바랍니다. DBIx :: Class는 정말 깔끔한 특성을 가지고 있으며 몇 번 사용해 보았지만 가장 큰 프로젝트를 제외하고는 너무 과장된 것 같습니다. 분산 관리 SQL을 사용하는 DBI 또는 분산 스키마 모듈을 사용하는 DBIC을 관리하기가 더 번거로운 지조차 확실하지 않습니다.

(아, 제약 및 트리거와 같은 것들이 DBIC에게는 큰 장점입니다.)


4
이 답변은 그 요점을 잘 나타내지 못합니다. DBIx를 사용할 때 문제가 있지만 왜 그런 문제가 있습니까? DBI가 유연하지 않거나 DB와 너무 밀접하게 연결되어 있거나 확장 가능하지 않습니까?
Jay Elston
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.