2

우리는 여러 모듈을 가진 대기업 응용 프로그램의 디자인 초기 단계에 있습니다. 요구 사항 중 하나는 응용 프로그램이 데이터베이스 독립적이어야하며 SQL Server, Oracle, MySQL 및 DB2를 지원해야한다는 것입니다.데이터베이스 독립성

필자가 웹에서 읽었던 데이터베이스 독립성은 매우 나쁜 생각입니다. 유지 관리하기 어려운 코드, 지원되는 모든 DBMS에서 가장 일반적인 기능을 갖춘 데이터베이스 디자인, 나쁜 성능 및 나쁜 확장 성. 내 개인적인 직감은 다른 기능보다이 기능의 복잡성이 기하 급수적으로 개발 비용과 시간을 증가시킬 수 있다는 것입니다. 코드가 무서울 것입니다.

하지만 아무도이 기능을 무시하도록 설득 할 수 없습니다. 문제는이 문제에 대한 대부분의 데이터가 경험적 데이터이며 사례를 뒷받침하는 숫자가 부족하다는 것입니다. 누구든지 문제에 대한 숫자 지원 데이터를 공유 할 수 있다면 고맙겠습니다.

가능한 디자인 옵션 중 하나는 각 DBMS에 대한 공급자가있는 데이터베이스 계층에 Entity 프레임 워크를 사용하는 것입니다. 내 개인적인 느낌은 엔티티 프레임 워크에서 생성 된 SQL에 대한 제어권이 없으므로 ORM을 사용하지 않고 수동으로 SQL 문을 작성하는 것이고 데이터베이스 독립 시나리오는 DBMS를 기반으로하는 일부 SQL 조정이 필요하다는 것입니다. 타사 엔티티 프레임 워크 공급자는 응용 프로그램에 포함될 복잡한 시나리오에만 나타나는 상당한 양의 버그가있을 것이라고 생각합니다. 이전에 데이터베이스 독립적 인 시나리오를 위해 엔티티 프레임 워크를 사용 해본 경험이있는 사람이라면 누구든 환영합니다.

또한 팀에서 논의한 가능성 중 하나는 첫 번째 반복에서 하나의 DBMS (예 : SQL Server)를 지원 한 다음 연속 반복에서 다른 DBMS에 대한 지원을 추가하는 것입니다. 첫 번째 DBMS 코드를 작성하기 전에 모든 데이터베이스의 모든 기능을 알아야하기 때문에 최소한의 공통 기능을 갖춘 데이터베이스 설계가 필요하기 때문에이 개발 전략은 나쁘다고 생각합니다. 나는이 가능성에 대해서도 당신으로부터 듣고 싶습니다.

+3

"어떤 ORM하지 않고 수동으로 SQL 문을 작성하는 것이 다릅니다 것을 캡슐화 : 요약

는 데이터베이스에 독립적 애플리케이션을 설계하는 것은 단순한 교훈의 확장 데이터베이스 독립 시나리오는 약간의 SQL 조정이 필요합니다. " Au contraire, ORM이 당신을 위해 무엇을 할 것인가에 대한 질문입니다. 좋은 ORM은 대상이되는 데이터베이스에 대해 적절한 SQL을 생성 할 것이므로 조정할 필요가 없습니다. 복잡한 질의가있는 경우 필요한 EF 공급자를 사용하여 몇 가지를 테스트하지 않는 것이 어떻습니까? 그들에게 "그냥 잘가는 것보다 시험해보세요. 버그가 생길 것입니다. 오, 그렇습니다. 수공예품의 SQL로 돌아 가세요!" – itowlson

답변

1

나는 ORM과 데이터베이스 독립성의 이점을 제공하는 Hibernate와 함께 작업한다. 데이터베이스 관련 기능은 문제가되지 않으며 일반적으로 내 디자인이 향상됩니다. 모든 것이 (도메인 모델, 비즈니스 로직 및 데이터 액세스 방법) 테스트 가능하기 때문에 개발이 고통스럽지 않습니다.

+0

+1 디자인 개선을 위해 - 진정한 관계형 모델링이 점차 외국 개념이되고있는 것처럼 보입니다. –

0

데이터베이스 독립성은 과대 평가 된 응용 프로그램 기능입니다. 실제로 대규모 비즈니스 애플리케이션을 구축하고 배포 한 후에는 새로운 데이터베이스 플랫폼으로 이전하는 것이 매우 드뭅니다. DBMS 관련 기능과 최적화를 놓칠 수도 있습니다.

그렇다면 데이터베이스 독립성을 포함시키려는 경우 .NET System.Data.Common 네임 스페이스 (DbConnection, DbCommand)에 사용되는 것과 같은 인터페이스 또는 추상 클래스에 대해 모든 데이터베이스 액세스 코드를 작성하는 것이 가장 좋습니다. 등) 또는 NHibernate과 같은 여러 데이터베이스를 지원하는 O/RM 라이브러리를 사용하십시오.

+2

그것은별로 드물지 않습니다. 당신이 당신의 제품 라인을 제공 할 소프트웨어 제품을 개발하고 많은 고객들을 위해 커스터마이징을한다면, 아마도 이것을 필요로 할 것입니다. 우리는 그 중 2 명을 일하고 있습니다. – cherouvim

+2

물론, 제품의 주요 기능 중 하나가 사용자 정의되고 이기종 클라이언트 플랫폼과 통합되는 경우가 드물지 않습니다. 그러나 일반적인 응용 프로그램의 경우 매우 드뭅니다. –

+1

@cherouvim : DBMS 포트를 본 적이 없습니다. 나는 많은 클라이언트 포트를 보았다. 하지만 저는 소프트웨어 회사가 아닌 대기업을 위해 일합니다. – gbn

1

مرحبا, Muhammed!

데이터베이스 독립성이 "양호"도 "불량"도 아닙니다. 디자인 결정입니다. 그것은 절충점입니다. 선택에 대한

하자 토론 :

그것은 이것은 프로그래머의 선택을
코드를 유지하기 어렵게 할 것이다. 코드를 데이터베이스에 독립적으로 만들면 코드와 데이터베이스 사이에 레이어를 사용해야합니다. 가장 좋은 종류의 레이어는 다른 사람이 작성한 레이어입니다.

... 정의, 진실에 의해 지원되는 모든 DBMS를
이것은의 가장 일반적인 기능과 데이터베이스 설계. 다행히도 지원되는 모든 데이터베이스의 일반적인 기능은 상당히 광범위합니다. 그들은 모두 SQL-99 표준을 구현해야합니다.

... 나쁜 성능과 나쁜 확장 성 이것은 사실이 아니어야합니다. 계층은 데이터베이스에 최소한의 비용을 추가해야합니다.

... 이것은 복잡성과 함께 기하 급수적으로 개발 비용과 시간을 늘릴 수있는 가장 많은 기능입니다. 코드가 무서울 것입니다. 코드와 데이터베이스 사이에 레이어를 사용하는 것이 좋습니다.

작성중인 언어 또는 플랫폼을 지정하지 않았습니다. 다행히, 많은 언어는 이미 데이터베이스를 추상화 한 :

행운을 가지고 있음.

+2

나쁜 성능은 최소한의 기능 세트 사용으로 인한 것입니다. 예를 들어 자동 증가 ID는 일부 DBMS에서 지원되지 않으므로 사용할 수 없습니다. 이러한 기능을 많이 무시하면 성능 및 확장 성을 저해 할 수있는 데이터베이스로의 여러 번 이동으로 인해 무시됩니다. –

+0

아, 사실, 모하메드. –

+0

수동으로 작업하는 경우 모든 ID에 대해 데이터베이스를 이동할 필요가 없습니다. 일괄 처리를 할당 할 수 있습니다. 즉, 스레드는 데이터베이스로 이동하고 ID 카운터를 1000으로 증분 한 다음 다시 수행해야하기 전에 사용할 수있는 1000 개의 ID 범위를 갖습니다. 더 많은 일이지만, 그리 어렵지 않습니다.객체가 데이터베이스로 이동할 때가 아니라 객체의 라이프 사이클 초기에 ID를 할당 할 수있는 등의 다른 이점도 있습니다. –

5

Comparison of different SQL implementations을 보았습니까?

이것은 흥미로운 비교입니다. 나는 그것이 합리적이라고 생각합니다. 모든 RDBMS에 관계형 데이터 모델의 기능을 지원하도록 설계되어 있다는 단순한 이유 불가지론 데이터베이스,해야 응용 프로그램에 대한 좋은 관계형 데이터 모델을 설계

.

반면에 모델의 구현은 일반적으로 구현을 지정하는 사람들의 개인적 선호에 영향을받습니다. 모든 사람들은 일을 할 때 자신의 경사가 있습니다. 예를 들어 위의 설명에서 autoincremented identity이라고 말하면됩니다. 구현을위한 이러한 개인적인 선호는 이식성을 제한 할 수있는 장애물입니다.

행간을 읽으면 데이터베이스 독립성에 대한 요구 사항이 위에서 아래로 전달되어 에 대한 지침이이됩니다. 또한이 응용 프로그램은 사내에서 사용하기보다는 판매용으로 사용할 가능성이 높습니다. 문맥 상이 단계에서는 잠재 고객의 데이터베이스 환경 설정을 알 수 없습니다.

을 감안할 때 이러한 요구 사항은 다음 실제적인 질문은 다음과 같습니다

  1. 것이다 챔피언 설계 및 개발에 대한 각각의 특정 데이터베이스를? 데이터베이스 중립적 인 솔루션을 달성하기 위해 이들 각자의 구현을위한 개인적인 선호도를 조정해야하기 때문에 이는 중요합니다. 특정 데이터베이스에 챔피언이 없다면이 데이터베이스에서 애플리케이션을 구현하는 것이 제대로 수행되지 않을 가능성이 있습니다.
  2. 누가 챔피언의 중재자로 활동할 수있는 데이터베이스 경험이 있습니까? 이 사람은 때때로 어려운 결정을 내려야 할 것이지만, 말 타기는 재미의 일부입니다.
  3. 프로그래밍 팀은 개인적으로 좋아하는 모든 기능을 사용하지 않고 생산성을 발휘할 수 있습니까? 저장 프로시 듀어, 트리거 등은 RDBM 사이에서 가장 적게 전송 가능한 기능입니다.

응용 프로그램 자체에는 데이터베이스와 관련없는 디자인 요소/챕터/모듈/간에는 명확한 구별이 필요합니다. 무엇보다도, 이것은 하나의 DBMS를 먼저 구현할 수있게하며, 이후의 각 DBMS를 구현하는 데 필요한 노력이 필요합니다.

데이터베이스를 사용하지 않는 부품에는 모든 DML 또는 ORM이 포함되어야합니다.

데이터베이스 관련 부품은 설치 및 드라이버에 더 많거나 적게 제한되어야합니다.

는 믿거 나 말거나, 바닐라 맛 SQL은 여전히 ​​매우 강력한 프로그래밍 언어이며, 개인적으로 난 당신이하고자하는 경우, 을 데이터베이스 특정 기능이없는 성능이 좋은 응용 프로그램을 만들 수는 없을 것을 찾을 수 있습니다.



+0

소프트웨어를 빌드하는 경우 지속적으로 통합 된 코드베이스에 대한 자동 테스트가 필요합니다. 테스트는 중요한 모든 속성을 테스트해야합니다. 데이터베이스 독립성이 중요하면 테스트해야합니다. CI 빌드는 각 대상 데이터베이스 위에 시스템 수준의 테스트를 실행해야합니다. 이는 잠깐 들어가는 데이터베이스 관련 코드를 신속하게 제거합니다. 이는 나중에 여러 데이터베이스를 도입하는 것이 아니라 처음에 여러 데이터베이스로 시작한다는 것을 의미합니다. 나는 솔직히 후자의 접근 방식이 전혀 작동하지 않는다는 것을 알 수 없다. –